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