fsl_sdio.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. /*
  2. * Copyright (c) 2015, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2018 NXP
  4. * All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #ifndef _FSL_SDIO_H_
  9. #define _FSL_SDIO_H_
  10. #include "fsl_sdmmc_common.h"
  11. /*!
  12. * @addtogroup SDIOCARD
  13. * @{
  14. */
  15. /*******************************************************************************
  16. * Definitions
  17. ******************************************************************************/
  18. /*! @brief Middleware version. */
  19. #define FSL_SDIO_DRIVER_VERSION (MAKE_VERSION(2U, 2U, 11U)) /*2.2.11*/
  20. /*!@brief sdio device support maximum IO number */
  21. #ifndef FSL_SDIO_MAX_IO_NUMS
  22. #define FSL_SDIO_MAX_IO_NUMS (7U)
  23. #endif
  24. /*!@brief sdio card descriptor */
  25. typedef struct _sdio_card sdio_card_t;
  26. /*!@brief sdio io handler */
  27. typedef void (*sdio_io_irq_handler_t)(sdio_card_t *card, uint32_t func);
  28. /*! @brief sdio io read/write direction */
  29. typedef enum _sdio_io_direction
  30. {
  31. kSDIO_IORead = 0U, /*!< io read */
  32. kSDIO_IOWrite = 1U, /*!< io write */
  33. } sdio_io_direction_t;
  34. /*!
  35. * @brief SDIO card state
  36. *
  37. * Define the card structure including the necessary fields to identify and describe the card.
  38. */
  39. struct _sdio_card
  40. {
  41. SDMMCHOST_CONFIG host; /*!< Host information */
  42. sdiocard_usr_param_t usrParam; /*!< user parameter */
  43. bool noInternalAlign; /*!< use this flag to disable sdmmc align. If disable, sdmmc will not make sure the
  44. data buffer address is word align, otherwise all the transfer are align to low level driver */
  45. bool isHostReady; /*!< use this flag to indicate if need host re-init or not*/
  46. bool memPresentFlag; /*!< indicate if memory present */
  47. uint32_t busClock_Hz; /*!< SD bus clock frequency united in Hz */
  48. uint32_t relativeAddress; /*!< Relative address of the card */
  49. uint8_t sdVersion; /*!< SD version */
  50. sd_timing_mode_t currentTiming; /*!< current timing mode */
  51. sd_driver_strength_t driverStrength; /*!< driver strength */
  52. sd_max_current_t maxCurrent; /*!< card current limit */
  53. sdmmc_operation_voltage_t operationVoltage; /*!< card operation voltage */
  54. uint8_t sdioVersion; /*!< SDIO version */
  55. uint8_t cccrVersioin; /*!< CCCR version */
  56. uint8_t ioTotalNumber; /*!< total number of IO function */
  57. uint32_t cccrflags; /*!< Flags in _sd_card_flag */
  58. uint32_t io0blockSize; /*!< record the io0 block size*/
  59. uint32_t ocr; /*!< Raw OCR content, only 24bit avalible for SDIO card */
  60. uint32_t commonCISPointer; /*!< point to common CIS */
  61. sdio_common_cis_t commonCIS; /*!< CIS table */
  62. /* io registers/IRQ handler */
  63. sdio_fbr_t ioFBR[FSL_SDIO_MAX_IO_NUMS]; /*!< FBR table */
  64. sdio_func_cis_t funcCIS[FSL_SDIO_MAX_IO_NUMS]; /*!< function CIS table*/
  65. sdio_io_irq_handler_t ioIRQHandler[FSL_SDIO_MAX_IO_NUMS]; /*!< io IRQ handler */
  66. uint8_t ioIntIndex; /*!< used to record current enabled io interrupt index */
  67. uint8_t ioIntNums; /*!< used to record total enabled io interrupt numbers */
  68. };
  69. /*************************************************************************************************
  70. * API
  71. ************************************************************************************************/
  72. #if defined(__cplusplus)
  73. extern "C"
  74. {
  75. #endif
  76. /*!
  77. * @name Initialization and deinitialization
  78. * @{
  79. */
  80. /*!
  81. * @brief SDIO card init function
  82. *
  83. * @param card Card descriptor.
  84. * @retval kStatus_SDMMC_GoIdleFailed
  85. * @retval kStatus_SDMMC_HandShakeOperationConditionFailed
  86. * @retval kStatus_SDMMC_SDIO_InvalidCard
  87. * @retval kStatus_SDMMC_SDIO_InvalidVoltage
  88. * @retval kStatus_SDMMC_SendRelativeAddressFailed
  89. * @retval kStatus_SDMMC_SelectCardFailed
  90. * @retval kStatus_SDMMC_SDIO_SwitchHighSpeedFail
  91. * @retval kStatus_SDMMC_SDIO_ReadCISFail
  92. * @retval kStatus_SDMMC_TransferFailed
  93. * @retval kStatus_Success
  94. */
  95. status_t SDIO_Init(sdio_card_t *card);
  96. /*!
  97. * @brief SDIO card deinit, include card and host deinit.
  98. *
  99. * @param card Card descriptor.
  100. */
  101. void SDIO_Deinit(sdio_card_t *card);
  102. /*!
  103. * @brief Initializes the card.
  104. *
  105. * This function initializes the card only, make sure the host is ready when call this function,
  106. * otherwise it will return kStatus_SDMMC_HostNotReady.
  107. *
  108. * @param card Card descriptor.
  109. * @retval kStatus_SDMMC_HostNotReady host is not ready.
  110. * @retval kStatus_SDMMC_GoIdleFailed Go idle failed.
  111. * @retval kStatus_SDMMC_NotSupportYet Card not support.
  112. * @retval kStatus_SDMMC_SendOperationConditionFailed Send operation condition failed.
  113. * @retval kStatus_SDMMC_AllSendCidFailed Send CID failed.
  114. * @retval kStatus_SDMMC_SendRelativeAddressFailed Send relative address failed.
  115. * @retval kStatus_SDMMC_SendCsdFailed Send CSD failed.
  116. * @retval kStatus_SDMMC_SelectCardFailed Send SELECT_CARD command failed.
  117. * @retval kStatus_SDMMC_SendScrFailed Send SCR failed.
  118. * @retval kStatus_SDMMC_SetBusWidthFailed Set bus width failed.
  119. * @retval kStatus_SDMMC_SwitchHighSpeedFailed Switch high speed failed.
  120. * @retval kStatus_SDMMC_SetCardBlockSizeFailed Set card block size failed.
  121. * @retval kStatus_Success Operate successfully.
  122. */
  123. status_t SDIO_CardInit(sdio_card_t *card);
  124. /*!
  125. * @brief Deinitializes the card.
  126. *
  127. * This function deinitializes the specific card.
  128. *
  129. * @param card Card descriptor.
  130. */
  131. void SDIO_CardDeinit(sdio_card_t *card);
  132. /*!
  133. * @brief initialize the host.
  134. *
  135. * This function deinitializes the specific host.
  136. *
  137. * @param card Card descriptor.
  138. */
  139. status_t SDIO_HostInit(sdio_card_t *card);
  140. /*!
  141. * @brief Deinitializes the host.
  142. *
  143. * This function deinitializes the host.
  144. *
  145. * @param card Card descriptor.
  146. */
  147. void SDIO_HostDeinit(sdio_card_t *card);
  148. /*!
  149. * @brief reset the host.
  150. *
  151. * This function reset the specific host.
  152. *
  153. * @param host host descriptor.
  154. */
  155. void SDIO_HostReset(SDMMCHOST_CONFIG *host);
  156. /*!
  157. * @brief power on card.
  158. *
  159. * The power on operation depend on host or the user define power on function.
  160. * @param base host base address.
  161. * @param pwr user define power control configuration
  162. */
  163. void SDIO_PowerOnCard(SDMMCHOST_TYPE *base, const sdmmchost_pwr_card_t *pwr);
  164. /*!
  165. * @brief power on card.
  166. *
  167. * The power off operation depend on host or the user define power on function.
  168. * @param base host base address.
  169. * @param pwr user define power control configuration
  170. */
  171. void SDIO_PowerOffCard(SDMMCHOST_TYPE *base, const sdmmchost_pwr_card_t *pwr);
  172. /*!
  173. * @brief set SDIO card to inactive state
  174. *
  175. * @param card Card descriptor.
  176. * @retval kStatus_SDMMC_TransferFailed
  177. * @retval kStatus_Success
  178. */
  179. status_t SDIO_CardInActive(sdio_card_t *card);
  180. /*!
  181. * @brief get SDIO card capability
  182. *
  183. * @param card Card descriptor.
  184. * @param function IO number
  185. * @retval kStatus_SDMMC_TransferFailed
  186. * @retval kStatus_Success
  187. */
  188. status_t SDIO_GetCardCapability(sdio_card_t *card, sdio_func_num_t func);
  189. /*!
  190. * @brief set SDIO card block size
  191. *
  192. * @param card Card descriptor.
  193. * @param function io number
  194. * @param block size
  195. * @retval kStatus_SDMMC_SetCardBlockSizeFailed
  196. * @retval kStatus_SDMMC_SDIO_InvalidArgument
  197. * @retval kStatus_Success
  198. */
  199. status_t SDIO_SetBlockSize(sdio_card_t *card, sdio_func_num_t func, uint32_t blockSize);
  200. /*!
  201. * @brief set SDIO card reset
  202. *
  203. * @param card Card descriptor.
  204. * @retval kStatus_SDMMC_TransferFailed
  205. * @retval kStatus_Success
  206. */
  207. status_t SDIO_CardReset(sdio_card_t *card);
  208. /*!
  209. * @brief set SDIO card data bus width
  210. *
  211. * @param card Card descriptor.
  212. * @param data bus width
  213. * @retval kStatus_SDMMC_TransferFailed
  214. * @retval kStatus_Success
  215. */
  216. status_t SDIO_SetDataBusWidth(sdio_card_t *card, sdio_bus_width_t busWidth);
  217. /*!
  218. * @brief switch the card to high speed
  219. *
  220. * @param card Card descriptor.
  221. * @retval kStatus_SDMMC_TransferFailed
  222. * @retval kStatus_SDMMC_SDIO_SwitchHighSpeedFail
  223. * @retval kStatus_Success
  224. */
  225. status_t SDIO_SwitchToHighSpeed(sdio_card_t *card);
  226. /*!
  227. * @brief read SDIO card CIS for each function
  228. *
  229. * @param card Card descriptor.
  230. * @param function io number
  231. * @param tuple code list
  232. * @param tuple code number
  233. * @retval kStatus_SDMMC_SDIO_ReadCISFail
  234. * @retval kStatus_SDMMC_TransferFailed
  235. * @retval kStatus_Success
  236. */
  237. status_t SDIO_ReadCIS(sdio_card_t *card, sdio_func_num_t func, const uint32_t *tupleList, uint32_t tupleNum);
  238. /*!
  239. * @brief sdio wait card detect function.
  240. *
  241. * Detect card through GPIO, CD, DATA3.
  242. *
  243. * @param card card descriptor.
  244. * @param card detect configuration
  245. * @param waitCardStatus wait card detect status
  246. */
  247. status_t SDIO_WaitCardDetectStatus(SDMMCHOST_TYPE *hostBase,
  248. const sdmmchost_detect_card_t *cd,
  249. bool waitCardStatus);
  250. /*!
  251. * @brief sdio card present check function.
  252. *
  253. * @param card card descriptor.
  254. */
  255. bool SDIO_IsCardPresent(sdio_card_t *card);
  256. /* @} */
  257. /*!
  258. * @name IO operations
  259. * @{
  260. */
  261. /*!
  262. * @brief IO direct write transfer function
  263. *
  264. * @param card Card descriptor.
  265. * @param function IO numner
  266. * @param register address
  267. * @param the data pinter to write
  268. * @param raw flag, indicate read after write or write only
  269. * @retval kStatus_SDMMC_TransferFailed
  270. * @retval kStatus_Success
  271. */
  272. status_t SDIO_IO_Write_Direct(sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *data, bool raw);
  273. /*!
  274. * @brief IO direct read transfer function
  275. *
  276. * @param card Card descriptor.
  277. * @param function IO number
  278. * @param register address
  279. * @param data pointer to read
  280. * @retval kStatus_SDMMC_TransferFailed
  281. * @retval kStatus_Success
  282. */
  283. status_t SDIO_IO_Read_Direct(sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *data);
  284. /*!
  285. * @brief IO direct read/write transfer function
  286. *
  287. * @param card Card descriptor.
  288. * @param direction io access direction, please reference sdio_io_direction_t.
  289. * @param function IO number
  290. * @param register address
  291. * @param dataIn data to write
  292. * @param dataOut data pointer for readback data, support both for read and write, when application want readback
  293. * the data after write command, dataOut should not be NULL.
  294. * @retval kStatus_SDMMC_TransferFailed
  295. * @retval kStatus_Success
  296. */
  297. status_t SDIO_IO_RW_Direct(sdio_card_t *card,
  298. sdio_io_direction_t direction,
  299. sdio_func_num_t func,
  300. uint32_t regAddr,
  301. uint8_t dataIn,
  302. uint8_t *dataOut);
  303. /*!
  304. * @brief IO extended write transfer function
  305. *
  306. * @param card Card descriptor.
  307. * @param function IO number
  308. * @param register address
  309. * @param data buffer to write
  310. * @param data count
  311. * @param write flags
  312. * @retval kStatus_SDMMC_TransferFailed
  313. * @retval kStatus_SDMMC_SDIO_InvalidArgument
  314. * @retval kStatus_Success
  315. */
  316. status_t SDIO_IO_Write_Extended(
  317. sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *buffer, uint32_t count, uint32_t flags);
  318. /*!
  319. * @brief IO extended read transfer function
  320. *
  321. * @param card Card descriptor.
  322. * @param function IO number
  323. * @param register address
  324. * @param data buffer to read
  325. * @param data count
  326. * @param write flags
  327. * @retval kStatus_SDMMC_TransferFailed
  328. * @retval kStatus_SDMMC_SDIO_InvalidArgument
  329. * @retval kStatus_Success
  330. */
  331. status_t SDIO_IO_Read_Extended(
  332. sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *buffer, uint32_t count, uint32_t flags);
  333. /*!
  334. * @brief enable IO interrupt
  335. *
  336. * @param card Card descriptor.
  337. * @param function IO number
  338. * @param enable/disable flag
  339. * @retval kStatus_SDMMC_TransferFailed
  340. * @retval kStatus_Success
  341. */
  342. status_t SDIO_EnableIOInterrupt(sdio_card_t *card, sdio_func_num_t func, bool enable);
  343. /*!
  344. * @brief enable IO and wait IO ready
  345. *
  346. * @param card Card descriptor.
  347. * @param function IO number
  348. * @param enable/disable flag
  349. * @retval kStatus_SDMMC_TransferFailed
  350. * @retval kStatus_Success
  351. */
  352. status_t SDIO_EnableIO(sdio_card_t *card, sdio_func_num_t func, bool enable);
  353. /*!
  354. * @brief select IO
  355. *
  356. * @param card Card descriptor.
  357. * @param function IO number
  358. * @retval kStatus_SDMMC_TransferFailed
  359. * @retval kStatus_Success
  360. */
  361. status_t SDIO_SelectIO(sdio_card_t *card, sdio_func_num_t func);
  362. /*!
  363. * @brief Abort IO transfer
  364. *
  365. * @param card Card descriptor.
  366. * @param function IO number
  367. * @retval kStatus_SDMMC_TransferFailed
  368. * @retval kStatus_Success
  369. */
  370. status_t SDIO_AbortIO(sdio_card_t *card, sdio_func_num_t func);
  371. /*!
  372. * @brief Set driver strength.
  373. *
  374. * @param card Card descriptor.
  375. * @param driverStrength target driver strength.
  376. * @retval kStatus_SDMMC_TransferFailed
  377. * @retval kStatus_Success
  378. */
  379. status_t SDIO_SetDriverStrength(sdio_card_t *card, sd_driver_strength_t driverStrength);
  380. /*!
  381. * @brief Enable/Disable Async interrupt.
  382. *
  383. * @param card Card descriptor.
  384. * @param func function io number.
  385. * @param enable true is enable, false is disable.
  386. * @retval kStatus_SDMMC_TransferFailed
  387. * @retval kStatus_Success
  388. */
  389. status_t SDIO_EnableAsyncInterrupt(sdio_card_t *card, bool enable);
  390. /*!
  391. * @brief Get pending interrupt.
  392. *
  393. * @param card Card descriptor.
  394. * @param pendingInt pointer store pending interrupt
  395. * @retval kStatus_SDMMC_TransferFailed
  396. * @retval kStatus_Success
  397. */
  398. status_t SDIO_GetPendingInterrupt(sdio_card_t *card, uint8_t *pendingInt);
  399. /*!
  400. * @brief sdio card io transfer function.
  401. * This function can be used for trnansfer direct/extend command.
  402. * Please pay attention to the non-align data buffer address transfer,
  403. * if data buffer address can not meet host controller internal DMA requirement, sdio driver will try to use
  404. internal align buffer if data size is not bigger than internal buffer size,
  405. * Align address transfer always can get a better performance, so if application want sdio driver make sure buffer
  406. address align,
  407. * please redefine the SDMMC_GLOBAL_BUFFER_SIZE macro to a value which is big enough for your application.
  408. *
  409. * @param card card descriptor.
  410. * @param cmd command to transfer
  411. * @param argument argument to transfer
  412. * @param blockSize used for block mode.
  413. * @param txData tx buffer pointer or NULL
  414. * @param rxData rx buffer pointer or NULL
  415. * @param dataSize transfer data size
  416. * @param response reponse pointer, if application want read response back, please set it to a NON-NULL pointer.
  417. */
  418. status_t SDIO_IO_Transfer(sdio_card_t *card,
  419. sdio_command_t cmd,
  420. uint32_t argument,
  421. uint32_t blockSize,
  422. uint8_t *txData,
  423. uint8_t *rxData,
  424. uint16_t dataSize,
  425. uint32_t *response);
  426. /*!
  427. * @brief sdio set io IRQ handler.
  428. *
  429. * @param card card descriptor.
  430. * @param func function io number.
  431. * @param handler, io IRQ handler.
  432. */
  433. void SDIO_SetIOIRQHandler(sdio_card_t *card, sdio_func_num_t func, sdio_io_irq_handler_t handler);
  434. /*!
  435. * @brief sdio card io pending interrupt handle function.
  436. * This function is used to handle the pending io interrupt.
  437. * To reigster a IO IRQ handler,
  438. * @code
  439. * //initialization
  440. * SDIO_EnableIOInterrupt(card, 0, true);
  441. * SDIO_SetIOIRQHandler(card, 0, func0_handler);
  442. * //call it in interrupt callback
  443. * SDIO_HandlePendingIOInterrupt(card);
  444. * @code
  445. * To releae a IO IRQ handler,
  446. * @code
  447. * SDIO_EnableIOInterrupt(card, 0, false);
  448. * SDIO_SetIOIRQHandler(card, 0, NULL);
  449. * @code
  450. * @param card card descriptor.
  451. *
  452. * @retval kStatus_SDMMC_TransferFailed
  453. * @retval kStatus_Success
  454. */
  455. status_t SDIO_HandlePendingIOInterrupt(sdio_card_t *card);
  456. /* @} */
  457. #if defined(__cplusplus)
  458. }
  459. #endif
  460. /*! @} */
  461. #endif /* _FSL_SDIO_H_*/