266#ifdef HAL_MMC_MODULE_ENABLED
275#if defined (VDD_VALUE) && (VDD_VALUE <= 1950U)
276#define MMC_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE
278#define MMC_EXT_CSD_PWR_CL_26_INDEX 201
279#define MMC_EXT_CSD_PWR_CL_52_INDEX 200
280#define MMC_EXT_CSD_PWR_CL_DDR_52_INDEX 238
282#define MMC_EXT_CSD_PWR_CL_26_POS 8
283#define MMC_EXT_CSD_PWR_CL_52_POS 0
284#define MMC_EXT_CSD_PWR_CL_DDR_52_POS 16
286#define MMC_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE
288#define MMC_EXT_CSD_PWR_CL_26_INDEX 203
289#define MMC_EXT_CSD_PWR_CL_52_INDEX 202
290#define MMC_EXT_CSD_PWR_CL_DDR_52_INDEX 239
292#define MMC_EXT_CSD_PWR_CL_26_POS 24
293#define MMC_EXT_CSD_PWR_CL_52_POS 16
294#define MMC_EXT_CSD_PWR_CL_DDR_52_POS 24
298#define MMC_INIT_FREQ 400000U
310static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc);
311static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc);
312static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus);
313static uint32_t MMC_ReadExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pFieldData, uint16_t FieldIndex, uint32_t Timeout);
314static void MMC_PowerOFF(MMC_HandleTypeDef *hmmc);
315static void MMC_Write_IT(MMC_HandleTypeDef *hmmc);
316static void MMC_Read_IT(MMC_HandleTypeDef *hmmc);
322static uint32_t MMC_PwrClassUpdate(MMC_HandleTypeDef *hmmc, uint32_t Wide);
363 assert_param(IS_SDIO_CLOCK_BYPASS(hmmc->Init.ClockBypass));
364 assert_param(IS_SDIO_CLOCK_POWER_SAVE(hmmc->Init.ClockPowerSave));
366 assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hmmc->Init.HardwareFlowControl));
369 if(hmmc->State == HAL_MMC_STATE_RESET)
373#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
375 hmmc->TxCpltCallback = HAL_MMC_TxCpltCallback;
376 hmmc->RxCpltCallback = HAL_MMC_RxCpltCallback;
377 hmmc->ErrorCallback = HAL_MMC_ErrorCallback;
378 hmmc->AbortCpltCallback = HAL_MMC_AbortCallback;
380 if(hmmc->MspInitCallback == NULL)
382 hmmc->MspInitCallback = HAL_MMC_MspInit;
386 hmmc->MspInitCallback(hmmc);
389 HAL_MMC_MspInit(hmmc);
393 hmmc->State = HAL_MMC_STATE_BUSY;
402 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
405 hmmc->Context = MMC_CONTEXT_NONE;
408 hmmc->State = HAL_MMC_STATE_READY;
411 if (hmmc->Init.BusWide != SDIO_BUS_WIDE_1B)
413 if (HAL_MMC_ConfigWideBusOperation(hmmc, hmmc->Init.BusWide) !=
HAL_OK)
432 MMC_InitTypeDef Init;
436 Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
437 Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
438 Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
439 Init.BusWide = SDIO_BUS_WIDE_1B;
440 Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
441 Init.ClockDiv = SDIO_INIT_CLK_DIV;
444 status = SDIO_Init(hmmc->Instance, Init);
451 __HAL_MMC_DISABLE(hmmc);
454 status = SDIO_PowerState_ON(hmmc->Instance);
461 __HAL_MMC_ENABLE(hmmc);
467 errorstate = MMC_PowerON(hmmc);
468 if(errorstate != HAL_MMC_ERROR_NONE)
470 hmmc->State = HAL_MMC_STATE_READY;
471 hmmc->ErrorCode |= errorstate;
476 errorstate = MMC_InitCard(hmmc);
477 if(errorstate != HAL_MMC_ERROR_NONE)
479 hmmc->State = HAL_MMC_STATE_READY;
480 hmmc->ErrorCode |= errorstate;
485 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, MMC_BLOCKSIZE);
486 if(errorstate != HAL_MMC_ERROR_NONE)
489 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
490 hmmc->ErrorCode |= errorstate;
491 hmmc->State = HAL_MMC_STATE_READY;
514 hmmc->State = HAL_MMC_STATE_BUSY;
519#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
520 if(hmmc->MspDeInitCallback == NULL)
522 hmmc->MspDeInitCallback = HAL_MMC_MspDeInit;
526 hmmc->MspDeInitCallback(hmmc);
529 HAL_MMC_MspDeInit(hmmc);
532 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
533 hmmc->State = HAL_MMC_STATE_RESET;
544__weak
void HAL_MMC_MspInit(MMC_HandleTypeDef *hmmc)
559__weak
void HAL_MMC_MspDeInit(MMC_HandleTypeDef *hmmc)
600HAL_StatusTypeDef HAL_MMC_ReadBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
602 SDIO_DataInitTypeDef config;
605 uint32_t count, data, dataremaining;
606 uint32_t add = BlockAdd;
607 uint8_t *tempbuff = pData;
611 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
615 if(hmmc->State == HAL_MMC_STATE_READY)
617 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
619 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
621 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
625 hmmc->State = HAL_MMC_STATE_BUSY;
628 hmmc->Instance->DCTRL = 0U;
630 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
636 config.DataTimeOut = SDMMC_DATATIMEOUT;
637 config.DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
638 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
639 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
640 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
641 config.DPSM = SDIO_DPSM_ENABLE;
642 (void)SDIO_ConfigData(hmmc->Instance, &config);
645 if(NumberOfBlocks > 1U)
647 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
650 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, add);
654 hmmc->Context = MMC_CONTEXT_READ_SINGLE_BLOCK;
657 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, add);
659 if(errorstate != HAL_MMC_ERROR_NONE)
662 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
663 hmmc->ErrorCode |= errorstate;
664 hmmc->State = HAL_MMC_STATE_READY;
669 dataremaining = config.DataLength;
670#if defined(SDIO_STA_STBITERR)
671 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
673 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
676 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF) && (dataremaining > 0U))
679 for(count = 0U; count < 8U; count++)
681 data = SDIO_ReadFIFO(hmmc->Instance);
682 *tempbuff = (uint8_t)(data & 0xFFU);
685 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
688 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
691 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
697 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
700 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
701 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
702 hmmc->State= HAL_MMC_STATE_READY;
708 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
711 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
712 if(errorstate != HAL_MMC_ERROR_NONE)
715 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
716 hmmc->ErrorCode |= errorstate;
717 hmmc->State = HAL_MMC_STATE_READY;
723 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
726 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
727 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
728 hmmc->State = HAL_MMC_STATE_READY;
731 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
734 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
735 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
736 hmmc->State = HAL_MMC_STATE_READY;
739 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR))
742 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
743 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
744 hmmc->State = HAL_MMC_STATE_READY;
753 while ((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXDAVL)) && (dataremaining > 0U))
755 data = SDIO_ReadFIFO(hmmc->Instance);
756 *tempbuff = (uint8_t)(data & 0xFFU);
759 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
762 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
765 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
769 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
772 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
773 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
774 hmmc->State= HAL_MMC_STATE_READY;
780 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
782 hmmc->State = HAL_MMC_STATE_READY;
788 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
805HAL_StatusTypeDef HAL_MMC_WriteBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
807 SDIO_DataInitTypeDef config;
810 uint32_t count, data, dataremaining;
811 uint32_t add = BlockAdd;
812 uint8_t *tempbuff = pData;
816 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
820 if(hmmc->State == HAL_MMC_STATE_READY)
822 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
824 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
826 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
830 hmmc->State = HAL_MMC_STATE_BUSY;
833 hmmc->Instance->DCTRL = 0U;
835 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
841 if(NumberOfBlocks > 1U)
843 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
846 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, add);
850 hmmc->Context = MMC_CONTEXT_WRITE_SINGLE_BLOCK;
853 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, add);
855 if(errorstate != HAL_MMC_ERROR_NONE)
858 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
859 hmmc->ErrorCode |= errorstate;
860 hmmc->State = HAL_MMC_STATE_READY;
865 config.DataTimeOut = SDMMC_DATATIMEOUT;
866 config.DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
867 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
868 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
869 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
870 config.DPSM = SDIO_DPSM_ENABLE;
871 (void)SDIO_ConfigData(hmmc->Instance, &config);
874 dataremaining = config.DataLength;
875#if defined(SDIO_STA_STBITERR)
876 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
878 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
881 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXFIFOHE) && (dataremaining > 0U))
884 for(count = 0U; count < 8U; count++)
886 data = (uint32_t)(*tempbuff);
889 data |= ((uint32_t)(*tempbuff) << 8U);
892 data |= ((uint32_t)(*tempbuff) << 16U);
895 data |= ((uint32_t)(*tempbuff) << 24U);
898 (void)SDIO_WriteFIFO(hmmc->Instance, &data);
902 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
905 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
906 hmmc->ErrorCode |= errorstate;
907 hmmc->State = HAL_MMC_STATE_READY;
913 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
916 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
917 if(errorstate != HAL_MMC_ERROR_NONE)
920 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
921 hmmc->ErrorCode |= errorstate;
922 hmmc->State = HAL_MMC_STATE_READY;
928 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
931 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
932 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
933 hmmc->State = HAL_MMC_STATE_READY;
936 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
939 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
940 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
941 hmmc->State = HAL_MMC_STATE_READY;
944 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR))
947 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
948 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
949 hmmc->State = HAL_MMC_STATE_READY;
958 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
960 hmmc->State = HAL_MMC_STATE_READY;
966 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
984HAL_StatusTypeDef HAL_MMC_ReadBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
986 SDIO_DataInitTypeDef config;
988 uint32_t add = BlockAdd;
992 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
996 if(hmmc->State == HAL_MMC_STATE_READY)
998 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1000 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1002 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1006 hmmc->State = HAL_MMC_STATE_BUSY;
1009 hmmc->Instance->DCTRL = 0U;
1011 hmmc->pRxBuffPtr = pData;
1012 hmmc->RxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
1014#if defined(SDIO_STA_STBITERR)
1015 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF | SDIO_IT_STBITERR));
1017 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));
1020 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1026 config.DataTimeOut = SDMMC_DATATIMEOUT;
1027 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1028 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1029 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1030 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1031 config.DPSM = SDIO_DPSM_ENABLE;
1032 (void)SDIO_ConfigData(hmmc->Instance, &config);
1035 if(NumberOfBlocks > 1U)
1037 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_IT);
1040 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, add);
1044 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_IT);
1047 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, add);
1050 if(errorstate != HAL_MMC_ERROR_NONE)
1053 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1054 hmmc->ErrorCode |= errorstate;
1055 hmmc->State = HAL_MMC_STATE_READY;
1080HAL_StatusTypeDef HAL_MMC_WriteBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1082 SDIO_DataInitTypeDef config;
1083 uint32_t errorstate;
1084 uint32_t add = BlockAdd;
1088 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1092 if(hmmc->State == HAL_MMC_STATE_READY)
1094 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1096 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1098 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1102 hmmc->State = HAL_MMC_STATE_BUSY;
1105 hmmc->Instance->DCTRL = 0U;
1107 hmmc->pTxBuffPtr = pData;
1108 hmmc->TxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
1111#if defined(SDIO_STA_STBITERR)
1112 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_STBITERR));
1114 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE));
1117 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1123 if(NumberOfBlocks > 1U)
1125 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK| MMC_CONTEXT_IT);
1128 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, add);
1132 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_IT);
1135 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, add);
1137 if(errorstate != HAL_MMC_ERROR_NONE)
1140 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1141 hmmc->ErrorCode |= errorstate;
1142 hmmc->State = HAL_MMC_STATE_READY;
1147 config.DataTimeOut = SDMMC_DATATIMEOUT;
1148 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1149 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1150 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1151 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1152 config.DPSM = SDIO_DPSM_ENABLE;
1153 (void)SDIO_ConfigData(hmmc->Instance, &config);
1176HAL_StatusTypeDef HAL_MMC_ReadBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1178 SDIO_DataInitTypeDef config;
1179 uint32_t errorstate;
1180 uint32_t add = BlockAdd;
1184 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1188 if(hmmc->State == HAL_MMC_STATE_READY)
1190 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1192 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1194 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1198 hmmc->State = HAL_MMC_STATE_BUSY;
1201 hmmc->Instance->DCTRL = 0U;
1203#if defined(SDIO_STA_STBITERR)
1204 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_IT_STBITERR));
1206 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1210 hmmc->hdmarx->XferCpltCallback = MMC_DMAReceiveCplt;
1213 hmmc->hdmarx->XferErrorCallback = MMC_DMAError;
1216 hmmc->hdmarx->XferAbortCallback = NULL;
1218 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1225 MODIFY_REG(hmmc->hdmarx->Instance->CR, DMA_SxCR_DIR, hmmc->hdmarx->Init.Direction);
1228 if(
HAL_DMA_Start_IT(hmmc->hdmarx, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)pData, (uint32_t)(MMC_BLOCKSIZE * NumberOfBlocks)/4) !=
HAL_OK)
1230 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1231 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1232 hmmc->ErrorCode = HAL_MMC_ERROR_DMA;
1233 hmmc->State = HAL_MMC_STATE_READY;
1239 __HAL_MMC_DMA_ENABLE(hmmc);
1242 config.DataTimeOut = SDMMC_DATATIMEOUT;
1243 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1244 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1245 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
1246 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1247 config.DPSM = SDIO_DPSM_ENABLE;
1248 (void)SDIO_ConfigData(hmmc->Instance, &config);
1251 if(NumberOfBlocks > 1U)
1253 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
1256 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, add);
1260 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_DMA);
1263 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, add);
1265 if(errorstate != HAL_MMC_ERROR_NONE)
1268 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1269 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1270 hmmc->ErrorCode = errorstate;
1271 hmmc->State = HAL_MMC_STATE_READY;
1297HAL_StatusTypeDef HAL_MMC_WriteBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1299 SDIO_DataInitTypeDef config;
1300 uint32_t errorstate;
1301 uint32_t add = BlockAdd;
1305 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1309 if(hmmc->State == HAL_MMC_STATE_READY)
1311 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1313 if((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1315 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1319 hmmc->State = HAL_MMC_STATE_BUSY;
1322 hmmc->Instance->DCTRL = 0U;
1325#if defined(SDIO_STA_STBITERR)
1326 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR));
1328 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1332 hmmc->hdmatx->XferCpltCallback = MMC_DMATransmitCplt;
1335 hmmc->hdmatx->XferErrorCallback = MMC_DMAError;
1338 hmmc->hdmatx->XferAbortCallback = NULL;
1340 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1347 if(NumberOfBlocks > 1U)
1349 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
1352 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, add);
1356 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_DMA);
1359 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, add);
1361 if(errorstate != HAL_MMC_ERROR_NONE)
1364 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1365 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND));
1366 hmmc->ErrorCode |= errorstate;
1367 hmmc->State = HAL_MMC_STATE_READY;
1372 __HAL_MMC_DMA_ENABLE(hmmc);
1376 MODIFY_REG(hmmc->hdmatx->Instance->CR, DMA_SxCR_DIR, hmmc->hdmatx->Init.Direction);
1379 if(
HAL_DMA_Start_IT(hmmc->hdmatx, (uint32_t)pData, (uint32_t)&hmmc->Instance->FIFO, (uint32_t)(MMC_BLOCKSIZE * NumberOfBlocks)/4) !=
HAL_OK)
1381 __HAL_MMC_DISABLE_IT(hmmc, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND));
1382 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1383 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
1384 hmmc->State = HAL_MMC_STATE_READY;
1390 config.DataTimeOut = SDMMC_DATATIMEOUT;
1391 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1392 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1393 config.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
1394 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
1395 config.DPSM = SDIO_DPSM_ENABLE;
1396 (void)SDIO_ConfigData(hmmc->Instance, &config);
1416HAL_StatusTypeDef HAL_MMC_Erase(MMC_HandleTypeDef *hmmc, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
1418 uint32_t errorstate;
1419 uint32_t start_add = BlockStartAdd;
1420 uint32_t end_add = BlockEndAdd;
1422 if(hmmc->State == HAL_MMC_STATE_READY)
1424 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1426 if(end_add < start_add)
1428 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1432 if(end_add > (hmmc->MmcCard.LogBlockNbr))
1434 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1438 hmmc->State = HAL_MMC_STATE_BUSY;
1441 if(((hmmc->MmcCard.Class) & SDIO_CCCC_ERASE) == 0U)
1444 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1445 hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
1446 hmmc->State = HAL_MMC_STATE_READY;
1450 if((SDIO_GetResponse(hmmc->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1453 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1454 hmmc->ErrorCode |= HAL_MMC_ERROR_LOCK_UNLOCK_FAILED;
1455 hmmc->State = HAL_MMC_STATE_READY;
1459 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1466 errorstate = SDMMC_CmdEraseStartAdd(hmmc->Instance, start_add);
1467 if(errorstate != HAL_MMC_ERROR_NONE)
1470 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1471 hmmc->ErrorCode |= errorstate;
1472 hmmc->State = HAL_MMC_STATE_READY;
1477 errorstate = SDMMC_CmdEraseEndAdd(hmmc->Instance, end_add);
1478 if(errorstate != HAL_MMC_ERROR_NONE)
1481 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1482 hmmc->ErrorCode |= errorstate;
1483 hmmc->State = HAL_MMC_STATE_READY;
1488 errorstate = SDMMC_CmdErase(hmmc->Instance);
1489 if(errorstate != HAL_MMC_ERROR_NONE)
1492 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
1493 hmmc->ErrorCode |= errorstate;
1494 hmmc->State = HAL_MMC_STATE_READY;
1498 hmmc->State = HAL_MMC_STATE_READY;
1513void HAL_MMC_IRQHandler(MMC_HandleTypeDef *hmmc)
1515 uint32_t errorstate;
1516 uint32_t context = hmmc->Context;
1519 if((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF) != RESET) && ((context & MMC_CONTEXT_IT) != 0U))
1524 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DATAEND) != RESET)
1526 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_FLAG_DATAEND);
1528#if defined(SDIO_STA_STBITERR)
1529 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1530 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1532 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT |\
1533 SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR | SDIO_IT_TXFIFOHE |\
1537 hmmc->Instance->DCTRL &= ~(SDIO_DCTRL_DTEN);
1539 if((context & MMC_CONTEXT_DMA) != 0U)
1541 if((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1543 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
1544 if(errorstate != HAL_MMC_ERROR_NONE)
1546 hmmc->ErrorCode |= errorstate;
1547#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1548 hmmc->ErrorCallback(hmmc);
1550 HAL_MMC_ErrorCallback(hmmc);
1556 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
1558 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
1559 hmmc->State = HAL_MMC_STATE_READY;
1560 hmmc->Context = MMC_CONTEXT_NONE;
1561 if(((context & MMC_CONTEXT_READ_SINGLE_BLOCK) == 0U) && ((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) == 0U))
1563#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1564 hmmc->TxCpltCallback(hmmc);
1566 HAL_MMC_TxCpltCallback(hmmc);
1570 else if((context & MMC_CONTEXT_IT) != 0U)
1573 if(((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1575 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
1576 if(errorstate != HAL_MMC_ERROR_NONE)
1578 hmmc->ErrorCode |= errorstate;
1579#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1580 hmmc->ErrorCallback(hmmc);
1582 HAL_MMC_ErrorCallback(hmmc);
1588 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
1590 hmmc->State = HAL_MMC_STATE_READY;
1591 if(((context & MMC_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1593#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1594 hmmc->RxCpltCallback(hmmc);
1596 HAL_MMC_RxCpltCallback(hmmc);
1601#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1602 hmmc->TxCpltCallback(hmmc);
1604 HAL_MMC_TxCpltCallback(hmmc);
1614 else if((__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXFIFOHE) != RESET) && ((context & MMC_CONTEXT_IT) != 0U))
1619#if defined(SDIO_STA_STBITERR)
1620 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR | SDIO_FLAG_STBITERR) != RESET)
1622 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR) != RESET)
1626 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL) != RESET)
1628 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
1630 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT) != RESET)
1632 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
1634 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR) != RESET)
1636 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
1638 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_TXUNDERR) != RESET)
1640 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
1642#if defined(SDIO_STA_STBITERR)
1643 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_STBITERR) != RESET)
1645 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
1649#if defined(SDIO_STA_STBITERR)
1651 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS | SDIO_FLAG_STBITERR);
1654 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1655 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1658 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
1661 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1662 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
1665 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
1667 if((context & MMC_CONTEXT_IT) != 0U)
1670 hmmc->State = HAL_MMC_STATE_READY;
1671#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1672 hmmc->ErrorCallback(hmmc);
1674 HAL_MMC_ErrorCallback(hmmc);
1677 else if((context & MMC_CONTEXT_DMA) != 0U)
1680 if(((context & MMC_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1682 if(hmmc->hdmatx != NULL)
1685 hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort;
1689 MMC_DMATxAbort(hmmc->hdmatx);
1693 else if(((context & MMC_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1695 if(hmmc->hdmarx != NULL)
1698 hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort;
1702 MMC_DMARxAbort(hmmc->hdmarx);
1708 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1709 hmmc->State = HAL_MMC_STATE_READY;
1710#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1711 hmmc->AbortCpltCallback(hmmc);
1713 HAL_MMC_AbortCallback(hmmc);
1734HAL_MMC_StateTypeDef HAL_MMC_GetState(MMC_HandleTypeDef *hmmc)
1745uint32_t HAL_MMC_GetError(MMC_HandleTypeDef *hmmc)
1747 return hmmc->ErrorCode;
1755__weak
void HAL_MMC_TxCpltCallback(MMC_HandleTypeDef *hmmc)
1770__weak
void HAL_MMC_RxCpltCallback(MMC_HandleTypeDef *hmmc)
1785__weak
void HAL_MMC_ErrorCallback(MMC_HandleTypeDef *hmmc)
1800__weak
void HAL_MMC_AbortCallback(MMC_HandleTypeDef *hmmc)
1810#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1826HAL_StatusTypeDef HAL_MMC_RegisterCallback(MMC_HandleTypeDef *hmmc, HAL_MMC_CallbackIDTypeDef CallbackId, pMMC_CallbackTypeDef pCallback)
1830 if(pCallback == NULL)
1833 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1840 if(hmmc->State == HAL_MMC_STATE_READY)
1844 case HAL_MMC_TX_CPLT_CB_ID :
1845 hmmc->TxCpltCallback = pCallback;
1847 case HAL_MMC_RX_CPLT_CB_ID :
1848 hmmc->RxCpltCallback = pCallback;
1850 case HAL_MMC_ERROR_CB_ID :
1851 hmmc->ErrorCallback = pCallback;
1853 case HAL_MMC_ABORT_CB_ID :
1854 hmmc->AbortCpltCallback = pCallback;
1856 case HAL_MMC_MSP_INIT_CB_ID :
1857 hmmc->MspInitCallback = pCallback;
1859 case HAL_MMC_MSP_DEINIT_CB_ID :
1860 hmmc->MspDeInitCallback = pCallback;
1864 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1870 else if (hmmc->State == HAL_MMC_STATE_RESET)
1874 case HAL_MMC_MSP_INIT_CB_ID :
1875 hmmc->MspInitCallback = pCallback;
1877 case HAL_MMC_MSP_DEINIT_CB_ID :
1878 hmmc->MspDeInitCallback = pCallback;
1882 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1891 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1915HAL_StatusTypeDef HAL_MMC_UnRegisterCallback(MMC_HandleTypeDef *hmmc, HAL_MMC_CallbackIDTypeDef CallbackId)
1922 if(hmmc->State == HAL_MMC_STATE_READY)
1926 case HAL_MMC_TX_CPLT_CB_ID :
1927 hmmc->TxCpltCallback = HAL_MMC_TxCpltCallback;
1929 case HAL_MMC_RX_CPLT_CB_ID :
1930 hmmc->RxCpltCallback = HAL_MMC_RxCpltCallback;
1932 case HAL_MMC_ERROR_CB_ID :
1933 hmmc->ErrorCallback = HAL_MMC_ErrorCallback;
1935 case HAL_MMC_ABORT_CB_ID :
1936 hmmc->AbortCpltCallback = HAL_MMC_AbortCallback;
1938 case HAL_MMC_MSP_INIT_CB_ID :
1939 hmmc->MspInitCallback = HAL_MMC_MspInit;
1941 case HAL_MMC_MSP_DEINIT_CB_ID :
1942 hmmc->MspDeInitCallback = HAL_MMC_MspDeInit;
1946 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1952 else if (hmmc->State == HAL_MMC_STATE_RESET)
1956 case HAL_MMC_MSP_INIT_CB_ID :
1957 hmmc->MspInitCallback = HAL_MMC_MspInit;
1959 case HAL_MMC_MSP_DEINIT_CB_ID :
1960 hmmc->MspDeInitCallback = HAL_MMC_MspDeInit;
1964 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1973 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2011HAL_StatusTypeDef HAL_MMC_GetCardCID(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCIDTypeDef *pCID)
2013 pCID->ManufacturerID = (uint8_t)((hmmc->CID[0] & 0xFF000000U) >> 24U);
2015 pCID->OEM_AppliID = (uint16_t)((hmmc->CID[0] & 0x00FFFF00U) >> 8U);
2017 pCID->ProdName1 = (((hmmc->CID[0] & 0x000000FFU) << 24U) | ((hmmc->CID[1] & 0xFFFFFF00U) >> 8U));
2019 pCID->ProdName2 = (uint8_t)(hmmc->CID[1] & 0x000000FFU);
2021 pCID->ProdRev = (uint8_t)((hmmc->CID[2] & 0xFF000000U) >> 24U);
2023 pCID->ProdSN = (((hmmc->CID[2] & 0x00FFFFFFU) << 8U) | ((hmmc->CID[3] & 0xFF000000U) >> 24U));
2025 pCID->Reserved1 = (uint8_t)((hmmc->CID[3] & 0x00F00000U) >> 20U);
2027 pCID->ManufactDate = (uint16_t)((hmmc->CID[3] & 0x000FFF00U) >> 8U);
2029 pCID->CID_CRC = (uint8_t)((hmmc->CID[3] & 0x000000FEU) >> 1U);
2031 pCID->Reserved2 = 1U;
2044HAL_StatusTypeDef HAL_MMC_GetCardCSD(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCSDTypeDef *pCSD)
2046 uint32_t block_nbr = 0;
2048 pCSD->CSDStruct = (uint8_t)((hmmc->CSD[0] & 0xC0000000U) >> 30U);
2050 pCSD->SysSpecVersion = (uint8_t)((hmmc->CSD[0] & 0x3C000000U) >> 26U);
2052 pCSD->Reserved1 = (uint8_t)((hmmc->CSD[0] & 0x03000000U) >> 24U);
2054 pCSD->TAAC = (uint8_t)((hmmc->CSD[0] & 0x00FF0000U) >> 16U);
2056 pCSD->NSAC = (uint8_t)((hmmc->CSD[0] & 0x0000FF00U) >> 8U);
2058 pCSD->MaxBusClkFrec = (uint8_t)(hmmc->CSD[0] & 0x000000FFU);
2060 pCSD->CardComdClasses = (uint16_t)((hmmc->CSD[1] & 0xFFF00000U) >> 20U);
2062 pCSD->RdBlockLen = (uint8_t)((hmmc->CSD[1] & 0x000F0000U) >> 16U);
2064 pCSD->PartBlockRead = (uint8_t)((hmmc->CSD[1] & 0x00008000U) >> 15U);
2066 pCSD->WrBlockMisalign = (uint8_t)((hmmc->CSD[1] & 0x00004000U) >> 14U);
2068 pCSD->RdBlockMisalign = (uint8_t)((hmmc->CSD[1] & 0x00002000U) >> 13U);
2070 pCSD->DSRImpl = (uint8_t)((hmmc->CSD[1] & 0x00001000U) >> 12U);
2072 pCSD->Reserved2 = 0U;
2074 pCSD->DeviceSize = (((hmmc->CSD[1] & 0x000003FFU) << 2U) | ((hmmc->CSD[2] & 0xC0000000U) >> 30U));
2076 pCSD->MaxRdCurrentVDDMin = (uint8_t)((hmmc->CSD[2] & 0x38000000U) >> 27U);
2078 pCSD->MaxRdCurrentVDDMax = (uint8_t)((hmmc->CSD[2] & 0x07000000U) >> 24U);
2080 pCSD->MaxWrCurrentVDDMin = (uint8_t)((hmmc->CSD[2] & 0x00E00000U) >> 21U);
2082 pCSD->MaxWrCurrentVDDMax = (uint8_t)((hmmc->CSD[2] & 0x001C0000U) >> 18U);
2084 pCSD->DeviceSizeMul = (uint8_t)((hmmc->CSD[2] & 0x00038000U) >> 15U);
2086 if(MMC_ReadExtCSD(hmmc, &block_nbr, 212, 0x0FFFFFFFU) !=
HAL_OK)
2091 if(hmmc->MmcCard.CardType == MMC_LOW_CAPACITY_CARD)
2093 hmmc->MmcCard.BlockNbr = (pCSD->DeviceSize + 1U) ;
2094 hmmc->MmcCard.BlockNbr *= (1UL << ((pCSD->DeviceSizeMul & 0x07U) + 2U));
2095 hmmc->MmcCard.BlockSize = (1UL << (pCSD->RdBlockLen & 0x0FU));
2096 hmmc->MmcCard.LogBlockNbr = (hmmc->MmcCard.BlockNbr) * ((hmmc->MmcCard.BlockSize) / 512U);
2097 hmmc->MmcCard.LogBlockSize = 512U;
2099 else if(hmmc->MmcCard.CardType == MMC_HIGH_CAPACITY_CARD)
2101 hmmc->MmcCard.BlockNbr = block_nbr;
2102 hmmc->MmcCard.LogBlockNbr = hmmc->MmcCard.BlockNbr;
2103 hmmc->MmcCard.BlockSize = 512U;
2104 hmmc->MmcCard.LogBlockSize = hmmc->MmcCard.BlockSize;
2109 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2110 hmmc->ErrorCode |= HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
2111 hmmc->State = HAL_MMC_STATE_READY;
2115 pCSD->EraseGrSize = (uint8_t)((hmmc->CSD[2] & 0x00004000U) >> 14U);
2117 pCSD->EraseGrMul = (uint8_t)((hmmc->CSD[2] & 0x00003F80U) >> 7U);
2119 pCSD->WrProtectGrSize = (uint8_t)(hmmc->CSD[2] & 0x0000007FU);
2121 pCSD->WrProtectGrEnable = (uint8_t)((hmmc->CSD[3] & 0x80000000U) >> 31U);
2123 pCSD->ManDeflECC = (uint8_t)((hmmc->CSD[3] & 0x60000000U) >> 29U);
2125 pCSD->WrSpeedFact = (uint8_t)((hmmc->CSD[3] & 0x1C000000U) >> 26U);
2127 pCSD->MaxWrBlockLen= (uint8_t)((hmmc->CSD[3] & 0x03C00000U) >> 22U);
2129 pCSD->WriteBlockPaPartial = (uint8_t)((hmmc->CSD[3] & 0x00200000U) >> 21U);
2131 pCSD->Reserved3 = 0;
2133 pCSD->ContentProtectAppli = (uint8_t)((hmmc->CSD[3] & 0x00010000U) >> 16U);
2135 pCSD->FileFormatGroup = (uint8_t)((hmmc->CSD[3] & 0x00008000U) >> 15U);
2137 pCSD->CopyFlag = (uint8_t)((hmmc->CSD[3] & 0x00004000U) >> 14U);
2139 pCSD->PermWrProtect = (uint8_t)((hmmc->CSD[3] & 0x00002000U) >> 13U);
2141 pCSD->TempWrProtect = (uint8_t)((hmmc->CSD[3] & 0x00001000U) >> 12U);
2143 pCSD->FileFormat = (uint8_t)((hmmc->CSD[3] & 0x00000C00U) >> 10U);
2145 pCSD->ECC= (uint8_t)((hmmc->CSD[3] & 0x00000300U) >> 8U);
2147 pCSD->CSD_CRC = (uint8_t)((hmmc->CSD[3] & 0x000000FEU) >> 1U);
2149 pCSD->Reserved4 = 1;
2161HAL_StatusTypeDef HAL_MMC_GetCardInfo(MMC_HandleTypeDef *hmmc, HAL_MMC_CardInfoTypeDef *pCardInfo)
2163 pCardInfo->CardType = (uint32_t)(hmmc->MmcCard.CardType);
2164 pCardInfo->Class = (uint32_t)(hmmc->MmcCard.Class);
2165 pCardInfo->RelCardAdd = (uint32_t)(hmmc->MmcCard.RelCardAdd);
2166 pCardInfo->BlockNbr = (uint32_t)(hmmc->MmcCard.BlockNbr);
2167 pCardInfo->BlockSize = (uint32_t)(hmmc->MmcCard.BlockSize);
2168 pCardInfo->LogBlockNbr = (uint32_t)(hmmc->MmcCard.LogBlockNbr);
2169 pCardInfo->LogBlockSize = (uint32_t)(hmmc->MmcCard.LogBlockSize);
2183HAL_StatusTypeDef HAL_MMC_GetCardExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pExtCSD, uint32_t Timeout)
2185 SDIO_DataInitTypeDef config;
2186 uint32_t errorstate;
2193 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
2197 if(hmmc->State == HAL_MMC_STATE_READY)
2199 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2201 hmmc->State = HAL_MMC_STATE_BUSY;
2204 hmmc->Instance->DCTRL = 0;
2210 config.DataTimeOut = SDMMC_DATATIMEOUT;
2211 config.DataLength = 512;
2212 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
2213 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
2214 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
2215 config.DPSM = SDIO_DPSM_ENABLE;
2216 (void)SDIO_ConfigData(hmmc->Instance, &config);
2219 errorstate = SDMMC_CmdSendEXTCSD(hmmc->Instance, 0);
2220 if(errorstate != HAL_MMC_ERROR_NONE)
2223 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2224 hmmc->ErrorCode |= errorstate;
2225 hmmc->State = HAL_MMC_STATE_READY;
2230 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
2232 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF))
2235 for(count = 0U; count < 8U; count++)
2237 *tmp_buf = SDIO_ReadFIFO(hmmc->Instance);
2242 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
2245 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2246 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
2247 hmmc->State= HAL_MMC_STATE_READY;
2253 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
2256 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2257 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
2258 hmmc->State = HAL_MMC_STATE_READY;
2261 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
2264 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2265 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
2266 hmmc->State = HAL_MMC_STATE_READY;
2269 else if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR))
2272 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2273 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
2274 hmmc->State = HAL_MMC_STATE_READY;
2283 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2284 hmmc->State = HAL_MMC_STATE_READY;
2301HAL_StatusTypeDef HAL_MMC_ConfigWideBusOperation(MMC_HandleTypeDef *hmmc, uint32_t WideMode)
2304 SDIO_InitTypeDef Init;
2305 uint32_t errorstate;
2306 uint32_t response = 0U;
2312 hmmc->State = HAL_MMC_STATE_BUSY;
2314 errorstate = MMC_PwrClassUpdate(hmmc, WideMode);
2316 if(errorstate == HAL_MMC_ERROR_NONE)
2318 if(WideMode == SDIO_BUS_WIDE_8B)
2320 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70200U);
2322 else if(WideMode == SDIO_BUS_WIDE_4B)
2324 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70100U);
2326 else if(WideMode == SDIO_BUS_WIDE_1B)
2328 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70000U);
2333 errorstate = HAL_MMC_ERROR_PARAM;
2337 if(errorstate == HAL_MMC_ERROR_NONE)
2340 count = SDMMC_MAX_TRIAL;
2343 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2344 if(errorstate != HAL_MMC_ERROR_NONE)
2350 response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
2352 }
while(((response & 0x100U) == 0U) && (count != 0U));
2355 if ((count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
2358 if ((response & 0x80U) != 0U)
2360 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
2366 Init.BusWide = WideMode;
2367 (void)SDIO_Init(hmmc->Instance, Init);
2370 else if (count == 0U)
2372 errorstate = SDMMC_ERROR_TIMEOUT;
2382 hmmc->State = HAL_MMC_STATE_READY;
2384 if(errorstate != HAL_MMC_ERROR_NONE)
2387 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2388 hmmc->ErrorCode |= errorstate;
2400HAL_MMC_CardStateTypeDef HAL_MMC_GetCardState(MMC_HandleTypeDef *hmmc)
2403 uint32_t errorstate;
2404 uint32_t resp1 = 0U;
2406 errorstate = MMC_SendStatus(hmmc, &resp1);
2407 if(errorstate != HAL_MMC_ERROR_NONE)
2409 hmmc->ErrorCode |= errorstate;
2412 cardstate = ((resp1 >> 9U) & 0x0FU);
2414 return (HAL_MMC_CardStateTypeDef)cardstate;
2425 HAL_MMC_CardStateTypeDef CardState;
2428 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2429 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2432 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2434 if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL))
2437 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2440 if(hmmc->hdmatx != NULL)
2444 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
2448 if(hmmc->hdmarx != NULL)
2452 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
2457 hmmc->State = HAL_MMC_STATE_READY;
2460 hmmc->Context = MMC_CONTEXT_NONE;
2462 CardState = HAL_MMC_GetCardState(hmmc);
2463 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2465 hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance);
2467 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
2482 HAL_MMC_CardStateTypeDef CardState;
2485 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2486 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2489 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2491 if((hmmc->hdmatx != NULL) || (hmmc->hdmarx != NULL))
2494 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2497 if(hmmc->hdmatx != NULL)
2499 hmmc->hdmatx->XferAbortCallback = MMC_DMATxAbort;
2502 hmmc->hdmatx = NULL;
2506 if(hmmc->hdmarx != NULL)
2508 hmmc->hdmarx->XferAbortCallback = MMC_DMARxAbort;
2511 hmmc->hdmarx = NULL;
2517 if((hmmc->hdmatx == NULL) && (hmmc->hdmarx == NULL))
2519 CardState = HAL_MMC_GetCardState(hmmc);
2520 hmmc->State = HAL_MMC_STATE_READY;
2522 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2524 hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance);
2526 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
2532#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2533 hmmc->AbortCpltCallback(hmmc);
2535 HAL_MMC_AbortCallback(hmmc);
2563 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->
Parent);
2566 __HAL_MMC_ENABLE_IT(hmmc, (SDIO_IT_DATAEND));
2576 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->
Parent);
2577 uint32_t errorstate;
2580 if(hmmc->Context == (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA))
2582 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
2583 if(errorstate != HAL_MMC_ERROR_NONE)
2585 hmmc->ErrorCode |= errorstate;
2586#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2587 hmmc->ErrorCallback(hmmc);
2589 HAL_MMC_ErrorCallback(hmmc);
2596 hmmc->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2599 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
2601 hmmc->State = HAL_MMC_STATE_READY;
2603#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2604 hmmc->RxCpltCallback(hmmc);
2606 HAL_MMC_RxCpltCallback(hmmc);
2617 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->
Parent);
2618 HAL_MMC_CardStateTypeDef CardState;
2619 uint32_t RxErrorCode, TxErrorCode;
2624 RxErrorCode = hmmc->hdmarx->ErrorCode;
2625 TxErrorCode = hmmc->hdmatx->ErrorCode;
2629 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2632 __HAL_MMC_DISABLE_IT(hmmc, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2633 SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2635 hmmc->ErrorCode |= HAL_MMC_ERROR_DMA;
2636 CardState = HAL_MMC_GetCardState(hmmc);
2637 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2639 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
2642 hmmc->State= HAL_MMC_STATE_READY;
2645#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2646 hmmc->ErrorCallback(hmmc);
2648 HAL_MMC_ErrorCallback(hmmc);
2660 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->
Parent);
2661 HAL_MMC_CardStateTypeDef CardState;
2663 if(hmmc->hdmatx != NULL)
2665 hmmc->hdmatx = NULL;
2669 if(hmmc->hdmarx == NULL)
2671 CardState = HAL_MMC_GetCardState(hmmc);
2672 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2673 hmmc->State = HAL_MMC_STATE_READY;
2674 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2676 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
2678 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
2680#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2681 hmmc->AbortCpltCallback(hmmc);
2683 HAL_MMC_AbortCallback(hmmc);
2688#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2689 hmmc->ErrorCallback(hmmc);
2691 HAL_MMC_ErrorCallback(hmmc);
2705 MMC_HandleTypeDef* hmmc = (MMC_HandleTypeDef* )(hdma->
Parent);
2706 HAL_MMC_CardStateTypeDef CardState;
2708 if(hmmc->hdmarx != NULL)
2710 hmmc->hdmarx = NULL;
2714 if(hmmc->hdmatx == NULL)
2716 CardState = HAL_MMC_GetCardState(hmmc);
2717 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2718 hmmc->State = HAL_MMC_STATE_READY;
2719 if((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2721 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
2723 if(hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
2725#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2726 hmmc->AbortCpltCallback(hmmc);
2728 HAL_MMC_AbortCallback(hmmc);
2733#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2734 hmmc->ErrorCallback(hmmc);
2736 HAL_MMC_ErrorCallback(hmmc);
2748static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc)
2750 HAL_MMC_CardCSDTypeDef CSD;
2751 uint32_t errorstate;
2752 uint16_t mmc_rca = 2U;
2753 MMC_InitTypeDef Init;
2756 if(SDIO_GetPowerState(hmmc->Instance) == 0U)
2759 return HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
2763 errorstate = SDMMC_CmdSendCID(hmmc->Instance);
2764 if(errorstate != HAL_MMC_ERROR_NONE)
2771 hmmc->CID[0U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
2772 hmmc->CID[1U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP2);
2773 hmmc->CID[2U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP3);
2774 hmmc->CID[3U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP4);
2779 errorstate = SDMMC_CmdSetRelAddMmc(hmmc->Instance, mmc_rca);
2780 if(errorstate != HAL_MMC_ERROR_NONE)
2786 hmmc->MmcCard.RelCardAdd = mmc_rca;
2789 errorstate = SDMMC_CmdSendCSD(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
2790 if(errorstate != HAL_MMC_ERROR_NONE)
2797 hmmc->CSD[0U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
2798 hmmc->CSD[1U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP2);
2799 hmmc->CSD[2U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP3);
2800 hmmc->CSD[3U] = SDIO_GetResponse(hmmc->Instance, SDIO_RESP4);
2804 hmmc->MmcCard.Class = (SDIO_GetResponse(hmmc->Instance, SDIO_RESP2) >> 20U);
2807 errorstate = SDMMC_CmdSelDesel(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2808 if(errorstate != HAL_MMC_ERROR_NONE)
2814 if (HAL_MMC_GetCardCSD(hmmc, &CSD) !=
HAL_OK)
2816 return hmmc->ErrorCode;
2820 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2821 if(errorstate != HAL_MMC_ERROR_NONE)
2823 hmmc->ErrorCode |= errorstate;
2827 if (HAL_MMC_GetCardExtCSD(hmmc, hmmc->Ext_CSD, SDMMC_DATATIMEOUT) !=
HAL_OK)
2829 return hmmc->ErrorCode;
2833 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2834 if(errorstate != HAL_MMC_ERROR_NONE)
2836 hmmc->ErrorCode |= errorstate;
2841 Init.BusWide = SDIO_BUS_WIDE_1B;
2842 (void)SDIO_Init(hmmc->Instance, Init);
2845 return HAL_MMC_ERROR_NONE;
2855static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc)
2857 __IO uint32_t count = 0U;
2858 uint32_t response = 0U, validvoltage = 0U;
2859 uint32_t errorstate;
2862 errorstate = SDMMC_CmdGoIdleState(hmmc->Instance);
2863 if(errorstate != HAL_MMC_ERROR_NONE)
2868 while(validvoltage == 0U)
2870 if(count++ == SDMMC_MAX_VOLT_TRIAL)
2872 return HAL_MMC_ERROR_INVALID_VOLTRANGE;
2876 errorstate = SDMMC_CmdOpCondition(hmmc->Instance, MMC_VOLTAGE_RANGE);
2877 if(errorstate != HAL_MMC_ERROR_NONE)
2879 return HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
2883 response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
2886 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
2890 if (((response & (0xFF000000U)) >> 24U) == 0xC0U)
2892 hmmc->MmcCard.CardType = MMC_HIGH_CAPACITY_CARD;
2896 hmmc->MmcCard.CardType = MMC_LOW_CAPACITY_CARD;
2899 return HAL_MMC_ERROR_NONE;
2907static void MMC_PowerOFF(MMC_HandleTypeDef *hmmc)
2910 (void)SDIO_PowerState_OFF(hmmc->Instance);
2920static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus)
2922 uint32_t errorstate;
2924 if(pCardStatus == NULL)
2926 return HAL_MMC_ERROR_PARAM;
2930 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
2931 if(errorstate != HAL_MMC_ERROR_NONE)
2937 *pCardStatus = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
2939 return HAL_MMC_ERROR_NONE;
2950static uint32_t MMC_ReadExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pFieldData, uint16_t FieldIndex, uint32_t Timeout)
2952 SDIO_DataInitTypeDef config;
2953 uint32_t errorstate;
2959 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2962 hmmc->Instance->DCTRL = 0;
2965 config.DataTimeOut = SDMMC_DATATIMEOUT;
2966 config.DataLength = 512;
2967 config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
2968 config.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
2969 config.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
2970 config.DPSM = SDIO_DPSM_ENABLE;
2971 (void)SDIO_ConfigData(hmmc->Instance, &config);
2974 errorstate = SDMMC_CmdSendEXTCSD(hmmc->Instance, 0);
2975 if(errorstate != HAL_MMC_ERROR_NONE)
2978 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
2979 hmmc->ErrorCode |= errorstate;
2980 hmmc->State = HAL_MMC_STATE_READY;
2985 while(!__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
2987 if(__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXFIFOHF))
2990 for(count = 0U; count < 8U; count++)
2992 tmp_data = SDIO_ReadFIFO(hmmc->Instance);
2995 if ((i + count) == ((uint32_t)FieldIndex/4U))
2997 *pFieldData = tmp_data;
3003 if(((
HAL_GetTick()-tickstart) >= Timeout) || (Timeout == 0U))
3006 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_FLAGS);
3007 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
3008 hmmc->State= HAL_MMC_STATE_READY;
3014 if (__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DTIMEOUT))
3017 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3018 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
3019 hmmc->State = HAL_MMC_STATE_READY;
3022 else if (__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_DCRCFAIL))
3025 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3026 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
3027 hmmc->State = HAL_MMC_STATE_READY;
3030 else if (__HAL_MMC_GET_FLAG(hmmc, SDIO_FLAG_RXOVERR))
3033 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3034 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
3035 hmmc->State = HAL_MMC_STATE_READY;
3044 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16));
3045 if(errorstate != HAL_MMC_ERROR_NONE)
3047 hmmc->ErrorCode |= errorstate;
3051 __HAL_MMC_CLEAR_FLAG(hmmc, SDIO_STATIC_DATA_FLAGS);
3053 hmmc->State = HAL_MMC_STATE_READY;
3065static void MMC_Read_IT(MMC_HandleTypeDef *hmmc)
3067 uint32_t count, data, dataremaining;
3070 tmp = hmmc->pRxBuffPtr;
3071 dataremaining = hmmc->RxXferSize;
3073 if (dataremaining > 0U)
3076 for(count = 0U; count < 8U; count++)
3078 data = SDIO_ReadFIFO(hmmc->Instance);
3079 *tmp = (uint8_t)(data & 0xFFU);
3082 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3085 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3088 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3093 hmmc->pRxBuffPtr = tmp;
3094 hmmc->RxXferSize = dataremaining;
3104static void MMC_Write_IT(MMC_HandleTypeDef *hmmc)
3106 uint32_t count, data, dataremaining;
3109 tmp = hmmc->pTxBuffPtr;
3110 dataremaining = hmmc->TxXferSize;
3112 if (dataremaining > 0U)
3115 for(count = 0U; count < 8U; count++)
3117 data = (uint32_t)(*tmp);
3120 data |= ((uint32_t)(*tmp) << 8U);
3123 data |= ((uint32_t)(*tmp) << 16U);
3126 data |= ((uint32_t)(*tmp) << 24U);
3129 (void)SDIO_WriteFIFO(hmmc->Instance, &data);
3132 hmmc->pTxBuffPtr = tmp;
3133 hmmc->TxXferSize = dataremaining;
3144static uint32_t MMC_PwrClassUpdate(MMC_HandleTypeDef *hmmc, uint32_t Wide)
3147 uint32_t response = 0U;
3148 uint32_t errorstate = HAL_MMC_ERROR_NONE;
3149 uint32_t power_class, supported_pwr_class;
3151 if((Wide == SDIO_BUS_WIDE_8B) || (Wide == SDIO_BUS_WIDE_4B))
3156 if(MMC_ReadExtCSD(hmmc, &power_class, 187, SDMMC_DATATIMEOUT) !=
HAL_OK)
3158 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
3162 power_class = ((power_class >> 24U) & 0x000000FFU);
3167 supported_pwr_class = ((hmmc->Ext_CSD[(MMC_EXT_CSD_PWR_CL_26_INDEX/4)] >> MMC_EXT_CSD_PWR_CL_26_POS) & 0x000000FFU);
3169 if(errorstate == HAL_MMC_ERROR_NONE)
3171 if(Wide == SDIO_BUS_WIDE_8B)
3174 supported_pwr_class = (supported_pwr_class >> 4U);
3177 if ((power_class & 0x0FU) != (supported_pwr_class & 0x0FU))
3180 errorstate = SDMMC_CmdSwitch(hmmc->Instance, (0x03BB0000U | ((supported_pwr_class & 0x0FU) << 8U)));
3182 if(errorstate == HAL_MMC_ERROR_NONE)
3185 count = SDMMC_MAX_TRIAL;
3188 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3189 if(errorstate != HAL_MMC_ERROR_NONE)
3195 response = SDIO_GetResponse(hmmc->Instance, SDIO_RESP1);
3197 }
while(((response & 0x100U) == 0U) && (count != 0U));
3200 if ((count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
3203 if ((response & 0x80U) != 0U)
3205 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3208 else if (count == 0U)
3210 errorstate = SDMMC_ERROR_TIMEOUT;
#define DMA_MEMORY_TO_PERIPH
#define DMA_PERIPH_TO_MEMORY
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
void HAL_Delay(uint32_t Delay)
This function provides minimum delay (in milliseconds) based on variable incremented.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)