1 /****************************************************************************** 2 * 3 * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by 4 * Analog Devices, Inc.), 5 * Copyright (C) 2023-2024 Analog Devices, Inc. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 ******************************************************************************/ 20 21 #ifndef LIBRARIES_PERIPHDRIVERS_SOURCE_SPIXF_SPIXF_REVA_H_ 22 #define LIBRARIES_PERIPHDRIVERS_SOURCE_SPIXF_SPIXF_REVA_H_ 23 24 /****** Includes *******/ 25 #include "mxc_device.h" 26 #include "mxc_sys.h" 27 #include "spixf.h" 28 #include "spixfc_reva_regs.h" 29 #include "spixfm_reva_regs.h" 30 #include "spixfc_fifo_reva_regs.h" 31 32 /* **** Definitions **** */ 33 /** 34 * @brief Active levels for slave select lines. 35 */ 36 typedef enum { 37 MXC_SPIXF_REVA_SSEL0_HIGH = (0x1 << 0), 38 MXC_SPIXF_REVA_SSEL0_LOW = 0, 39 MXC_SPIXF_REVA_SSEL1_HIGH = (0x1 << 1), 40 MXC_SPIXF_REVA_SSEL1_LOW = 0, 41 MXC_SPIXF_REVA_SSEL2_HIGH = (0x1 << 2), 42 MXC_SPIXF_REVA_SSEL2_LOW = 0, 43 MXC_SPIXF_REVA_SSEL3_HIGH = (0x1 << 3), 44 MXC_SPIXF_REVA_SSEL3_LOW = 0 45 } mxc_spixf_reva_ssel_t; 46 47 /** 48 * @brief Header direction. 49 */ 50 typedef enum { 51 MXC_SPIXF_REVA_HEADER_DIR_NONE, 52 MXC_SPIXF_REVA_HEADER_DIR_TX, 53 MXC_SPIXF_REVA_HEADER_DIR_RX, 54 MXC_SPIXF_REVA_HEADER_DIR_BOTH, 55 } mxc_spixf_reva_hdr_direction_t; 56 57 /** 58 * @brief SPIXF Pin mode. 59 */ 60 typedef enum { 61 MXC_SPIXF_REVA_ACTIVE_LOW, 62 MXC_SPIXF_REVA_ACTIVE_HIGH, 63 } mxc_spixf_reva_sspol_t; 64 65 /** 66 * @brief SPIXF set command. 67 */ 68 typedef enum { 69 MXC_SPIXF_REVA_CMD_EVERY_TRANS, 70 MXC_SPIXF_REVA_CMD_FIRST_TRANS, 71 } mxc_spixf_reva_cmd_t; 72 73 /** 74 * @brief SPIXF mode. 75 * @note modes 1 and 2 are not supported 76 */ 77 typedef enum { 78 MXC_SPIXF_REVA_MODE_0 = 0, 79 MXC_SPIXF_REVA_MODE_3 = 3, 80 } mxc_spixf_reva_mode_t; 81 82 /** 83 * @brief Select page size. 84 */ 85 typedef enum { 86 MXC_SPIXF_REVA_4B, 87 MXC_SPIXF_REVA_8B, 88 MXC_SPIXF_REVA_16B, 89 MXC_SPIXF_REVA_32B, 90 } mxc_spixf_reva_age_size_t; 91 92 /** 93 * @brief Header units. 94 */ 95 typedef enum { 96 MXC_SPIXF_REVA_HEADER_UNITS_BITS, 97 MXC_SPIXF_REVA_HEADER_UNITS_BYTES, 98 MXC_SPIXF_REVA_HEADER_UNITS_PAGES, 99 } mxc_spixf_reva_hdr_units_t; 100 101 /** 102 * @brief Number of data lines to use. 103 */ 104 typedef enum { 105 MXC_SPIXF_REVA_WIDTH_1, ///< 1 Data Line. 106 MXC_SPIXF_REVA_WIDTH_2, ///< 2 Data Lines(x2). 107 MXC_SPIXF_REVA_WIDTH_4, ///< 4 Data Lines(x4). 108 } mxc_spixf_reva_width_t; 109 110 /** 111 * @brief MXC_SPIXF configuration type. 112 */ 113 typedef struct { 114 mxc_spixf_reva_mode_t mode; ///< MXC_SPIXF mode to use, 0-3. 115 mxc_spixf_reva_sspol_t 116 ssel_pol; ///< Mask of active levels for slave select signals, use mxc_spixf_ssel_t. 117 uint32_t hz; ///< SPI Frequency in Hz. 118 } mxc_spixf_reva_cfg_t; 119 120 /** 121 * @brief Slave select active timing 122 */ 123 typedef enum { 124 MXC_SPIXF_REVA_SYS_CLOCKS_0, 125 MXC_SPIXF_REVA_SYS_CLOCKS_2, 126 MXC_SPIXF_REVA_SYS_CLOCKS_4, 127 MXC_SPIXF_REVA_SYS_CLOCKS_8, 128 } mxc_spixf_reva_ssact_t; 129 130 /** 131 * @brief Slave select Inactive timing 132 */ 133 typedef enum { 134 MXC_SPIXF_REVA_SYS_CLOCKS_1, ///< 1 system clocks 135 MXC_SPIXF_REVA_SYS_CLOCKS_3, ///< 3 system clocks 136 MXC_SPIXF_REVA_SYS_CLOCKS_5, ///< 5 system clocks 137 MXC_SPIXF_REVA_SYS_CLOCKS_9, ///< 9 system clocks 138 } mxc_spixf_reva_ssiact_t; 139 140 /** 141 * @brief Data Width, # of data I/O used to rcv data 142 */ 143 typedef enum { 144 MXC_SPIXF_REVA_SINGLE_SDIO, 145 MXC_SPIXF_REVA_DUAL_SDIO, 146 MXC_SPIXF_REVA_QUAD_SDIO, 147 MXC_SPIXF_REVA_INVALID, 148 } mxc_spixf_reva_spiwidth_t; 149 150 /** 151 * @brief IO pullup/pulldown Control 152 */ 153 typedef enum { 154 MXC_SPIXF_REVA_TRISTATE = MXC_S_SPIXFM_REVA_IO_CTRL_PU_PD_CTRL_TRI_STATE, 155 MXC_SPIXF_REVA_PULL_UP = MXC_S_SPIXFM_REVA_IO_CTRL_PU_PD_CTRL_PULL_UP, 156 MXC_SPIXF_REVA_PULL_DOWN = MXC_S_SPIXFM_REVA_IO_CTRL_PU_PD_CTRL_PULL_DOWN, 157 } mxc_spixf_reva_pup_t; 158 159 /** 160 * @brief SPIXF drive strentgh 161 * 162 */ 163 typedef enum { MXC_SPIXF_REVA_LOW = 0, MXC_SPIXF_REVA_HIGH } mxc_spixf_reva_ds_t; 164 165 /** 166 * @brief MXC_SPIXF Transaction request. 167 */ 168 typedef struct mxc_spixf_reva_req mxc_spixf_reva_req_t; 169 170 struct mxc_spixf_reva_req { 171 uint8_t deass; ///< De-assert slave select at the end of the transaction. 172 uint8_t wait_tx; ///< Wait for the TX FIFO to be empty before returning. 173 const uint8_t *tx_data; ///< TX buffer. 174 uint8_t *rx_data; ///< RX buffer. 175 mxc_spixf_reva_width_t width; ///< Number of data lines to use 176 unsigned len; ///< Number of bytes to send. 177 unsigned read_num; ///< Number of bytes read. 178 unsigned write_num; ///< Number of bytes written. 179 spixr_complete_cb_t callback; ///< callback function 180 }; 181 182 typedef mxc_spixf_pup_t mxc_spixf_padctrl_t; 183 184 /***** Function Prototypes *****/ 185 int MXC_SPIXF_RevA_Init(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm, 186 uint32_t cmdval, uint32_t frequency); 187 void MXC_SPIXF_RevA_Shutdown(mxc_spixfc_reva_regs_t *spixfc); 188 void MXC_SPIXF_RevA_IOCtrl(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_ds_t sclk_ds, 189 mxc_spixf_ds_t ss_ds, mxc_spixf_ds_t sdio_ds, 190 mxc_spixf_padctrl_t padctrl); 191 int MXC_SPIXF_RevA_Clocks(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm, 192 mxc_spixfc_fifo_reva_regs_t *spixfc_fifo, uint32_t len, uint8_t deass); 193 int MXC_SPIXF_RevA_Transaction(mxc_spixfc_reva_regs_t *spixfc, 194 mxc_spixfc_fifo_reva_regs_t *spixfc_fifo, mxc_spixf_req_t *req); 195 int MXC_SPIXF_RevA_TransactionAsync(mxc_spixfc_reva_regs_t *spixfc, 196 mxc_spixfc_fifo_reva_regs_t *spixfc_fifo, mxc_spixf_req_t *req); 197 int MXC_SPIXF_RevA_AbortAsync(mxc_spixfc_reva_regs_t *spixfc, mxc_spixf_req_t *req); 198 void MXC_SPIXF_RevA_Handler(mxc_spixfc_reva_regs_t *spixfc, 199 mxc_spixfc_fifo_reva_regs_t *spixfc_fifo); 200 int MXC_SPIXF_RevA_ReadyForSleep(mxc_spixfc_reva_regs_t *spixfc); 201 int MXC_SPIXF_RevA_EnableInt(mxc_spixfc_reva_regs_t *spixfc, uint32_t mask); 202 int MXC_SPIXF_RevA_DisableInt(mxc_spixfc_reva_regs_t *spixfc, uint32_t mask); 203 int MXC_SPIXF_RevA_ClearFlags(mxc_spixfc_reva_regs_t *spixfc, uint32_t flags); 204 int MXC_SPIXF_RevA_GetFlags(mxc_spixfc_reva_regs_t *spixfc); 205 206 //Low level 207 int MXC_SPIXF_RevA_SetMode(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm, 208 mxc_spixf_mode_t mode); 209 mxc_spixf_mode_t MXC_SPIXF_RevA_GetMode(mxc_spixfc_reva_regs_t *spixfc); 210 int MXC_SPIXF_RevA_SetSSPolActiveHigh(mxc_spixfc_reva_regs_t *spixfc, 211 mxc_spixfm_reva_regs_t *spixfm); 212 int MXC_SPIXF_RevA_SetSSPolActiveLow(mxc_spixfc_reva_regs_t *spixfc, 213 mxc_spixfm_reva_regs_t *spixfm); 214 int MXC_SPIXF_RevA_GetSSPolarity(mxc_spixfc_reva_regs_t *spixfc); 215 int MXC_SPIXF_RevA_SetSPIFrequency(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm, 216 unsigned int hz); 217 uint32_t MXC_SPIXF_RevA_GetSPIFrequency(mxc_spixfm_reva_regs_t *spixfm); 218 uint32_t MXC_SPIXF_RevA_GetSPIFrequencyWrite(mxc_spixfc_reva_regs_t *spixfc); 219 int MXC_SPIXF_RevA_SetSSActiveTime(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm, 220 mxc_spixf_ssact_t ssact); 221 mxc_spixf_ssact_t MXC_SPIXF_RevA_GetSSActiveTime(mxc_spixfc_reva_regs_t *spixfc); 222 int MXC_SPIXF_RevA_SetSSInactiveTime(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm, 223 mxc_spixf_ssiact_t ssiact); 224 mxc_spixf_ssiact_t MXC_SPIXF_RevA_GetSSInactiveTime(mxc_spixfc_reva_regs_t *spixfc); 225 int MXC_SPIXF_RevA_SetCmdWidth(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_spiwidth_t width); 226 mxc_spixf_spiwidth_t MXC_SPIXF_RevA_GetCmdWidth(mxc_spixfm_reva_regs_t *spixfm); 227 int MXC_SPIXF_RevA_SetAddrWidth(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_spiwidth_t width); 228 mxc_spixf_spiwidth_t MXC_SPIXF_RevA_GetAddrWidth(mxc_spixfm_reva_regs_t *spixfm); 229 int MXC_SPIXF_RevA_SetDataWidth(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_spiwidth_t width); 230 mxc_spixf_spiwidth_t MXC_SPIXF_RevA_GetDataWidth(mxc_spixfm_reva_regs_t *spixfm); 231 int MXC_SPIXF_RevA_Set4ByteAddr(mxc_spixfm_reva_regs_t *spixfm); 232 int MXC_SPIXF_RevA_Set3ByteAddr(mxc_spixfm_reva_regs_t *spixfm); 233 unsigned int MXC_SPIXF_RevA_GetBytesPerAddr(mxc_spixfm_reva_regs_t *spixfm); 234 int MXC_SPIXF_RevA_SetModeClk(mxc_spixfm_reva_regs_t *spixfm, uint8_t mdclk); 235 uint8_t MXC_SPIXF_RevA_GetModeClk(mxc_spixfm_reva_regs_t *spixfm); 236 int MXC_SPIXF_RevA_SetCmdModeEveryTrans(mxc_spixfm_reva_regs_t *spixfm); 237 int MXC_SPIXF_RevA_SetCmdModeFirstTrans(mxc_spixfm_reva_regs_t *spixfm); 238 mxc_spixf_cmd_t MXC_SPIXF_RevA_GetCmdMode(mxc_spixfm_reva_regs_t *spixfm); 239 int MXC_SPIXF_RevA_BBDataOutputEnable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask); 240 int MXC_SPIXF_RevA_BBDataOutputDisable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask); 241 uint8_t MXC_SPIXF_RevA_BBDataOutputIsEnabled(mxc_spixfc_reva_regs_t *spixfc); 242 uint8_t MXC_SPIXF_RevA_GetBBDataOutputValue(mxc_spixfc_reva_regs_t *spixfc); 243 uint8_t MXC_SPIXF_RevA_GetBBDataInputValue(mxc_spixfc_reva_regs_t *spixfc); 244 int MXC_SPIXF_RevA_SetModeData(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm, 245 uint16_t data); 246 uint16_t MXC_SPIXF_RevA_GetModeData(mxc_spixfm_reva_regs_t *spixfm); 247 int MXC_SPIXF_RevA_SetSCKInverted(mxc_spixfc_reva_regs_t *spixfc, mxc_spixfm_reva_regs_t *spixfm); 248 int MXC_SPIXF_RevA_SetSCKNonInverted(mxc_spixfc_reva_regs_t *spixfc, 249 mxc_spixfm_reva_regs_t *spixfm); 250 int MXC_SPIXF_RevA_GetSCKInverted(mxc_spixfm_reva_regs_t *spixfm); 251 int MXC_SPIXF_RevA_SCKFeedbackEnable(mxc_spixfc_reva_regs_t *spixfc, 252 mxc_spixfm_reva_regs_t *spixfm); 253 int MXC_SPIXF_RevA_SCKFeedbackDisable(mxc_spixfc_reva_regs_t *spixfc, 254 mxc_spixfm_reva_regs_t *spixfm); 255 int MXC_SPIXF_RevA_SCKFeedbackIsEnabled(mxc_spixfm_reva_regs_t *spixfm); 256 int MXC_SPIXF_RevA_SetSCKSampleDelay(mxc_spixfc_reva_regs_t *spixfc, uint8_t delay); 257 uint8_t MXC_SPIXF_RevA_GetSCKSampleDelay(mxc_spixfc_reva_regs_t *spixfc); 258 int MXC_SPIXF_RevA_SetCmdValue(mxc_spixfm_reva_regs_t *spixfm, uint8_t cmdval); 259 uint8_t MXC_SPIXF_RevA_GetCmdValue(mxc_spixfm_reva_regs_t *spixfm); 260 void MXC_SPIXF_RevA_SetPageSize(mxc_spixfc_reva_regs_t *spixfc, mxc_spixf_page_size_t size); 261 mxc_spixf_page_size_t MXC_SPIXF_RevA_GetPageSize(mxc_spixfc_reva_regs_t *spixfc); 262 int MXC_SPIXF_RevA_SimpleRXEnabled(mxc_spixfc_reva_regs_t *spixfc); 263 int MXC_SPIXF_RevA_SimpleRXDisable(mxc_spixfc_reva_regs_t *spixfc); 264 int MXC_SPIXF_RevA_SimpleRXIsEnabled(mxc_spixfc_reva_regs_t *spixfc); 265 int MXC_SPIXF_RevA_SimpleModeEnable(mxc_spixfc_reva_regs_t *spixfc); 266 int MXC_SPIXF_RevA_SimpleModeDisable(mxc_spixfc_reva_regs_t *spixfc); 267 int MXC_SPIXF_RevA_SimpleModeIsEnabled(mxc_spixfc_reva_regs_t *spixfc); 268 int MXC_SPIXF_RevA_SampleOutputEnable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask); 269 int MXC_SPIXF_RevA_SampleOutputDisable(mxc_spixfc_reva_regs_t *spixfc, uint8_t mask); 270 uint8_t MXC_SPIXF_RevA_SampleOutputIsEnabled(mxc_spixfc_reva_regs_t *spixfc); 271 uint8_t MXC_SPIXF_RevA_GetSampleOutputValue(mxc_spixfc_reva_regs_t *spixfc); 272 void MXC_SPIXF_RevA_SetIoctrlSDIODriveHigh(mxc_spixfm_reva_regs_t *spixfm); 273 void MXC_SPIXF_RevA_SetIoctrlSDIODriveLow(mxc_spixfm_reva_regs_t *spixfm); 274 uint8_t MXC_SPIXF_RevA_GetIoctrlSDIODrive(mxc_spixfm_reva_regs_t *spixfm); 275 void MXC_SPIXF_RevA_SetIoctrlSCLKDriveHigh(mxc_spixfm_reva_regs_t *spixfm); 276 void MXC_SPIXF_RevA_SetIoctrlSCLKDriveLow(mxc_spixfm_reva_regs_t *spixfm); 277 uint8_t MXC_SPIXF_RevA_GetIoctrlSCLKDrive(mxc_spixfm_reva_regs_t *spixfm); 278 void MXC_SPIXF_RevA_SetIoctrlSSDriveHigh(mxc_spixfm_reva_regs_t *spixfm); 279 void MXC_SPIXF_RevA_SetIoctrlSSDriveLow(mxc_spixfm_reva_regs_t *spixfm); 280 uint8_t MXC_SPIXF_RevA_GetIoctrlSSDrive(mxc_spixfm_reva_regs_t *spixfm); 281 void MXC_SPIXF_RevA_SetPuPdCtrl( 282 mxc_spixfm_reva_regs_t *spixfm, 283 mxc_spixf_padctrl_t pad); // Legacy Name. Will start using SetPadCtrl going forward. 1-23-2023 284 uint8_t MXC_SPIXF_RevA_GetPuPdCtrl( 285 mxc_spixfm_reva_regs_t 286 *spixfm); // Legacy Name. Will start using GetPadCtrl going forward. 1-23-2023 287 void MXC_SPIXF_RevA_SetPadCtrl(mxc_spixfm_reva_regs_t *spixfm, mxc_spixf_padctrl_t pad); 288 uint8_t MXC_SPIXF_RevA_GetPadCtrl(mxc_spixfm_reva_regs_t *spixfm); 289 void MXC_SPIXF_RevA_SetSCKDriveHigh(mxc_spixfc_reva_regs_t *spixfc); 290 void MXC_SPIXF_RevA_SetSCKDriveLow(mxc_spixfc_reva_regs_t *spixfc); 291 uint8_t MXC_SPIXF_RevA_GetSCKDrive(mxc_spixfc_reva_regs_t *spixfc); 292 void MXC_SPIXF_RevA_SetSSDriveOutputHigh(mxc_spixfc_reva_regs_t *spixfc); 293 void MXC_SPIXF_RevA_SetSSDriveOutputLow(mxc_spixfc_reva_regs_t *spixfc); 294 uint8_t MXC_SPIXF_RevA_GetSSDriveOutput(mxc_spixfc_reva_regs_t *spixfc); 295 int MXC_SPIXF_RevA_BitBangModeEnable(mxc_spixfc_reva_regs_t *spixfc); 296 int MXC_SPIXF_RevA_BitBangModeDisable(mxc_spixfc_reva_regs_t *spixfc); 297 int MXC_SPIXF_RevA_BitBangModeIsEnabled(mxc_spixfc_reva_regs_t *spixfc); 298 int MXC_SPIXF_RevA_RXFIFOEnable(mxc_spixfc_reva_regs_t *spixfc); 299 int MXC_SPIXF_RevA_RXFIFODisable(mxc_spixfc_reva_regs_t *spixfc); 300 int MXC_SPIXF_RevA_RXFIFOIsEnabled(mxc_spixfc_reva_regs_t *spixfc); 301 int MXC_SPIXF_RevA_TXFIFOEnable(mxc_spixfc_reva_regs_t *spixfc); 302 int MXC_SPIXF_RevA_TXFIFODisable(mxc_spixfc_reva_regs_t *spixfc); 303 int MXC_SPIXF_RevA_TXFIFOIsEnabled(mxc_spixfc_reva_regs_t *spixfc); 304 int MXC_SPIXF_RevA_Enable(mxc_spixfc_reva_regs_t *spixfc); 305 int MXC_SPIXF_RevA_Disable(mxc_spixfc_reva_regs_t *spixfc); 306 int MXC_SPIXF_RevA_IsEnabled(mxc_spixfc_reva_regs_t *spixfc); 307 int MXC_SPIXF_RevA_SetBusIdle(mxc_spixfm_reva_regs_t *spixfm, unsigned int busidle); 308 unsigned int MXC_SPIXF_RevA_GetBusIdle(mxc_spixfm_reva_regs_t *spixfm); 309 310 #endif // LIBRARIES_PERIPHDRIVERS_SOURCE_SPIXF_SPIXF_REVA_H_ 311