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