1 /* 2 * Copyright 2021 NXP 3 * All rights reserved. 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 */ 7 8 #ifndef _FSL_SDIOSLV_SDU_H_ 9 #define _FSL_SDIOSLV_SDU_H_ 10 11 #include "fsl_common.h" 12 #include "cis_table.h" 13 14 /*! 15 * @addtogroup sdioslv_sdu_driver 16 * @{ 17 */ 18 19 /******************************************************************************* 20 * Definitions 21 ******************************************************************************/ 22 23 #define SDU_INT_CPU_NUM kSDIOSLV_INT_CPUNum3 24 #define SDU_USED_FUN_NUM 1U 25 #define SDU_USED_PORT_NUM 32U 26 27 /*! @brief Maximum functions supported by SDU */ 28 #define SDU_MAX_FUNCTION_NUM 7U 29 30 /*! @brief Maximum data ports supported by SDU per function */ 31 #define SDU_MAX_PORT_NUM (32U) 32 33 #define sdu_fbr_fnN_base(FN) (SDU_FN0_CARD_BASE + 0x10U + (0x10U * (FN))) 34 #define sdu_fbr_fnN_fn_code(FN) (sdu_fbr_fnN_base(FN) + 0x0U) 35 36 #define sdu_fbr_fnN_fn_code_code_HI 3U 37 #define sdu_fbr_fnN_fn_code_code_LO 0U 38 39 40 /*! @brief MACRO used to access register of SDU */ 41 #define SDU_REGS8(x) (*((volatile uint8_t *)x)) 42 /*! @brief MACRO used to read SDU register */ 43 #define SDU_READ_REGS8(reg, val) ((val) = SDU_REGS8(reg)) 44 /*! @brief MACRO used to write SDU register */ 45 #define SDU_WRITE_REGS8(reg, val) (SDU_REGS8(reg) = (val)) 46 /*! @brief MACRO used to set bits of SDU register */ 47 #define SDU_REGS8_SETBITS(reg, val) (SDU_REGS8(reg) |= (uint8_t)(val)) 48 /*! @brief MACRO used to clear bits of SDU register */ 49 #define SDU_REGS8_CLRBITS(reg, val) (SDU_REGS8(reg) = (uint8_t)(SDU_REGS8(reg) & ~(val))) 50 51 /*! @brief Address of scratch register (group 2, offset 0) within function */ 52 #define SDU_SCRATCH2_OFFSET0_ADDR 0xE8U 53 54 /*! @brief SDU SDIO configuration base (SDU_FN0_CARD_BASE defined in device) */ 55 #define SDU_SDIO_CFG_BASE SDU_FN0_CARD_BASE 56 57 /*! @brief Address offset of CCR between two functions */ 58 #define SDIO_CCR_FUNC_OFFSET 0x00000100U 59 60 /*! @brief SDIO I/O Enable */ 61 #define SDIO_IO_ENABLE (SDU_SDIO_CFG_BASE + 0x02U) 62 63 /*! @brief SDIO Bus Speed Select */ 64 #define SDIO_FUNC0_BSS (SDU_SDIO_CFG_BASE + 0x13U) 65 #define SDIO_FUNC0_BSS_SUPPORT_MASK 0x1U 66 #define SDIO_FUNC0_BSS_MODE_BIT 0x1U 67 #define SDIO_FUNC0_BSS_MODE_MASK 0xEU 68 69 /*! @brief Interrupt mask register for function 0 */ 70 #define SDIO_CCR_FUNC0_CARD_INT_MSK (SDU_SDIO_CFG_BASE + 0x91U) 71 72 /*! @brief Bit Def. Host Transfer Status (HostTransferStatus) */ 73 #define SDIO_CCR_HOST_DnLdReStart (1U << 0U) 74 #define SDIO_CCR_HOST_UpLdReStart (1U << 1U) 75 #define SDIO_CCR_HOST_DnLdCRC_err (1U << 2U) 76 77 /*! @brief Bit Def. Card To Host Interrupt Event (CardToHostEvent) */ 78 #define SDIO_CCR_CS_DnLdRdy (1U << 0U) 79 #define SDIO_CCR_CS_UpLdRdy (1U << 1U) 80 #define SDIO_CCR_CS_ReadCISRdy (1U << 2U) 81 #define SDIO_CCR_CS_CmdUpLdRdy (1U << 6U) 82 #define SDIO_CCR_CS_CmdDnLdRdy (1U << 7U) 83 84 /*! @brief Bit Def. Card Interrupt Mask (CardIntMask) */ 85 #define SDIO_CCR_CIM_DnLdOvr (1U << 0U) 86 #define SDIO_CCR_CIM_UpLdOvr (1U << 1U) 87 #define SDIO_CCR_CIM_Abort (1U << 2U) 88 #define SDIO_CCR_CIM_PwrDn (1U << 3U) 89 #define SDIO_CCR_CIM_PwrUp (1U << 4U) 90 #define SDIO_CCR_CIM_CmdUpLdOvr (1U << 10U) 91 #define SDIO_CCR_CIM_CmdDnLdOvr (1U << 11U) 92 93 #define SDIO_CCR_CIM_MASK 0x0C07U 94 95 /*! @brief Bit Def. Card Interrupt Status (CardIntStatus) */ 96 #define SDIO_CCR_CIC_DnLdOvr ((uint32_t)1U << 0U) 97 #define SDIO_CCR_CIC_UpLdOvr ((uint32_t)1U << 1U) 98 #define SDIO_CCR_CIC_Abort ((uint32_t)1U << 2U) 99 #define SDIO_CCR_CIC_PwrDn ((uint32_t)1U << 3U) 100 #define SDIO_CCR_CIC_PwrUp ((uint32_t)1U << 4U) 101 #define SDIO_CCR_CIC_CmdUpLdOvr ((uint32_t)1U << 10U) 102 #define SDIO_CCR_CIC_CmdDnLdOvr ((uint32_t)1U << 11U) 103 #define SDIO_CCR_CIC_ALL \ 104 (SDIO_CCR_CIC_DnLdOvr | SDIO_CCR_CIC_UpLdOvr | SDIO_CCR_CIC_CmdUpLdOvr | SDIO_CCR_CIC_CmdDnLdOvr) 105 106 #define SDIO_CCR_CIC_MASK 0x0C1FU 107 108 /*! @brief Bit Def. Default setting ISR bit clear after read (CardIntMode) */ 109 #define CARD_INT_MODE_MSK 0x00000C03U 110 111 /*! @brief Bit Def. Command port configuration register (CmdPortConfig) */ 112 #define CMD_TX_LEN_BIT_OFFSET (0U) 113 #define CMD_RD_LEN_BIT_OFFSET (2U) 114 115 /*! @brief Bit Def. Config2 register (Config2) */ 116 #define CONFIG2_ASYNC_INT (1U << 3U) 117 #define CONFIG2_CMD53_NEW_MODE (1U << 8U) 118 #define CONFIG2_DNLD_RDY_AUTO_RESET (1U << 10U) 119 #define CONFIG2_UPLD_RDY_AUTO_RESET (1U << 11U) 120 #define CONFIG2_TX_LEN_BIT_OFFSET (12U) 121 #define CONFIG2_RD_LEN_BIT_OFFSET (14U) 122 123 #define CONFIG2_DEFAULT_SETTING \ 124 (CONFIG2_ASYNC_INT | CONFIG2_CMD53_NEW_MODE | CONFIG2_DNLD_RDY_AUTO_RESET | CONFIG2_UPLD_RDY_AUTO_RESET) 125 126 127 /*! @name Driver version */ 128 /*@{*/ 129 /*! @brief Driver version 1.0.0. */ 130 #define FSL_SDIOSLV_SDU_DRIVER_VERSION (MAKE_VERSION(1U, 0U, 0U)) 131 /*@}*/ 132 133 /*! @brief SDIO status */ 134 enum _sdioslv_status 135 { 136 kStatus_SDIOSLV_CmdPending = MAKE_STATUS(kStatusGroup_SDIOSLV, 0U), /*!< previous command is under working. */ 137 kStatus_SDIOSLV_SendFull = MAKE_STATUS(kStatusGroup_SDIOSLV, 1U), /*!< all data slots are occupied. */ 138 kStatus_SDIOSLV_FuncEnabled = MAKE_STATUS(kStatusGroup_SDIOSLV, 2U), /*!< function enabled */ 139 kStatus_SDIOSLV_FuncDisabled = MAKE_STATUS(kStatusGroup_SDIOSLV, 3U), /*!< function disabled */ 140 kStatus_SDIOSLV_FuncSuspended = MAKE_STATUS(kStatusGroup_SDIOSLV, 4U), /*!< function suspended */ 141 kStatus_SDIOSLV_FuncResumed = MAKE_STATUS(kStatusGroup_SDIOSLV, 5U), /*!< function resumed */ 142 kStatus_SDIOSLV_FuncSendComplete = MAKE_STATUS(kStatusGroup_SDIOSLV, 6U), /*!< function send complete */ 143 kStatus_SDIOSLV_FuncReadComplete = MAKE_STATUS(kStatusGroup_SDIOSLV, 7U), /*!< function read complete */ 144 kStatus_SDIOSLV_FuncRequestBuffer = MAKE_STATUS(kStatusGroup_SDIOSLV, 8U), /*!< function request read buffer */ 145 }; 146 147 /*! @brief SDIO card function number */ 148 typedef enum _sdioslv_int_cpu_num 149 { 150 kSDIOSLV_INT_CPUNum1 = 1U, /*!< sdio interrupt to CPU1 */ 151 kSDIOSLV_INT_CPUNum2 = 2U, /*!< sdio interrupt to CPU2 */ 152 kSDIOSLV_INT_CPUNum3 = 4U, /*!< sdio interrupt to CPU3 */ 153 } sdioslv_int_cpu_num_t; 154 155 /*! @brief SDIO card function number */ 156 typedef enum _sdioslv_func_num 157 { 158 kSDIOSLV_FunctionNum1 = 1U, /*!< sdio function1 */ 159 kSDIOSLV_FunctionNum2 = 2U, /*!< sdio function2 */ 160 kSDIOSLV_FunctionNum3 = 3U, /*!< sdio function3 */ 161 kSDIOSLV_FunctionNum4 = 4U, /*!< sdio function4 */ 162 kSDIOSLV_FunctionNum5 = 5U, /*!< sdio function5 */ 163 kSDIOSLV_FunctionNum6 = 6U, /*!< sdio function6 */ 164 kSDIOSLV_FunctionNum7 = 7U, /*!< sdio function7 */ 165 } sdioslv_func_t; 166 167 /*! @brief SDIO port number (per function) */ 168 typedef enum _sdioslv_port_num 169 { 170 kSDIOSLV_DataPortNum0 = 0U, /*!< sdio dataport0 */ 171 kSDIOSLV_DataPortNum1 = 1U, /*!< sdio dataport1 */ 172 kSDIOSLV_DataPortNum2 = 2U, /*!< sdio dataport2 */ 173 kSDIOSLV_DataPortNum3 = 3U, /*!< sdio dataport3 */ 174 kSDIOSLV_DataPortNum4 = 4U, /*!< sdio dataport4 */ 175 kSDIOSLV_DataPortNum5 = 5U, /*!< sdio dataport5 */ 176 kSDIOSLV_DataPortNum6 = 6U, /*!< sdio dataport6 */ 177 kSDIOSLV_DataPortNum7 = 7U, /*!< sdio dataport7 */ 178 kSDIOSLV_DataPortNum8 = 8U, /*!< sdio dataport8 */ 179 kSDIOSLV_DataPortNum9 = 9U, /*!< sdio dataport9 */ 180 kSDIOSLV_DataPortNum10 = 10U, /*!< sdio dataport10 */ 181 kSDIOSLV_DataPortNum11 = 11U, /*!< sdio dataport11 */ 182 kSDIOSLV_DataPortNum12 = 12U, /*!< sdio dataport12 */ 183 kSDIOSLV_DataPortNum13 = 13U, /*!< sdio dataport13 */ 184 kSDIOSLV_DataPortNum14 = 14U, /*!< sdio dataport14 */ 185 kSDIOSLV_DataPortNum15 = 15U, /*!< sdio dataport15 */ 186 kSDIOSLV_DataPortNum16 = 16U, /*!< sdio dataport16 */ 187 kSDIOSLV_DataPortNum17 = 17U, /*!< sdio dataport17 */ 188 kSDIOSLV_DataPortNum18 = 18U, /*!< sdio dataport18 */ 189 kSDIOSLV_DataPortNum19 = 19U, /*!< sdio dataport19 */ 190 kSDIOSLV_DataPortNum20 = 20U, /*!< sdio dataport20 */ 191 kSDIOSLV_DataPortNum21 = 21U, /*!< sdio dataport21 */ 192 kSDIOSLV_DataPortNum22 = 22U, /*!< sdio dataport22 */ 193 kSDIOSLV_DataPortNum23 = 23U, /*!< sdio dataport23 */ 194 kSDIOSLV_DataPortNum24 = 24U, /*!< sdio dataport24 */ 195 kSDIOSLV_DataPortNum25 = 25U, /*!< sdio dataport25 */ 196 kSDIOSLV_DataPortNum26 = 26U, /*!< sdio dataport26 */ 197 kSDIOSLV_DataPortNum27 = 27U, /*!< sdio dataport27 */ 198 kSDIOSLV_DataPortNum28 = 28U, /*!< sdio dataport28 */ 199 kSDIOSLV_DataPortNum29 = 29U, /*!< sdio dataport29 */ 200 kSDIOSLV_DataPortNum30 = 30U, /*!< sdio dataport30 */ 201 kSDIOSLV_DataPortNum31 = 31U, /*!< sdio dataport31 */ 202 kSDIOSLV_CmdPortNum0 = 32U, /*!< sdio cmdport0 */ 203 } sdioslv_port_t; 204 205 /*! @brief SDIO Bus Speed */ 206 typedef enum _sdioslv_bus_speed 207 { 208 kSDIOSLV_SDR12_MODE = 0U, /*!< SDR12 mode => 25Mhz */ 209 kSDIOSLV_SDR25_MODE = 1U, /*!< SDR25 mode => 50Mhz */ 210 kSDIOSLV_SDR50_MODE = 2U, /*!< SDR50 mode => 100Mhz */ 211 kSDIOSLV_SDR104_MODE = 3U, /*!< SDR104 mode => 208Mhz */ 212 } sdioslv_bus_speed_t; 213 214 /*! @brief Scratch register group */ 215 typedef enum _sdioslv_scratch_group 216 { 217 kSDIOSLV_ScratchGroup0 = 0U, /*!< sdio scratch1 in FW18 0xnD4 n:1..7 16 bits */ 218 kSDIOSLV_ScratchGroup1 = 1U, /*!< sdio scratch2 in FW18 0xnB0 n:1..7 16 bits */ 219 kSDIOSLV_ScratchGroup2 = 2U, /*!< sdio scratch group 2 in SDU 0xnE8 n:1..7 32 bits */ 220 kSDIOSLV_ScratchGroup3 = 3U, /*!< sdio scratch group 3 in SDU 0xnEC n:1..7 32 bits */ 221 kSDIOSLV_ScratchGroup4 = 4U, /*!< sdio scratch group 4 in SDU 0xnF0 n:1..7 32 bits */ 222 kSDIOSLV_ScratchGroup5 = 5U, /*!< sdio scratch group 5 in SDU 0xnF4 n:1..7 32 bits */ 223 kSDIOSLV_ScratchGroup6 = 6U, /*!< sdio scratch group 6 in SDU 0xnF8 n:1..7 32 bits */ 224 kSDIOSLV_ScratchGroup7 = 7U, /*!< sdio scratch group 7 in SDU 0xnFC n:1..7 32 bits */ 225 } sdioslv_scratch_group_t; 226 227 /*! @brief Scratch register offset in a group */ 228 typedef enum _sdioslv_scratch_offset 229 { 230 kSDIOSLV_ScratchOffset0 = 0U, /*!< sdio scratchoffset0 */ 231 kSDIOSLV_ScratchOffset1 = 1U, /*!< sdio scratchoffset1 */ 232 kSDIOSLV_ScratchOffset3 = 3U, /*!< sdio scratchoffset2 */ 233 kSDIOSLV_ScratchOffset4 = 4U, /*!< sdio scratchoffset3 */ 234 } sdioslv_scratch_offset_t; 235 236 237 /*! @brief SDU register map version 4 */ 238 typedef struct _sdioslv_sdu_regmap 239 { 240 uint32_t HostToCardEvent; /*!< 0x100/200.../700 */ 241 uint32_t HostIntCause; /*!< 0x104/204.../704 */ 242 uint32_t HostIntMask; /*!< 0x108/208.../708 */ 243 uint32_t HostIntStatus; /*!< 0x10C/20C.../70C */ 244 uint32_t RdBitMap; /*!< 0x110/210.../710 */ 245 uint32_t WrBitMap; /*!< 0x114/214.../714 */ 246 uint16_t RdLen[32]; /*!< 0x118/218.../718 */ 247 uint8_t HostTransferStatus; /*!< 0x158/258.../758 */ 248 uint8_t FunctionCardIntMsk; /*!< 0x159/259.../759 */ 249 uint8_t Card_Q_PTR_RANGE0; /*!< 0x15A/25A.../75A */ 250 uint8_t Card_Q_PTR_RANGE1; /*!< 0x15B/25B.../75B */ 251 uint16_t CardToHostEvent; /*!< 0x15C/25C.../75C */ 252 uint8_t reserved2[2]; 253 uint32_t CardIntMask; /*!< 0x160/260.../760 */ 254 uint32_t CardIntStatus; /*!< 0x164/264.../764 */ 255 uint32_t CardIntMode; /*!< 0x168/268.../768 */ 256 uint32_t SqReadBase; /*!< 0x16C/26C.../76C */ 257 uint32_t SqWriteBase; /*!< 0x170/270.../770 */ 258 uint8_t RdIdx; /*!< 0x174/274.../774 */ 259 uint8_t WrIdx; /*!< 0x175/275.../775 */ 260 uint8_t Reserved6[2]; /*!< 0x176/276.../776 */ 261 uint8_t Card_APU_SLP_RDY_EN; /*!< 0x178/278.../778 */ 262 uint8_t Reserved7[3]; 263 uint8_t Card_HOST_ERR_WKUP_EN; /*!< 0x17C/27C.../77C */ 264 uint8_t Reserved8[3]; 265 uint8_t HOST_ERR_CMD0; /*!< 0x180/280.../780 */ 266 uint8_t HOST_ERR_CMD1; /*!< 0x181/281.../781 */ 267 uint8_t HOST_ERR_CMD2; /*!< 0x182/282.../782 */ 268 uint8_t HOST_ERR_CMD3; /*!< 0x183/283.../783 */ 269 uint8_t HOST_ERR_CMD4; /*!< 0x184/284.../784 */ 270 uint8_t HOST_ERR_CMD5; /*!< 0x185/285.../785 */ 271 uint8_t Reserved9[2]; 272 uint32_t PktWrBitmapClr; /*!< 0x188/288.../788 */ 273 uint32_t PktRdBitmapClr; /*!< 0x18C/28C.../78C */ 274 uint32_t HostIntActMskEn; /*!< 0x190/290.../790 */ 275 uint32_t HostIntActMskClr; /*!< 0x194/294.../794 */ 276 uint32_t HostIntActMskStat; /*!< 0x198/298.../798 */ 277 uint32_t CardIntActMskEn; /*!< 0x19C/29C.../79C */ 278 uint32_t CardIntActMskClr; /*!< 0x1A0/2A0.../7A0 */ 279 uint32_t CardIntActMskStat; /*!< 0x1A4/2A4.../7A4 */ 280 uint32_t TestbusBitSelect; /*!< 0x1A8/2A8.../7A8 */ 281 uint32_t TestbusBitSelect1; /*!< 0x1AC/2AC.../7AC */ 282 uint16_t Scratch2; /*!< 0x1B0/2B0.../7B0 */ 283 uint8_t Scratch[6]; /*!< 0x1B2/2B2.../7B2 */ 284 uint32_t CmdPortSqWriteBase; /*!< 0x1B8/2B8.../7B8 */ 285 uint32_t CmdPortSqReadBase; /*!< 0x1BC/2BC.../7BC */ 286 uint16_t CmdPortRdLen; /*!< 0x1C0/2C0.../7C0 */ 287 uint16_t Reserved10; /*!< 0x1C2/2C2.../7C2 */ 288 uint32_t CmdPortConfig; /*!< 0x1C4/2C4.../7C4 */ 289 uint8_t ChipRev; /*!< 0x1C8/2C8.../7C8 */ 290 uint8_t reserved11; 291 uint8_t SDUMinorIPRev; /*!< 0x1CA/2CA.../7CA */ 292 uint8_t SDUMajorIPRev; /*!< 0x1CB/2CB.../7CB */ 293 uint32_t Card_PKT_END_RADDR; /*!< 0x1CC/2CC.../7CC */ 294 uint32_t Card_PKT_END_WADDR; /*!< 0x1D0/2D0.../7D0 */ 295 uint16_t Scratch1; /*!< 0x1D4/2D4.../7D4 */ 296 uint8_t Ocr2; /*!< 0x1D6/2D6.../7D6 */ 297 uint8_t Config; /*!< 0x1D7/2D7.../7D7 */ 298 uint32_t Config2; /*!< 0x1D8/2D8.../7D8 */ 299 uint32_t Debug; /*!< 0x1DC/2DC.../7DC */ 300 uint32_t DmaAddr; /*!< 0x1E0/2E0.../7E0 */ 301 uint8_t IoPort[3]; /*!< 0x1E4/2E4.../7E4 */ 302 } sdioslv_sdu_regmap_t; 303 304 305 /*! @brief SDIO CIS table callback. */ 306 typedef void (*sdioslv_cis_table_callback_t)(const uint32_t SDU_BASE); 307 308 /*! @brief Data structure to configure SDIO handle for specific function. */ 309 typedef struct sdio_slave_config 310 { 311 uint8_t fun_num; /*!< SDIO function number (1..7). */ 312 sdioslv_int_cpu_num_t cpu_num; /*!< Specify interrupt should be generated to which CPU */ 313 uint8_t used_port_num; /*!< How many data ports are used inside this function */ 314 uint8_t cmd_tx_format; /*!< Command Tx length format. 0: no tx_len, 1: 2 bytes, 2: 3 bytes */ 315 uint8_t cmd_rd_format; /*!< Command Rx length format. 0: blk_num * blk_size, 1: CMD_PORT_RD_LEN */ 316 uint8_t data_tx_format; /*!< Data Tx length format. 0: no tx_len, 1: 2 bytes, 2: 3 bytes */ 317 uint8_t data_rd_format; /*!< Data Rx length format. 318 0: blk_num * blk_size, 1: PORT_RD_LEN[15:0], 2: PORT1_RD_LEN[7:0] && PORT0_RD_LEN[15:0] */ 319 sdioslv_cis_table_callback_t cis_table_callback; /*!< Callback function for initializing the CIS table. */ 320 } sdio_slave_config_t; 321 322 323 /******************************************************************************* 324 * API 325 ******************************************************************************/ 326 327 #if defined(__cplusplus) 328 extern "C" { 329 #endif 330 331 /*! 332 * @name Initialization and deinitialization 333 * @{ 334 */ 335 336 /*! 337 * @brief SDIOSLV Init0. 338 * 339 * Call this API to Init SDIOSLV phase0. 340 * 341 * @param void None. 342 * @retval void None. 343 */ 344 void SDIOSLV_Init0(void); 345 346 /*! 347 * @brief SDIOSLV Init1. 348 * 349 * Call this API to Init SDIOSLV phase1. 350 * 351 * @param base FN FSR pointer. 352 * @param config Configure for SDIO Slave. 353 * @retval #kStatus_Success command is ready to be sent to host driver. 354 * @retval #kStatus_InvalidArgument Invalid argument. 355 */ 356 status_t SDIOSLV_Init1(SDU_FN_CARD_Type *base, sdio_slave_config_t *config); 357 358 359 /* @} */ 360 361 /*! 362 * @name Cmd/Data Send/Refill 363 * @{ 364 */ 365 366 /*! 367 * @brief SDIOSLV send command. 368 * 369 * Call this API to send command to host driver. 370 * The callback is always invoked from theinterrupt context. 371 * 372 * @param regmap FN FSR pointer. 373 * @param data_addr Data Address. 374 * @param data_len Data Length. 375 * @retval #kStatus_Success command is ready to be sent to host driver. 376 * @retval #kStatus_InvalidArgument Invalid argument. 377 */ 378 status_t SDIOSLV_SendCmdNonBlocking(sdioslv_sdu_regmap_t *regmap, uint8_t *data_addr, uint16_t data_len); 379 380 /*! 381 * @brief SDIOSLV provide command buffer. 382 * 383 * Call this API to provide receive command buffer to SDU driver. 384 * 385 * @param regmap FN FSR pointer. 386 * @param data_addr Data Address. 387 * @param data_len Data Length. 388 * @retval #kStatus_Success buffer refill sucessfully. 389 * @retval #kStatus_Fail fail to refill buffer. 390 */ 391 status_t SDIOSLV_RefillCmdBuffer(sdioslv_sdu_regmap_t *regmap, uint8_t *data_addr); 392 393 /*! 394 * @brief SDIOSLV send data transfer. 395 * 396 * Call this API to send data to host driver. 397 * The callback is always invoked from theinterrupt context. 398 * 399 * @param regmap FN FSR pointer. 400 * @param port Data Port. 401 * @param data_addr Data Address. 402 * @param data_len Data Length. 403 * @retval #kStatus_Success buffer is added to data slot with problem. 404 * @retval #kStatus_InvalidArgument Invalid argument. 405 * @retval #kStatus_SDIOSLV_SendFull all data slots are occupied, application 406 */ 407 status_t SDIOSLV_SendDataNonBlocking(sdioslv_sdu_regmap_t *regmap, sdioslv_port_t tx_port, uint8_t *data_addr, uint16_t data_len); 408 409 /*! 410 * @brief SDIOSLV provide receive data buffer. 411 * 412 * Call this API to provide receive data buffer to SDU driver. 413 * 414 * @param regmap FN FSR pointer. 415 * @param port Data Port. 416 * @param data_addr Data Address. 417 * @param data_len Data Length. 418 * @retval #kStatus_Success refill buffer sucessfully. 419 * @retval #kStatus_Fail fail to refill buffer. 420 */ 421 status_t SDIOSLV_RefillDataBuffer(sdioslv_sdu_regmap_t *regmap, sdioslv_port_t port, uint8_t *data_addr); 422 423 /* @} */ 424 425 /*! 426 * @name Control and Status 427 * @{ 428 */ 429 430 /*! 431 * @brief Get SDIO bus speed selection. 432 * 433 * Call this API to get current bus speed selected for SDIO. 434 * 435 * @param void None. 436 * @retval sdioslv_bus_speed_t Bus speed selected for SDIO. 437 */ 438 sdioslv_bus_speed_t SDIOSLV_GetBusSpeed(void); 439 440 /*! 441 * @brief Get SDIO the block size in FBR. 442 * 443 * For block mode, block size equals to block size in FBR. 444 * 445 * @param handle Created by SDIOSLV_CreateHanle(). 446 * @retval the block size in FBR. 447 */ 448 uint32_t SDIOSLV_GetBlockSize(uint8_t fn_num); 449 450 /* @} */ 451 452 /*! 453 * @name Scratch register read/write 454 * @{ 455 */ 456 457 /*! 458 * @brief SDIOSLV read scratch register of SDU. 459 * 460 * Call this API to read scratch register of SDU (based on group and offset). 461 * 462 * @param fun_num Specify which function. 463 * @param group Specify which group scratch register. 464 * @param offset Specify offset of the scratch group. 465 * @param value Value read from the register. 466 * @retval #kStatus_Success read sucessfully. 467 * @retval #kStatus_Fail fail to read. 468 */ 469 status_t SDIOSLV_ReadScratchRegister(sdioslv_func_t fun_num, 470 sdioslv_scratch_group_t group, 471 sdioslv_scratch_offset_t offset, 472 uint8_t *value); 473 474 /*! 475 * @brief SDIOSLV write value to scratch register of SDU. 476 * 477 * Call this API to write value to scratch register of SDU (based on group and offset). 478 * 479 * @param fun_num Specify which function. 480 * @param group Specify which group scratch register. 481 * @param offset Specify offset of the scratch group. 482 * @param value Value write to the register. 483 * @retval #kStatus_Success write sucessfully. 484 * @retval #kStatus_Fail fail to write. 485 */ 486 status_t SDIOSLV_WriteScratchRegister(sdioslv_func_t fun_num, 487 sdioslv_scratch_group_t group, 488 sdioslv_scratch_offset_t offset, 489 uint8_t value); 490 491 /* @} */ 492 493 #if defined(__cplusplus) 494 } 495 #endif 496 497 /* @}*/ 498 499 #endif /* _FSL_SDIOSLV_SDU_H_ */ 500