fsl_card.h 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. /*
  2. * Copyright (c) 2015, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2017 NXP
  4. *
  5. * Redistribution and use in source and binary forms, with or without modification,
  6. * are permitted provided that the following conditions are met:
  7. *
  8. * o Redistributions of source code must retain the above copyright notice, this list
  9. * of conditions and the following disclaimer.
  10. *
  11. * o Redistributions in binary form must reproduce the above copyright notice, this
  12. * list of conditions and the following disclaimer in the documentation and/or
  13. * other materials provided with the distribution.
  14. *
  15. * o Neither the name of the copyright holder nor the names of its
  16. * contributors may be used to endorse or promote products derived from this
  17. * software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  23. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  26. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  28. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. */
  30. #ifndef _FSL_CARD_H_
  31. #define _FSL_CARD_H_
  32. #include "fsl_common.h"
  33. #include "fsl_specification.h"
  34. #include "fsl_host.h"
  35. /*!
  36. * @addtogroup CARD
  37. * @{
  38. */
  39. /*******************************************************************************
  40. * Definitions
  41. ******************************************************************************/
  42. /*! @brief Driver version. */
  43. #define FSL_SDMMC_DRIVER_VERSION (MAKE_VERSION(2U, 1U, 2U)) /*2.1.2*/
  44. /*! @brief Default block size */
  45. #define FSL_SDMMC_DEFAULT_BLOCK_SIZE (512U)
  46. /*! @brief SD/MMC card API's running status. */
  47. enum _sdmmc_status
  48. {
  49. kStatus_SDMMC_NotSupportYet = MAKE_STATUS(kStatusGroup_SDMMC, 0U), /*!< Haven't supported */
  50. kStatus_SDMMC_TransferFailed = MAKE_STATUS(kStatusGroup_SDMMC, 1U), /*!< Send command failed */
  51. kStatus_SDMMC_SetCardBlockSizeFailed = MAKE_STATUS(kStatusGroup_SDMMC, 2U), /*!< Set block size failed */
  52. kStatus_SDMMC_HostNotSupport = MAKE_STATUS(kStatusGroup_SDMMC, 3U), /*!< Host doesn't support */
  53. kStatus_SDMMC_CardNotSupport = MAKE_STATUS(kStatusGroup_SDMMC, 4U), /*!< Card doesn't support */
  54. kStatus_SDMMC_AllSendCidFailed = MAKE_STATUS(kStatusGroup_SDMMC, 5U), /*!< Send CID failed */
  55. kStatus_SDMMC_SendRelativeAddressFailed = MAKE_STATUS(kStatusGroup_SDMMC, 6U), /*!< Send relative address failed */
  56. kStatus_SDMMC_SendCsdFailed = MAKE_STATUS(kStatusGroup_SDMMC, 7U), /*!< Send CSD failed */
  57. kStatus_SDMMC_SelectCardFailed = MAKE_STATUS(kStatusGroup_SDMMC, 8U), /*!< Select card failed */
  58. kStatus_SDMMC_SendScrFailed = MAKE_STATUS(kStatusGroup_SDMMC, 9U), /*!< Send SCR failed */
  59. kStatus_SDMMC_SetDataBusWidthFailed = MAKE_STATUS(kStatusGroup_SDMMC, 10U), /*!< Set bus width failed */
  60. kStatus_SDMMC_GoIdleFailed = MAKE_STATUS(kStatusGroup_SDMMC, 11U), /*!< Go idle failed */
  61. kStatus_SDMMC_HandShakeOperationConditionFailed =
  62. MAKE_STATUS(kStatusGroup_SDMMC, 12U), /*!< Send Operation Condition failed */
  63. kStatus_SDMMC_SendApplicationCommandFailed =
  64. MAKE_STATUS(kStatusGroup_SDMMC, 13U), /*!< Send application command failed */
  65. kStatus_SDMMC_SwitchFailed = MAKE_STATUS(kStatusGroup_SDMMC, 14U), /*!< Switch command failed */
  66. kStatus_SDMMC_StopTransmissionFailed = MAKE_STATUS(kStatusGroup_SDMMC, 15U), /*!< Stop transmission failed */
  67. kStatus_SDMMC_WaitWriteCompleteFailed = MAKE_STATUS(kStatusGroup_SDMMC, 16U), /*!< Wait write complete failed */
  68. kStatus_SDMMC_SetBlockCountFailed = MAKE_STATUS(kStatusGroup_SDMMC, 17U), /*!< Set block count failed */
  69. kStatus_SDMMC_SetRelativeAddressFailed = MAKE_STATUS(kStatusGroup_SDMMC, 18U), /*!< Set relative address failed */
  70. kStatus_SDMMC_SwitchBusTimingFailed = MAKE_STATUS(kStatusGroup_SDMMC, 19U), /*!< Switch high speed failed */
  71. kStatus_SDMMC_SendExtendedCsdFailed = MAKE_STATUS(kStatusGroup_SDMMC, 20U), /*!< Send EXT_CSD failed */
  72. kStatus_SDMMC_ConfigureBootFailed = MAKE_STATUS(kStatusGroup_SDMMC, 21U), /*!< Configure boot failed */
  73. kStatus_SDMMC_ConfigureExtendedCsdFailed = MAKE_STATUS(kStatusGroup_SDMMC, 22U), /*!< Configure EXT_CSD failed */
  74. kStatus_SDMMC_EnableHighCapacityEraseFailed =
  75. MAKE_STATUS(kStatusGroup_SDMMC, 23U), /*!< Enable high capacity erase failed */
  76. kStatus_SDMMC_SendTestPatternFailed = MAKE_STATUS(kStatusGroup_SDMMC, 24U), /*!< Send test pattern failed */
  77. kStatus_SDMMC_ReceiveTestPatternFailed = MAKE_STATUS(kStatusGroup_SDMMC, 25U), /*!< Receive test pattern failed */
  78. kStatus_SDMMC_SDIO_ResponseError = MAKE_STATUS(kStatusGroup_SDMMC, 26U), /*!< sdio response error */
  79. kStatus_SDMMC_SDIO_InvalidArgument =
  80. MAKE_STATUS(kStatusGroup_SDMMC, 27U), /*!< sdio invalid argument response error */
  81. kStatus_SDMMC_SDIO_SendOperationConditionFail =
  82. MAKE_STATUS(kStatusGroup_SDMMC, 28U), /*!< sdio send operation condition fail */
  83. kStatus_SDMMC_InvalidVoltage = MAKE_STATUS(kStatusGroup_SDMMC, 29U), /*!< invaild voltage */
  84. kStatus_SDMMC_SDIO_SwitchHighSpeedFail = MAKE_STATUS(kStatusGroup_SDMMC, 30U), /*!< switch to high speed fail */
  85. kStatus_SDMMC_SDIO_ReadCISFail = MAKE_STATUS(kStatusGroup_SDMMC, 31U), /*!< read CIS fail */
  86. kStatus_SDMMC_SDIO_InvalidCard = MAKE_STATUS(kStatusGroup_SDMMC, 32U), /*!< invaild SDIO card */
  87. kStatus_SDMMC_TuningFail = MAKE_STATUS(kStatusGroup_SDMMC, 33U), /*!< tuning fail */
  88. kStatus_SDMMC_SwitchVoltageFail = MAKE_STATUS(kStatusGroup_SDMMC, 34U), /*!< switch voltage fail*/
  89. kStatus_SDMMC_ReTuningRequest = MAKE_STATUS(kStatusGroup_SDMMC, 35U), /*!< retuning request */
  90. kStatus_SDMMC_SetDriverStrengthFail = MAKE_STATUS(kStatusGroup_SDMMC, 36U), /*!< set driver strength fail */
  91. kStatus_SDMMC_SetPowerClassFail = MAKE_STATUS(kStatusGroup_SDMMC, 37U), /*!< set power class fail */
  92. };
  93. /*! @brief SD card flags */
  94. enum _sd_card_flag
  95. {
  96. kSD_SupportHighCapacityFlag = (1U << 1U), /*!< Support high capacity */
  97. kSD_Support4BitWidthFlag = (1U << 2U), /*!< Support 4-bit data width */
  98. kSD_SupportSdhcFlag = (1U << 3U), /*!< Card is SDHC */
  99. kSD_SupportSdxcFlag = (1U << 4U), /*!< Card is SDXC */
  100. kSD_SupportVoltage180v = (1U << 5U), /*!< card support 1.8v voltage*/
  101. kSD_SupportSetBlockCountCmd = (1U << 6U), /*!< card support cmd23 flag*/
  102. kSD_SupportSpeedClassControlCmd = (1U << 7U), /*!< card support speed class control flag */
  103. };
  104. /*! @brief MMC card flags */
  105. enum _mmc_card_flag
  106. {
  107. kMMC_SupportHighSpeed26MHZFlag = (1U << 0U), /*!< Support high speed 26MHZ */
  108. kMMC_SupportHighSpeed52MHZFlag = (1U << 1U), /*!< Support high speed 52MHZ */
  109. kMMC_SupportHighSpeedDDR52MHZ180V300VFlag = (1 << 2U), /*!< ddr 52MHZ 1.8V or 3.0V */
  110. kMMC_SupportHighSpeedDDR52MHZ120VFlag = (1 << 3U), /*!< DDR 52MHZ 1.2V */
  111. kMMC_SupportHS200200MHZ180VFlag = (1 << 4U), /*!< HS200 ,200MHZ,1.8V */
  112. kMMC_SupportHS200200MHZ120VFlag = (1 << 5U), /*!< HS200, 200MHZ, 1.2V */
  113. kMMC_SupportHS400DDR200MHZ180VFlag = (1 << 6U), /*!< HS400, DDR, 200MHZ,1.8V */
  114. kMMC_SupportHS400DDR200MHZ120VFlag = (1 << 7U), /*!< HS400, DDR, 200MHZ,1.2V */
  115. kMMC_SupportHighCapacityFlag = (1U << 8U), /*!< Support high capacity */
  116. kMMC_SupportAlternateBootFlag = (1U << 9U), /*!< Support alternate boot */
  117. kMMC_SupportDDRBootFlag = (1U << 10U), /*!< support DDR boot flag*/
  118. kMMC_SupportHighSpeedBootFlag = (1U << 11U), /*!< support high speed boot flag*/
  119. kMMC_DataBusWidth4BitFlag = (1U << 12U), /*!< current data bus is 4 bit mode*/
  120. kMMC_DataBusWidth8BitFlag = (1U << 13U), /*!< current data bus is 8 bit mode*/
  121. kMMC_DataBusWidth1BitFlag = (1U << 14U), /*!< current data bus is 1 bit mode */
  122. };
  123. /*! @brief card operation voltage */
  124. typedef enum _card_operation_voltage
  125. {
  126. kCARD_OperationVoltageNone = 0U, /*!< indicate current voltage setting is not setting bu suser*/
  127. kCARD_OperationVoltage330V = 1U, /*!< card operation voltage around 3.3v */
  128. kCARD_OperationVoltage300V = 2U, /*!< card operation voltage around 3.0v */
  129. kCARD_OperationVoltage180V = 3U, /*!< card operation voltage around 31.8v */
  130. } card_operation_voltage_t;
  131. /*!
  132. * @brief SD card state
  133. *
  134. * Define the card structure including the necessary fields to identify and describe the card.
  135. */
  136. typedef struct _sd_card
  137. {
  138. HOST_CONFIG host; /*!< Host information */
  139. bool isHostReady; /*!< use this flag to indicate if need host re-init or not*/
  140. uint32_t busClock_Hz; /*!< SD bus clock frequency united in Hz */
  141. uint32_t relativeAddress; /*!< Relative address of the card */
  142. uint32_t version; /*!< Card version */
  143. uint32_t flags; /*!< Flags in _sd_card_flag */
  144. uint32_t rawCid[4U]; /*!< Raw CID content */
  145. uint32_t rawCsd[4U]; /*!< Raw CSD content */
  146. uint32_t rawScr[2U]; /*!< Raw CSD content */
  147. uint32_t ocr; /*!< Raw OCR content */
  148. sd_cid_t cid; /*!< CID */
  149. sd_csd_t csd; /*!< CSD */
  150. sd_scr_t scr; /*!< SCR */
  151. uint32_t blockCount; /*!< Card total block number */
  152. uint32_t blockSize; /*!< Card block size */
  153. sd_timing_mode_t currentTiming; /*!< current timing mode */
  154. sd_driver_strength_t driverStrength; /*!< driver strength */
  155. sd_max_current_t maxCurrent; /*!< card current limit */
  156. card_operation_voltage_t operationVoltage; /*!< card operation voltage */
  157. } sd_card_t;
  158. /*!
  159. * @brief SDIO card state
  160. *
  161. * Define the card structure including the necessary fields to identify and describe the card.
  162. */
  163. typedef struct _sdio_card
  164. {
  165. HOST_CONFIG host; /*!< Host information */
  166. bool isHostReady; /*!< use this flag to indicate if need host re-init or not*/
  167. bool memPresentFlag; /*!< indicate if memory present */
  168. uint32_t busClock_Hz; /*!< SD bus clock frequency united in Hz */
  169. uint32_t relativeAddress; /*!< Relative address of the card */
  170. uint8_t sdVersion; /*!< SD version */
  171. uint8_t sdioVersion; /*!< SDIO version */
  172. uint8_t cccrVersioin; /*!< CCCR version */
  173. uint8_t ioTotalNumber; /*!< total number of IO function */
  174. uint32_t cccrflags; /*!< Flags in _sd_card_flag */
  175. uint32_t io0blockSize; /*!< record the io0 block size*/
  176. uint32_t ocr; /*!< Raw OCR content, only 24bit avalible for SDIO card */
  177. uint32_t commonCISPointer; /*!< point to common CIS */
  178. sdio_fbr_t ioFBR[7U]; /*!< FBR table */
  179. sdio_common_cis_t commonCIS; /*!< CIS table */
  180. sdio_func_cis_t funcCIS[7U]; /*!< function CIS table*/
  181. } sdio_card_t;
  182. /*!
  183. * @brief SD card state
  184. *
  185. * Define the card structure including the necessary fields to identify and describe the card.
  186. */
  187. typedef struct _mmc_card
  188. {
  189. HOST_CONFIG host; /*!< Host information */
  190. bool isHostReady; /*!< use this flag to indicate if need host re-init or not*/
  191. uint32_t busClock_Hz; /*!< MMC bus clock united in Hz */
  192. uint32_t relativeAddress; /*!< Relative address of the card */
  193. bool enablePreDefinedBlockCount; /*!< Enable PRE-DEFINED block count when read/write */
  194. uint32_t flags; /*!< Capability flag in _mmc_card_flag */
  195. uint32_t rawCid[4U]; /*!< Raw CID content */
  196. uint32_t rawCsd[4U]; /*!< Raw CSD content */
  197. uint32_t rawExtendedCsd[MMC_EXTENDED_CSD_BYTES / 4U]; /*!< Raw MMC Extended CSD content */
  198. uint32_t ocr; /*!< Raw OCR content */
  199. mmc_cid_t cid; /*!< CID */
  200. mmc_csd_t csd; /*!< CSD */
  201. mmc_extended_csd_t extendedCsd; /*!< Extended CSD */
  202. uint32_t blockSize; /*!< Card block size */
  203. uint32_t userPartitionBlocks; /*!< Card total block number in user partition */
  204. uint32_t bootPartitionBlocks; /*!< Boot partition size united as block size */
  205. uint32_t eraseGroupBlocks; /*!< Erase group size united as block size */
  206. mmc_access_partition_t currentPartition; /*!< Current access partition */
  207. mmc_voltage_window_t hostVoltageWindow; /*!< Host voltage window */
  208. mmc_high_speed_timing_t currentTiming; /*!< indicate the current host timing mode*/
  209. } mmc_card_t;
  210. /*! @brief MMC card boot configuration definition. */
  211. typedef struct _mmc_boot_config
  212. {
  213. bool enableBootAck; /*!< Enable boot ACK */
  214. mmc_boot_partition_enable_t bootPartition; /*!< Boot partition */
  215. bool retainBootBusWidth; /*!< If retain boot bus width */
  216. mmc_data_bus_width_t bootDataBusWidth; /*!< Boot data bus width */
  217. } mmc_boot_config_t;
  218. /* define a function pointer for tuning */
  219. typedef status_t (*card_send_tuning_func)(void *cardType);
  220. /*************************************************************************************************
  221. * API
  222. ************************************************************************************************/
  223. #if defined(__cplusplus)
  224. extern "C" {
  225. #endif
  226. /*!
  227. * @name SDCARD Function
  228. * @{
  229. */
  230. /*!
  231. * @brief Initializes the card on a specific host controller.
  232. *
  233. * This function initializes the card on a specific host controller.
  234. *
  235. * @param card Card descriptor.
  236. * @retval kStatus_SDMMC_GoIdleFailed Go idle failed.
  237. * @retval kStatus_SDMMC_NotSupportYet Card not support.
  238. * @retval kStatus_SDMMC_SendOperationConditionFailed Send operation condition failed.
  239. * @retval kStatus_SDMMC_AllSendCidFailed Send CID failed.
  240. * @retval kStatus_SDMMC_SendRelativeAddressFailed Send relative address failed.
  241. * @retval kStatus_SDMMC_SendCsdFailed Send CSD failed.
  242. * @retval kStatus_SDMMC_SelectCardFailed Send SELECT_CARD command failed.
  243. * @retval kStatus_SDMMC_SendScrFailed Send SCR failed.
  244. * @retval kStatus_SDMMC_SetBusWidthFailed Set bus width failed.
  245. * @retval kStatus_SDMMC_SwitchHighSpeedFailed Switch high speed failed.
  246. * @retval kStatus_SDMMC_SetCardBlockSizeFailed Set card block size failed.
  247. * @retval kStatus_Success Operate successfully.
  248. */
  249. status_t SD_Init(sd_card_t *card);
  250. /*!
  251. * @brief Deinitializes the card.
  252. *
  253. * This function deinitializes the specific card.
  254. *
  255. * @param card Card descriptor.
  256. */
  257. void SD_Deinit(sd_card_t *card);
  258. /*!
  259. * @brief Checks whether the card is write-protected.
  260. *
  261. * This function checks if the card is write-protected via the CSD register.
  262. *
  263. * @param card The specific card.
  264. * @retval true Card is read only.
  265. * @retval false Card isn't read only.
  266. */
  267. bool SD_CheckReadOnly(sd_card_t *card);
  268. /*!
  269. * @brief Reads blocks from the specific card.
  270. *
  271. * This function reads blocks from the specific card with default block size defined by the
  272. * SDHC_CARD_DEFAULT_BLOCK_SIZE.
  273. *
  274. * @param card Card descriptor.
  275. * @param buffer The buffer to save the data read from card.
  276. * @param startBlock The start block index.
  277. * @param blockCount The number of blocks to read.
  278. * @retval kStatus_InvalidArgument Invalid argument.
  279. * @retval kStatus_SDMMC_CardNotSupport Card not support.
  280. * @retval kStatus_SDMMC_NotSupportYet Not support now.
  281. * @retval kStatus_SDMMC_WaitWriteCompleteFailed Send status failed.
  282. * @retval kStatus_SDMMC_TransferFailed Transfer failed.
  283. * @retval kStatus_SDMMC_StopTransmissionFailed Stop transmission failed.
  284. * @retval kStatus_Success Operate successfully.
  285. */
  286. status_t SD_ReadBlocks(sd_card_t *card, uint8_t *buffer, uint32_t startBlock, uint32_t blockCount);
  287. /*!
  288. * @brief Writes blocks of data to the specific card.
  289. *
  290. * This function writes blocks to the specific card with default block size 512 bytes.
  291. *
  292. * @param card Card descriptor.
  293. * @param buffer The buffer holding the data to be written to the card.
  294. * @param startBlock The start block index.
  295. * @param blockCount The number of blocks to write.
  296. * @retval kStatus_InvalidArgument Invalid argument.
  297. * @retval kStatus_SDMMC_NotSupportYet Not support now.
  298. * @retval kStatus_SDMMC_CardNotSupport Card not support.
  299. * @retval kStatus_SDMMC_WaitWriteCompleteFailed Send status failed.
  300. * @retval kStatus_SDMMC_TransferFailed Transfer failed.
  301. * @retval kStatus_SDMMC_StopTransmissionFailed Stop transmission failed.
  302. * @retval kStatus_Success Operate successfully.
  303. */
  304. status_t SD_WriteBlocks(sd_card_t *card, const uint8_t *buffer, uint32_t startBlock, uint32_t blockCount);
  305. /*!
  306. * @brief Erases blocks of the specific card.
  307. *
  308. * This function erases blocks of the specific card with default block size 512 bytes.
  309. *
  310. * @param card Card descriptor.
  311. * @param startBlock The start block index.
  312. * @param blockCount The number of blocks to erase.
  313. * @retval kStatus_InvalidArgument Invalid argument.
  314. * @retval kStatus_SDMMC_WaitWriteCompleteFailed Send status failed.
  315. * @retval kStatus_SDMMC_TransferFailed Transfer failed.
  316. * @retval kStatus_SDMMC_WaitWriteCompleteFailed Send status failed.
  317. * @retval kStatus_Success Operate successfully.
  318. */
  319. status_t SD_EraseBlocks(sd_card_t *card, uint32_t startBlock, uint32_t blockCount);
  320. /* @} */
  321. /*!
  322. * @name MMCCARD Function
  323. * @{
  324. */
  325. /*!
  326. * @brief Initializes the MMC card.
  327. *
  328. * @param card Card descriptor.
  329. * @retval kStatus_SDMMC_GoIdleFailed Go idle failed.
  330. * @retval kStatus_SDMMC_SendOperationConditionFailed Send operation condition failed.
  331. * @retval kStatus_SDMMC_AllSendCidFailed Send CID failed.
  332. * @retval kStatus_SDMMC_SetRelativeAddressFailed Set relative address failed.
  333. * @retval kStatus_SDMMC_SendCsdFailed Send CSD failed.
  334. * @retval kStatus_SDMMC_CardNotSupport Card not support.
  335. * @retval kStatus_SDMMC_SelectCardFailed Send SELECT_CARD command failed.
  336. * @retval kStatus_SDMMC_SendExtendedCsdFailed Send EXT_CSD failed.
  337. * @retval kStatus_SDMMC_SetBusWidthFailed Set bus width failed.
  338. * @retval kStatus_SDMMC_SwitchHighSpeedFailed Switch high speed failed.
  339. * @retval kStatus_SDMMC_SetCardBlockSizeFailed Set card block size failed.
  340. * @retval kStatus_Success Operate successfully.
  341. */
  342. status_t MMC_Init(mmc_card_t *card);
  343. /*!
  344. * @brief Deinitializes the card.
  345. *
  346. * @param card Card descriptor.
  347. */
  348. void MMC_Deinit(mmc_card_t *card);
  349. /*!
  350. * @brief Checks if the card is read-only.
  351. *
  352. * @param card Card descriptor.
  353. * @retval true Card is read only.
  354. * @retval false Card isn't read only.
  355. */
  356. bool MMC_CheckReadOnly(mmc_card_t *card);
  357. /*!
  358. * @brief Reads data blocks from the card.
  359. *
  360. * @param card Card descriptor.
  361. * @param buffer The buffer to save data.
  362. * @param startBlock The start block index.
  363. * @param blockCount The number of blocks to read.
  364. * @retval kStatus_InvalidArgument Invalid argument.
  365. * @retval kStatus_SDMMC_CardNotSupport Card not support.
  366. * @retval kStatus_SDMMC_SetBlockCountFailed Set block count failed.
  367. * @retval kStatus_SDMMC_TransferFailed Transfer failed.
  368. * @retval kStatus_SDMMC_StopTransmissionFailed Stop transmission failed.
  369. * @retval kStatus_Success Operate successfully.
  370. */
  371. status_t MMC_ReadBlocks(mmc_card_t *card, uint8_t *buffer, uint32_t startBlock, uint32_t blockCount);
  372. /*!
  373. * @brief Writes data blocks to the card.
  374. *
  375. * @param card Card descriptor.
  376. * @param buffer The buffer to save data blocks.
  377. * @param startBlock Start block number to write.
  378. * @param blockCount Block count.
  379. * @retval kStatus_InvalidArgument Invalid argument.
  380. * @retval kStatus_SDMMC_NotSupportYet Not support now.
  381. * @retval kStatus_SDMMC_SetBlockCountFailed Set block count failed.
  382. * @retval kStatus_SDMMC_WaitWriteCompleteFailed Send status failed.
  383. * @retval kStatus_SDMMC_TransferFailed Transfer failed.
  384. * @retval kStatus_SDMMC_StopTransmissionFailed Stop transmission failed.
  385. * @retval kStatus_Success Operate successfully.
  386. */
  387. status_t MMC_WriteBlocks(mmc_card_t *card, const uint8_t *buffer, uint32_t startBlock, uint32_t blockCount);
  388. /*!
  389. * @brief Erases groups of the card.
  390. *
  391. * Erase group is the smallest erase unit in MMC card. The erase range is [startGroup, endGroup].
  392. *
  393. * @param card Card descriptor.
  394. * @param startGroup Start group number.
  395. * @param endGroup End group number.
  396. * @retval kStatus_InvalidArgument Invalid argument.
  397. * @retval kStatus_SDMMC_WaitWriteCompleteFailed Send status failed.
  398. * @retval kStatus_SDMMC_TransferFailed Transfer failed.
  399. * @retval kStatus_Success Operate successfully.
  400. */
  401. status_t MMC_EraseGroups(mmc_card_t *card, uint32_t startGroup, uint32_t endGroup);
  402. /*!
  403. * @brief Selects the partition to access.
  404. *
  405. * @param card Card descriptor.
  406. * @param partitionNumber The partition number.
  407. * @retval kStatus_SDMMC_ConfigureExtendedCsdFailed Configure EXT_CSD failed.
  408. * @retval kStatus_Success Operate successfully.
  409. */
  410. status_t MMC_SelectPartition(mmc_card_t *card, mmc_access_partition_t partitionNumber);
  411. /*!
  412. * @brief Configures the boot activity of the card.
  413. *
  414. * @param card Card descriptor.
  415. * @param config Boot configuration structure.
  416. * @retval kStatus_SDMMC_NotSupportYet Not support now.
  417. * @retval kStatus_SDMMC_ConfigureExtendedCsdFailed Configure EXT_CSD failed.
  418. * @retval kStatus_SDMMC_ConfigureBootFailed Configure boot failed.
  419. * @retval kStatus_Success Operate successfully.
  420. */
  421. status_t MMC_SetBootConfig(mmc_card_t *card, const mmc_boot_config_t *config);
  422. /*!
  423. * @brief set SDIO card to inactive state
  424. *
  425. * @param card Card descriptor.
  426. * @retval kStatus_SDMMC_TransferFailed
  427. * @retval kStatus_Success
  428. */
  429. status_t SDIO_CardInActive(sdio_card_t *card);
  430. /*!
  431. * @brief IO direct write transfer function
  432. *
  433. * @param card Card descriptor.
  434. * @param function IO numner
  435. * @param register address
  436. * @param the data pinter to write
  437. * @param raw flag, indicate read after write or write only
  438. * @retval kStatus_SDMMC_TransferFailed
  439. * @retval kStatus_Success
  440. */
  441. status_t SDIO_IO_Write_Direct(sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *data, bool raw);
  442. /*!
  443. * @brief IO direct read transfer function
  444. *
  445. * @param card Card descriptor.
  446. * @param function IO number
  447. * @param register address
  448. * @param data pointer to read
  449. * @retval kStatus_SDMMC_TransferFailed
  450. * @retval kStatus_Success
  451. */
  452. status_t SDIO_IO_Read_Direct(sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *data);
  453. /*!
  454. * @brief IO extended write transfer function
  455. *
  456. * @param card Card descriptor.
  457. * @param function IO number
  458. * @param register address
  459. * @param data buffer to write
  460. * @param data count
  461. * @param write flags
  462. * @retval kStatus_SDMMC_TransferFailed
  463. * @retval kStatus_SDMMC_SDIO_InvalidArgument
  464. * @retval kStatus_Success
  465. */
  466. status_t SDIO_IO_Write_Extended(
  467. sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *buffer, uint32_t count, uint32_t flags);
  468. /*!
  469. * @brief IO extended read transfer function
  470. *
  471. * @param card Card descriptor.
  472. * @param function IO number
  473. * @param register address
  474. * @param data buffer to read
  475. * @param data count
  476. * @param write flags
  477. * @retval kStatus_SDMMC_TransferFailed
  478. * @retval kStatus_SDMMC_SDIO_InvalidArgument
  479. * @retval kStatus_Success
  480. */
  481. status_t SDIO_IO_Read_Extended(
  482. sdio_card_t *card, sdio_func_num_t func, uint32_t regAddr, uint8_t *buffer, uint32_t count, uint32_t flags);
  483. /*!
  484. * @brief get SDIO card capability
  485. *
  486. * @param card Card descriptor.
  487. * @param function IO number
  488. * @retval kStatus_SDMMC_TransferFailed
  489. * @retval kStatus_Success
  490. */
  491. status_t SDIO_GetCardCapability(sdio_card_t *card, sdio_func_num_t func);
  492. /*!
  493. * @brief set SDIO card block size
  494. *
  495. * @param card Card descriptor.
  496. * @param function io number
  497. * @param block size
  498. * @retval kStatus_SDMMC_SetCardBlockSizeFailed
  499. * @retval kStatus_SDMMC_SDIO_InvalidArgument
  500. * @retval kStatus_Success
  501. */
  502. status_t SDIO_SetBlockSize(sdio_card_t *card, sdio_func_num_t func, uint32_t blockSize);
  503. /*!
  504. * @brief set SDIO card reset
  505. *
  506. * @param card Card descriptor.
  507. * @retval kStatus_SDMMC_TransferFailed
  508. * @retval kStatus_Success
  509. */
  510. status_t SDIO_CardReset(sdio_card_t *card);
  511. /*!
  512. * @brief set SDIO card data bus width
  513. *
  514. * @param card Card descriptor.
  515. * @param data bus width
  516. * @retval kStatus_SDMMC_TransferFailed
  517. * @retval kStatus_Success
  518. */
  519. status_t SDIO_SetDataBusWidth(sdio_card_t *card, sdio_bus_width_t busWidth);
  520. /*!
  521. * @brief switch the card to high speed
  522. *
  523. * @param card Card descriptor.
  524. * @retval kStatus_SDMMC_TransferFailed
  525. * @retval kStatus_SDMMC_SDIO_SwitchHighSpeedFail
  526. * @retval kStatus_Success
  527. */
  528. status_t SDIO_SwitchToHighSpeed(sdio_card_t *card);
  529. /*!
  530. * @brief read SDIO card CIS for each function
  531. *
  532. * @param card Card descriptor.
  533. * @param function io number
  534. * @param tuple code list
  535. * @param tuple code number
  536. * @retval kStatus_SDMMC_SDIO_ReadCISFail
  537. * @retval kStatus_SDMMC_TransferFailed
  538. * @retval kStatus_Success
  539. */
  540. status_t SDIO_ReadCIS(sdio_card_t *card, sdio_func_num_t func, const uint32_t *tupleList, uint32_t tupleNum);
  541. /*!
  542. * @brief SDIO card init function
  543. *
  544. * @param card Card descriptor.
  545. * @retval kStatus_SDMMC_GoIdleFailed
  546. * @retval kStatus_SDMMC_HandShakeOperationConditionFailed
  547. * @retval kStatus_SDMMC_SDIO_InvalidCard
  548. * @retval kStatus_SDMMC_SDIO_InvalidVoltage
  549. * @retval kStatus_SDMMC_SendRelativeAddressFailed
  550. * @retval kStatus_SDMMC_SelectCardFailed
  551. * @retval kStatus_SDMMC_SDIO_SwitchHighSpeedFail
  552. * @retval kStatus_SDMMC_SDIO_ReadCISFail
  553. * @retval kStatus_SDMMC_TransferFailed
  554. * @retval kStatus_Success
  555. */
  556. status_t SDIO_Init(sdio_card_t *card);
  557. /*!
  558. * @brief enable IO interrupt
  559. *
  560. * @param card Card descriptor.
  561. * @param function IO number
  562. * @param enable/disable flag
  563. * @retval kStatus_SDMMC_TransferFailed
  564. * @retval kStatus_Success
  565. */
  566. status_t SDIO_EnableIOInterrupt(sdio_card_t *card, sdio_func_num_t func, bool enable);
  567. /*!
  568. * @brief enable IO and wait IO ready
  569. *
  570. * @param card Card descriptor.
  571. * @param function IO number
  572. * @param enable/disable flag
  573. * @retval kStatus_SDMMC_TransferFailed
  574. * @retval kStatus_Success
  575. */
  576. status_t SDIO_EnableIO(sdio_card_t *card, sdio_func_num_t func, bool enable);
  577. /*!
  578. * @brief select IO
  579. *
  580. * @param card Card descriptor.
  581. * @param function IO number
  582. * @retval kStatus_SDMMC_TransferFailed
  583. * @retval kStatus_Success
  584. */
  585. status_t SDIO_SelectIO(sdio_card_t *card, sdio_func_num_t func);
  586. /*!
  587. * @brief Abort IO transfer
  588. *
  589. * @param card Card descriptor.
  590. * @param function IO number
  591. * @retval kStatus_SDMMC_TransferFailed
  592. * @retval kStatus_Success
  593. */
  594. status_t SDIO_AbortIO(sdio_card_t *card, sdio_func_num_t func);
  595. /*!
  596. * @brief SDIO card deinit
  597. *
  598. * @param card Card descriptor.
  599. */
  600. void SDIO_DeInit(sdio_card_t *card);
  601. /* @} */
  602. #if defined(__cplusplus)
  603. }
  604. #endif
  605. /*! @} */
  606. #endif /* _FSL_CARD_H_*/