314#if defined (SDMMC1) || defined (SDMMC2)
315#ifdef HAL_MMC_MODULE_ENABLED
322#if defined (VDD_VALUE) && (VDD_VALUE <= 1950U)
323#define MMC_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE
325#define MMC_EXT_CSD_PWR_CL_26_INDEX 201
326#define MMC_EXT_CSD_PWR_CL_52_INDEX 200
327#define MMC_EXT_CSD_PWR_CL_DDR_52_INDEX 238
329#define MMC_EXT_CSD_PWR_CL_26_POS 8
330#define MMC_EXT_CSD_PWR_CL_52_POS 0
331#define MMC_EXT_CSD_PWR_CL_DDR_52_POS 16
333#define MMC_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE
335#define MMC_EXT_CSD_PWR_CL_26_INDEX 203
336#define MMC_EXT_CSD_PWR_CL_52_INDEX 202
337#define MMC_EXT_CSD_PWR_CL_DDR_52_INDEX 239
339#define MMC_EXT_CSD_PWR_CL_26_POS 24
340#define MMC_EXT_CSD_PWR_CL_52_POS 16
341#define MMC_EXT_CSD_PWR_CL_DDR_52_POS 24
344#define MMC_EXT_CSD_SLEEP_NOTIFICATION_TIME_INDEX 216
345#define MMC_EXT_CSD_SLEEP_NOTIFICATION_TIME_POS 0
346#define MMC_EXT_CSD_S_A_TIMEOUT_INDEX 217
347#define MMC_EXT_CSD_S_A_TIMEOUT_POS 8
350#define MMC_INIT_FREQ 400000U
351#define MMC_HIGH_SPEED_FREQ 52000000U
354#define MMC_RPMB_KEYMAC_POSITION 196U
355#define MMC_RPMB_DATA_POSITION 228U
356#define MMC_RPMB_NONCE_POSITION 484U
357#define MMC_RPMB_WRITE_COUNTER_POSITION 500U
369static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc);
370static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc);
371static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus);
372static void MMC_PowerOFF(MMC_HandleTypeDef *hmmc);
373static void MMC_Write_IT(MMC_HandleTypeDef *hmmc);
374static void MMC_Read_IT(MMC_HandleTypeDef *hmmc);
377static HAL_StatusTypeDef MMC_ReadExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pFieldData, uint16_t FieldIndex,
379static uint32_t MMC_PwrClassUpdate(MMC_HandleTypeDef *hmmc, uint32_t Wide, uint32_t Speed);
420 assert_param(IS_SDMMC_CLOCK_EDGE(hmmc->Init.ClockEdge));
421 assert_param(IS_SDMMC_CLOCK_POWER_SAVE(hmmc->Init.ClockPowerSave));
423 assert_param(IS_SDMMC_HARDWARE_FLOW_CONTROL(hmmc->Init.HardwareFlowControl));
426 if (hmmc->State == HAL_MMC_STATE_RESET)
430#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
435 hmmc->AbortCpltCallback = HAL_MMC_AbortCallback;
436 hmmc->Read_DMADblBuf0CpltCallback = HAL_MMCEx_Read_DMADoubleBuf0CpltCallback;
437 hmmc->Read_DMADblBuf1CpltCallback = HAL_MMCEx_Read_DMADoubleBuf1CpltCallback;
438 hmmc->Write_DMADblBuf0CpltCallback = HAL_MMCEx_Write_DMADoubleBuf0CpltCallback;
439 hmmc->Write_DMADblBuf1CpltCallback = HAL_MMCEx_Write_DMADoubleBuf1CpltCallback;
441 if (hmmc->MspInitCallback ==
NULL)
447 hmmc->MspInitCallback(hmmc);
454 hmmc->State = HAL_MMC_STATE_BUSY;
466 hmmc->Context = MMC_CONTEXT_NONE;
469 hmmc->State = HAL_MMC_STATE_READY;
472 if (hmmc->Init.BusWide != SDMMC_BUS_WIDE_1B)
474 if (HAL_MMC_ConfigWideBusOperation(hmmc, hmmc->Init.BusWide) !=
HAL_OK)
493 MMC_InitTypeDef Init = {0U};
497 Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
498 Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
499 Init.BusWide = SDMMC_BUS_WIDE_1B;
500 Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
506 hmmc->State = HAL_MMC_STATE_READY;
507 hmmc->ErrorCode = SDMMC_ERROR_INVALID_PARAMETER;
510 if (sdmmc_clk <= MMC_INIT_FREQ)
516 Init.ClockDiv = (sdmmc_clk / (2U * MMC_INIT_FREQ)) + 1U;
519#if (USE_SD_TRANSCEIVER != 0U)
520 Init.TranceiverPresent = SDMMC_TRANSCEIVER_NOT_PRESENT;
524 (void)SDMMC_Init(hmmc->Instance, Init);
527 (void)SDMMC_PowerState_ON(hmmc->Instance);
531 if (Init.ClockDiv != 0U)
533 sdmmc_clk = sdmmc_clk / (2U * Init.ClockDiv);
538 HAL_Delay(1U + (74U * 1000U / (sdmmc_clk)));
542 errorstate = MMC_PowerON(hmmc);
543 if (errorstate != HAL_MMC_ERROR_NONE)
545 hmmc->State = HAL_MMC_STATE_READY;
546 hmmc->ErrorCode |= errorstate;
551 errorstate = MMC_InitCard(hmmc);
552 if (errorstate != HAL_MMC_ERROR_NONE)
554 hmmc->State = HAL_MMC_STATE_READY;
555 hmmc->ErrorCode |= errorstate;
560 errorstate = SDMMC_CmdBlockLength(hmmc->Instance, MMC_BLOCKSIZE);
561 if (errorstate != HAL_MMC_ERROR_NONE)
564 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
565 hmmc->ErrorCode |= errorstate;
566 hmmc->State = HAL_MMC_STATE_READY;
589 hmmc->State = HAL_MMC_STATE_BUSY;
594#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
595 if (hmmc->MspDeInitCallback ==
NULL)
601 hmmc->MspDeInitCallback(hmmc);
607 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
608 hmmc->State = HAL_MMC_STATE_RESET;
674HAL_StatusTypeDef HAL_MMC_ReadBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd,
675 uint32_t NumberOfBlocks,
678 SDMMC_DataInitTypeDef
config;
683 uint32_t dataremaining;
684 uint32_t add = BlockAdd;
685 uint8_t *tempbuff = pData;
689 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
693 if (hmmc->State == HAL_MMC_STATE_READY)
695 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
697 if ((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
699 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
704 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS)
705 & 0x000000FFU) != 0x0U)
707 if ((NumberOfBlocks % 8U) != 0U)
710 hmmc->ErrorCode |= HAL_MMC_ERROR_BLOCK_LEN_ERR;
714 if ((BlockAdd % 8U) != 0U)
717 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
722 hmmc->State = HAL_MMC_STATE_BUSY;
725 hmmc->Instance->DCTRL = 0U;
727 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
729 add *= MMC_BLOCKSIZE;
733 config.DataTimeOut = SDMMC_DATATIMEOUT;
734 config.DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
735 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
736 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
737 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
738 config.DPSM = SDMMC_DPSM_DISABLE;
739 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
740 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
743 if (NumberOfBlocks > 1U)
745 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
748 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, add);
752 hmmc->Context = MMC_CONTEXT_READ_SINGLE_BLOCK;
755 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, add);
757 if (errorstate != HAL_MMC_ERROR_NONE)
760 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
761 hmmc->ErrorCode |= errorstate;
762 hmmc->State = HAL_MMC_STATE_READY;
767 dataremaining =
config.DataLength;
768 while (!__HAL_MMC_GET_FLAG(hmmc,
769 SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
771 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= SDMMC_FIFO_SIZE))
776 data = SDMMC_ReadFIFO(hmmc->Instance);
777 *tempbuff = (uint8_t)(data & 0xFFU);
779 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
781 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
783 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
786 dataremaining -= SDMMC_FIFO_SIZE;
789 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
792 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
793 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
794 hmmc->State = HAL_MMC_STATE_READY;
798 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
801 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
804 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
805 if (errorstate != HAL_MMC_ERROR_NONE)
808 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
809 hmmc->ErrorCode |= errorstate;
810 hmmc->State = HAL_MMC_STATE_READY;
816 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
819 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
820 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
821 hmmc->State = HAL_MMC_STATE_READY;
824 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
827 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
828 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
829 hmmc->State = HAL_MMC_STATE_READY;
832 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXOVERR))
835 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
836 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
837 hmmc->State = HAL_MMC_STATE_READY;
846 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
848 hmmc->State = HAL_MMC_STATE_READY;
854 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
871HAL_StatusTypeDef HAL_MMC_WriteBlocks(MMC_HandleTypeDef *hmmc,
const uint8_t *pData, uint32_t BlockAdd,
872 uint32_t NumberOfBlocks, uint32_t Timeout)
874 SDMMC_DataInitTypeDef
config;
879 uint32_t dataremaining;
880 uint32_t add = BlockAdd;
881 const uint8_t *tempbuff = pData;
885 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
889 if (hmmc->State == HAL_MMC_STATE_READY)
891 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
893 if ((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
895 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
900 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS) & 0x000000FFU) != 0x0U)
902 if ((NumberOfBlocks % 8U) != 0U)
905 hmmc->ErrorCode |= HAL_MMC_ERROR_BLOCK_LEN_ERR;
909 if ((BlockAdd % 8U) != 0U)
912 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
917 hmmc->State = HAL_MMC_STATE_BUSY;
920 hmmc->Instance->DCTRL = 0U;
922 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
924 add *= MMC_BLOCKSIZE;
928 config.DataTimeOut = SDMMC_DATATIMEOUT;
929 config.DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
930 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
931 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
932 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
933 config.DPSM = SDMMC_DPSM_DISABLE;
934 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
935 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
938 if (NumberOfBlocks > 1U)
940 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
943 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, add);
947 hmmc->Context = MMC_CONTEXT_WRITE_SINGLE_BLOCK;
950 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, add);
952 if (errorstate != HAL_MMC_ERROR_NONE)
955 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
956 hmmc->ErrorCode |= errorstate;
957 hmmc->State = HAL_MMC_STATE_READY;
962 dataremaining =
config.DataLength;
963 while (!__HAL_MMC_GET_FLAG(hmmc,
964 SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
966 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= SDMMC_FIFO_SIZE))
971 data = (uint32_t)(*tempbuff);
973 data |= ((uint32_t)(*tempbuff) << 8U);
975 data |= ((uint32_t)(*tempbuff) << 16U);
977 data |= ((uint32_t)(*tempbuff) << 24U);
979 (void)SDMMC_WriteFIFO(hmmc->Instance, &data);
981 dataremaining -= SDMMC_FIFO_SIZE;
984 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
987 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
988 hmmc->ErrorCode |= errorstate;
989 hmmc->State = HAL_MMC_STATE_READY;
993 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
996 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
999 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
1000 if (errorstate != HAL_MMC_ERROR_NONE)
1003 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1004 hmmc->ErrorCode |= errorstate;
1005 hmmc->State = HAL_MMC_STATE_READY;
1011 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
1014 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1015 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
1016 hmmc->State = HAL_MMC_STATE_READY;
1019 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
1022 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1023 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
1024 hmmc->State = HAL_MMC_STATE_READY;
1027 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXUNDERR))
1030 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1031 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
1032 hmmc->State = HAL_MMC_STATE_READY;
1041 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
1043 hmmc->State = HAL_MMC_STATE_READY;
1049 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
1067HAL_StatusTypeDef HAL_MMC_ReadBlocks_IT(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd,
1068 uint32_t NumberOfBlocks)
1070 SDMMC_DataInitTypeDef
config;
1071 uint32_t errorstate;
1072 uint32_t add = BlockAdd;
1076 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1080 if (hmmc->State == HAL_MMC_STATE_READY)
1082 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1084 if ((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1086 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1091 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS) & 0x000000FFU) != 0x0U)
1093 if ((NumberOfBlocks % 8U) != 0U)
1096 hmmc->ErrorCode |= HAL_MMC_ERROR_BLOCK_LEN_ERR;
1100 if ((BlockAdd % 8U) != 0U)
1103 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
1108 hmmc->State = HAL_MMC_STATE_BUSY;
1111 hmmc->Instance->DCTRL = 0U;
1113 hmmc->pRxBuffPtr = pData;
1114 hmmc->RxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
1116 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1118 add *= MMC_BLOCKSIZE;
1122 config.DataTimeOut = SDMMC_DATATIMEOUT;
1123 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1124 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1125 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
1126 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1127 config.DPSM = SDMMC_DPSM_DISABLE;
1128 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
1129 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
1132 if (NumberOfBlocks > 1U)
1134 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_IT);
1137 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, add);
1141 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_IT);
1144 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, add);
1147 if (errorstate != HAL_MMC_ERROR_NONE)
1150 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1151 hmmc->ErrorCode |= errorstate;
1152 hmmc->State = HAL_MMC_STATE_READY;
1156 __HAL_MMC_ENABLE_IT(hmmc, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND |
1157 SDMMC_FLAG_RXFIFOHF));
1180HAL_StatusTypeDef HAL_MMC_WriteBlocks_IT(MMC_HandleTypeDef *hmmc,
const uint8_t *pData,
1181 uint32_t BlockAdd, uint32_t NumberOfBlocks)
1183 SDMMC_DataInitTypeDef
config;
1184 uint32_t errorstate;
1185 uint32_t add = BlockAdd;
1189 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1193 if (hmmc->State == HAL_MMC_STATE_READY)
1195 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1197 if ((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1199 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1204 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS) & 0x000000FFU) != 0x0U)
1206 if ((NumberOfBlocks % 8U) != 0U)
1209 hmmc->ErrorCode |= HAL_MMC_ERROR_BLOCK_LEN_ERR;
1213 if ((BlockAdd % 8U) != 0U)
1216 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
1221 hmmc->State = HAL_MMC_STATE_BUSY;
1224 hmmc->Instance->DCTRL = 0U;
1226 hmmc->pTxBuffPtr = pData;
1227 hmmc->TxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
1229 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1231 add *= MMC_BLOCKSIZE;
1235 config.DataTimeOut = SDMMC_DATATIMEOUT;
1236 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1237 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1238 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
1239 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1240 config.DPSM = SDMMC_DPSM_DISABLE;
1241 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
1243 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
1246 if (NumberOfBlocks > 1U)
1248 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK | MMC_CONTEXT_IT);
1251 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, add);
1255 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_IT);
1258 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, add);
1260 if (errorstate != HAL_MMC_ERROR_NONE)
1263 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1264 hmmc->ErrorCode |= errorstate;
1265 hmmc->State = HAL_MMC_STATE_READY;
1270 __HAL_MMC_ENABLE_IT(hmmc, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND |
1271 SDMMC_FLAG_TXFIFOHE));
1294HAL_StatusTypeDef HAL_MMC_ReadBlocks_DMA(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint32_t BlockAdd,
1295 uint32_t NumberOfBlocks)
1297 SDMMC_DataInitTypeDef
config;
1298 uint32_t errorstate;
1299 uint32_t add = BlockAdd;
1303 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1307 if (hmmc->State == HAL_MMC_STATE_READY)
1311 if ((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1313 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1318 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS) & 0x000000FFU) != 0x0U)
1320 if ((NumberOfBlocks % 8U) != 0U)
1323 hmmc->ErrorCode |= HAL_MMC_ERROR_BLOCK_LEN_ERR;
1327 if ((BlockAdd % 8U) != 0U)
1330 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
1335 hmmc->State = HAL_MMC_STATE_BUSY;
1338 hmmc->Instance->DCTRL = 0U;
1340 hmmc->pRxBuffPtr = pData;
1341 hmmc->RxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
1343 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1345 add *= MMC_BLOCKSIZE;
1349 config.DataTimeOut = SDMMC_DATATIMEOUT;
1350 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1351 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1352 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
1353 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1354 config.DPSM = SDMMC_DPSM_DISABLE;
1355 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
1357 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
1358 hmmc->Instance->IDMABASE0 = (uint32_t) pData ;
1359 hmmc->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1362 if (NumberOfBlocks > 1U)
1364 hmmc->Context = (MMC_CONTEXT_READ_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
1367 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, add);
1371 hmmc->Context = (MMC_CONTEXT_READ_SINGLE_BLOCK | MMC_CONTEXT_DMA);
1374 errorstate = SDMMC_CmdReadSingleBlock(hmmc->Instance, add);
1376 if (errorstate != HAL_MMC_ERROR_NONE)
1379 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1380 hmmc->ErrorCode = errorstate;
1381 hmmc->State = HAL_MMC_STATE_READY;
1386 __HAL_MMC_ENABLE_IT(hmmc, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND));
1409HAL_StatusTypeDef HAL_MMC_WriteBlocks_DMA(MMC_HandleTypeDef *hmmc,
const uint8_t *pData,
1410 uint32_t BlockAdd, uint32_t NumberOfBlocks)
1412 SDMMC_DataInitTypeDef
config;
1413 uint32_t errorstate;
1414 uint32_t add = BlockAdd;
1418 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1422 if (hmmc->State == HAL_MMC_STATE_READY)
1424 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1426 if ((BlockAdd + NumberOfBlocks) > (hmmc->MmcCard.LogBlockNbr))
1428 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1433 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS) & 0x000000FFU) != 0x0U)
1435 if ((NumberOfBlocks % 8U) != 0U)
1438 hmmc->ErrorCode |= HAL_MMC_ERROR_BLOCK_LEN_ERR;
1442 if ((BlockAdd % 8U) != 0U)
1445 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
1450 hmmc->State = HAL_MMC_STATE_BUSY;
1453 hmmc->Instance->DCTRL = 0U;
1455 hmmc->pTxBuffPtr = pData;
1456 hmmc->TxXferSize = MMC_BLOCKSIZE * NumberOfBlocks;
1458 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1460 add *= MMC_BLOCKSIZE;
1464 config.DataTimeOut = SDMMC_DATATIMEOUT;
1465 config.DataLength = MMC_BLOCKSIZE * NumberOfBlocks;
1466 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1467 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
1468 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1469 config.DPSM = SDMMC_DPSM_DISABLE;
1470 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
1472 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
1474 hmmc->Instance->IDMABASE0 = (uint32_t) pData ;
1475 hmmc->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1478 if (NumberOfBlocks > 1U)
1480 hmmc->Context = (MMC_CONTEXT_WRITE_MULTIPLE_BLOCK | MMC_CONTEXT_DMA);
1483 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, add);
1487 hmmc->Context = (MMC_CONTEXT_WRITE_SINGLE_BLOCK | MMC_CONTEXT_DMA);
1490 errorstate = SDMMC_CmdWriteSingleBlock(hmmc->Instance, add);
1492 if (errorstate != HAL_MMC_ERROR_NONE)
1495 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1496 hmmc->ErrorCode |= errorstate;
1497 hmmc->State = HAL_MMC_STATE_READY;
1502 __HAL_MMC_ENABLE_IT(hmmc, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND));
1521HAL_StatusTypeDef HAL_MMC_Erase(MMC_HandleTypeDef *hmmc, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
1523 uint32_t errorstate;
1524 uint32_t start_add = BlockStartAdd;
1525 uint32_t end_add = BlockEndAdd;
1527 if (hmmc->State == HAL_MMC_STATE_READY)
1529 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
1531 if (end_add < start_add)
1533 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
1537 if (end_add > (hmmc->MmcCard.LogBlockNbr))
1539 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
1544 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS)
1545 & 0x000000FFU) != 0x0U)
1547 if (((start_add % 8U) != 0U) || ((end_add % 8U) != 0U))
1550 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
1555 hmmc->State = HAL_MMC_STATE_BUSY;
1558 if (((hmmc->MmcCard.Class) & SDMMC_CCCC_ERASE) == 0U)
1561 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1562 hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
1563 hmmc->State = HAL_MMC_STATE_READY;
1567 if ((SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1570 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1571 hmmc->ErrorCode |= HAL_MMC_ERROR_LOCK_UNLOCK_FAILED;
1572 hmmc->State = HAL_MMC_STATE_READY;
1576 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
1578 start_add *= MMC_BLOCKSIZE;
1579 end_add *= MMC_BLOCKSIZE;
1583 errorstate = SDMMC_CmdEraseStartAdd(hmmc->Instance, start_add);
1584 if (errorstate != HAL_MMC_ERROR_NONE)
1587 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1588 hmmc->ErrorCode |= errorstate;
1589 hmmc->State = HAL_MMC_STATE_READY;
1594 errorstate = SDMMC_CmdEraseEndAdd(hmmc->Instance, end_add);
1595 if (errorstate != HAL_MMC_ERROR_NONE)
1598 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1599 hmmc->ErrorCode |= errorstate;
1600 hmmc->State = HAL_MMC_STATE_READY;
1605 errorstate = SDMMC_CmdErase(hmmc->Instance, 0UL);
1606 if (errorstate != HAL_MMC_ERROR_NONE)
1609 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
1610 hmmc->ErrorCode |= errorstate;
1611 hmmc->State = HAL_MMC_STATE_READY;
1615 hmmc->State = HAL_MMC_STATE_READY;
1630void HAL_MMC_IRQHandler(MMC_HandleTypeDef *hmmc)
1632 uint32_t errorstate;
1633 uint32_t context = hmmc->Context;
1636 if ((__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF) !=
RESET) && ((context & MMC_CONTEXT_IT) != 0U))
1641 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DATAEND) !=
RESET)
1643 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_DATAEND);
1645 __HAL_MMC_DISABLE_IT(hmmc, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
1646 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR | SDMMC_IT_TXFIFOHE | \
1649 __HAL_MMC_DISABLE_IT(hmmc, SDMMC_IT_IDMABTC);
1650 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
1652 if ((context & MMC_CONTEXT_DMA) != 0U)
1654 hmmc->Instance->DLEN = 0;
1655 hmmc->Instance->DCTRL = 0;
1656 hmmc->Instance->IDMACTRL = SDMMC_DISABLE_IDMA ;
1659 if (((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1661 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
1662 if (errorstate != HAL_MMC_ERROR_NONE)
1664 hmmc->ErrorCode |= errorstate;
1665#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1666 hmmc->ErrorCallback(hmmc);
1674 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
1676 hmmc->State = HAL_MMC_STATE_READY;
1677 if (((context & MMC_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1679#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1680 hmmc->TxCpltCallback(hmmc);
1685 if (((context & MMC_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1687#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1688 hmmc->RxCpltCallback(hmmc);
1694 else if ((context & MMC_CONTEXT_IT) != 0U)
1697 if (((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1699 errorstate = SDMMC_CmdStopTransfer(hmmc->Instance);
1700 if (errorstate != HAL_MMC_ERROR_NONE)
1702 hmmc->ErrorCode |= errorstate;
1703#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1704 hmmc->ErrorCallback(hmmc);
1712 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
1714 hmmc->State = HAL_MMC_STATE_READY;
1715 if (((context & MMC_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & MMC_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1717#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1718 hmmc->RxCpltCallback(hmmc);
1725#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1726 hmmc->TxCpltCallback(hmmc);
1738 else if ((__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXFIFOHE) !=
RESET) && ((context & MMC_CONTEXT_IT) != 0U))
1743 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL |
1744 SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_RXOVERR | SDMMC_FLAG_TXUNDERR) !=
RESET)
1747 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_IT_DCRCFAIL) !=
RESET)
1749 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
1751 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_IT_DTIMEOUT) !=
RESET)
1753 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
1755 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_IT_RXOVERR) !=
RESET)
1757 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
1759 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_IT_TXUNDERR) !=
RESET)
1761 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
1765 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
1768 __HAL_MMC_DISABLE_IT(hmmc, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
1769 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
1771 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
1774 hmmc->ErrorCode |= SDMMC_CmdStopTransfer(hmmc->Instance);
1776 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_DABORT);
1778 if ((context & MMC_CONTEXT_IT) != 0U)
1781 hmmc->State = HAL_MMC_STATE_READY;
1782#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1783 hmmc->ErrorCallback(hmmc);
1788 else if ((context & MMC_CONTEXT_DMA) != 0U)
1790 if (hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
1793 __HAL_MMC_DISABLE_IT(hmmc, SDMMC_IT_IDMABTC);
1794 hmmc->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
1797 hmmc->State = HAL_MMC_STATE_READY;
1798#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1799 hmmc->ErrorCallback(hmmc);
1811 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_IDMABTC) !=
RESET)
1813 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_IT_IDMABTC);
1817 if ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1819#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1820 hmmc->Write_DMADblBuf1CpltCallback(hmmc);
1822 HAL_MMCEx_Write_DMADoubleBuf1CpltCallback(hmmc);
1827#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1828 hmmc->Read_DMADblBuf1CpltCallback(hmmc);
1830 HAL_MMCEx_Read_DMADoubleBuf1CpltCallback(hmmc);
1837 if ((context & MMC_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1839#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1840 hmmc->Write_DMADblBuf0CpltCallback(hmmc);
1842 HAL_MMCEx_Write_DMADoubleBuf0CpltCallback(hmmc);
1847#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1848 hmmc->Read_DMADblBuf0CpltCallback(hmmc);
1850 HAL_MMCEx_Read_DMADoubleBuf0CpltCallback(hmmc);
1867HAL_MMC_StateTypeDef HAL_MMC_GetState(
const MMC_HandleTypeDef *hmmc)
1878uint32_t HAL_MMC_GetError(
const MMC_HandleTypeDef *hmmc)
1880 return hmmc->ErrorCode;
1933__weak
void HAL_MMC_AbortCallback(MMC_HandleTypeDef *hmmc)
1943#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
1966HAL_StatusTypeDef HAL_MMC_RegisterCallback(MMC_HandleTypeDef *hmmc, HAL_MMC_CallbackIDTypeDef CallbackId,
1967 pMMC_CallbackTypeDef pCallback)
1971 if (pCallback ==
NULL)
1974 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
1978 if (hmmc->State == HAL_MMC_STATE_READY)
1982 case HAL_MMC_TX_CPLT_CB_ID :
1983 hmmc->TxCpltCallback = pCallback;
1985 case HAL_MMC_RX_CPLT_CB_ID :
1986 hmmc->RxCpltCallback = pCallback;
1988 case HAL_MMC_ERROR_CB_ID :
1989 hmmc->ErrorCallback = pCallback;
1991 case HAL_MMC_ABORT_CB_ID :
1992 hmmc->AbortCpltCallback = pCallback;
1994 case HAL_MMC_READ_DMA_DBL_BUF0_CPLT_CB_ID :
1995 hmmc->Read_DMADblBuf0CpltCallback = pCallback;
1997 case HAL_MMC_READ_DMA_DBL_BUF1_CPLT_CB_ID :
1998 hmmc->Read_DMADblBuf1CpltCallback = pCallback;
2000 case HAL_MMC_WRITE_DMA_DBL_BUF0_CPLT_CB_ID :
2001 hmmc->Write_DMADblBuf0CpltCallback = pCallback;
2003 case HAL_MMC_WRITE_DMA_DBL_BUF1_CPLT_CB_ID :
2004 hmmc->Write_DMADblBuf1CpltCallback = pCallback;
2006 case HAL_MMC_MSP_INIT_CB_ID :
2007 hmmc->MspInitCallback = pCallback;
2009 case HAL_MMC_MSP_DEINIT_CB_ID :
2010 hmmc->MspDeInitCallback = pCallback;
2014 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2020 else if (hmmc->State == HAL_MMC_STATE_RESET)
2024 case HAL_MMC_MSP_INIT_CB_ID :
2025 hmmc->MspInitCallback = pCallback;
2027 case HAL_MMC_MSP_DEINIT_CB_ID :
2028 hmmc->MspDeInitCallback = pCallback;
2032 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2041 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2070HAL_StatusTypeDef HAL_MMC_UnRegisterCallback(MMC_HandleTypeDef *hmmc, HAL_MMC_CallbackIDTypeDef CallbackId)
2074 if (hmmc->State == HAL_MMC_STATE_READY)
2078 case HAL_MMC_TX_CPLT_CB_ID :
2081 case HAL_MMC_RX_CPLT_CB_ID :
2084 case HAL_MMC_ERROR_CB_ID :
2087 case HAL_MMC_ABORT_CB_ID :
2088 hmmc->AbortCpltCallback = HAL_MMC_AbortCallback;
2090 case HAL_MMC_READ_DMA_DBL_BUF0_CPLT_CB_ID :
2091 hmmc->Read_DMADblBuf0CpltCallback = HAL_MMCEx_Read_DMADoubleBuf0CpltCallback;
2093 case HAL_MMC_READ_DMA_DBL_BUF1_CPLT_CB_ID :
2094 hmmc->Read_DMADblBuf1CpltCallback = HAL_MMCEx_Read_DMADoubleBuf1CpltCallback;
2096 case HAL_MMC_WRITE_DMA_DBL_BUF0_CPLT_CB_ID :
2097 hmmc->Write_DMADblBuf0CpltCallback = HAL_MMCEx_Write_DMADoubleBuf0CpltCallback;
2099 case HAL_MMC_WRITE_DMA_DBL_BUF1_CPLT_CB_ID :
2100 hmmc->Write_DMADblBuf1CpltCallback = HAL_MMCEx_Write_DMADoubleBuf1CpltCallback;
2102 case HAL_MMC_MSP_INIT_CB_ID :
2105 case HAL_MMC_MSP_DEINIT_CB_ID :
2110 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2116 else if (hmmc->State == HAL_MMC_STATE_RESET)
2120 case HAL_MMC_MSP_INIT_CB_ID :
2123 case HAL_MMC_MSP_DEINIT_CB_ID :
2128 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2137 hmmc->ErrorCode |= HAL_MMC_ERROR_INVALID_CALLBACK;
2173HAL_StatusTypeDef HAL_MMC_GetCardCID(
const MMC_HandleTypeDef *hmmc, HAL_MMC_CardCIDTypeDef *pCID)
2175 pCID->ManufacturerID = (uint8_t)((hmmc->CID[0] & 0xFF000000U) >> 24U);
2177 pCID->OEM_AppliID = (uint16_t)((hmmc->CID[0] & 0x00FFFF00U) >> 8U);
2179 pCID->ProdName1 = (((hmmc->CID[0] & 0x000000FFU) << 24U) | ((hmmc->CID[1] & 0xFFFFFF00U) >> 8U));
2181 pCID->ProdName2 = (uint8_t)(hmmc->CID[1] & 0x000000FFU);
2183 pCID->ProdRev = (uint8_t)((hmmc->CID[2] & 0xFF000000U) >> 24U);
2185 pCID->ProdSN = (((hmmc->CID[2] & 0x00FFFFFFU) << 8U) | ((hmmc->CID[3] & 0xFF000000U) >> 24U));
2187 pCID->Reserved1 = (uint8_t)((hmmc->CID[3] & 0x00F00000U) >> 20U);
2189 pCID->ManufactDate = (uint16_t)((hmmc->CID[3] & 0x000FFF00U) >> 8U);
2191 pCID->CID_CRC = (uint8_t)((hmmc->CID[3] & 0x000000FEU) >> 1U);
2193 pCID->Reserved2 = 1U;
2206HAL_StatusTypeDef HAL_MMC_GetCardCSD(MMC_HandleTypeDef *hmmc, HAL_MMC_CardCSDTypeDef *pCSD)
2208 uint32_t block_nbr = 0;
2210 pCSD->CSDStruct = (uint8_t)((hmmc->CSD[0] & 0xC0000000U) >> 30U);
2212 pCSD->SysSpecVersion = (uint8_t)((hmmc->CSD[0] & 0x3C000000U) >> 26U);
2214 pCSD->Reserved1 = (uint8_t)((hmmc->CSD[0] & 0x03000000U) >> 24U);
2216 pCSD->TAAC = (uint8_t)((hmmc->CSD[0] & 0x00FF0000U) >> 16U);
2218 pCSD->NSAC = (uint8_t)((hmmc->CSD[0] & 0x0000FF00U) >> 8U);
2220 pCSD->MaxBusClkFrec = (uint8_t)(hmmc->CSD[0] & 0x000000FFU);
2222 pCSD->CardComdClasses = (uint16_t)((hmmc->CSD[1] & 0xFFF00000U) >> 20U);
2224 pCSD->RdBlockLen = (uint8_t)((hmmc->CSD[1] & 0x000F0000U) >> 16U);
2226 pCSD->PartBlockRead = (uint8_t)((hmmc->CSD[1] & 0x00008000U) >> 15U);
2228 pCSD->WrBlockMisalign = (uint8_t)((hmmc->CSD[1] & 0x00004000U) >> 14U);
2230 pCSD->RdBlockMisalign = (uint8_t)((hmmc->CSD[1] & 0x00002000U) >> 13U);
2232 pCSD->DSRImpl = (uint8_t)((hmmc->CSD[1] & 0x00001000U) >> 12U);
2234 pCSD->Reserved2 = 0U;
2236 if (MMC_ReadExtCSD(hmmc, &block_nbr, 212, 0x0FFFFFFFU) !=
HAL_OK)
2241 if (hmmc->MmcCard.CardType == MMC_LOW_CAPACITY_CARD)
2243 pCSD->DeviceSize = (((hmmc->CSD[1] & 0x000003FFU) << 2U) | ((hmmc->CSD[2] & 0xC0000000U) >> 30U));
2245 pCSD->MaxRdCurrentVDDMin = (uint8_t)((hmmc->CSD[2] & 0x38000000U) >> 27U);
2247 pCSD->MaxRdCurrentVDDMax = (uint8_t)((hmmc->CSD[2] & 0x07000000U) >> 24U);
2249 pCSD->MaxWrCurrentVDDMin = (uint8_t)((hmmc->CSD[2] & 0x00E00000U) >> 21U);
2251 pCSD->MaxWrCurrentVDDMax = (uint8_t)((hmmc->CSD[2] & 0x001C0000U) >> 18U);
2253 pCSD->DeviceSizeMul = (uint8_t)((hmmc->CSD[2] & 0x00038000U) >> 15U);
2255 hmmc->MmcCard.BlockNbr = (pCSD->DeviceSize + 1U) ;
2256 hmmc->MmcCard.BlockNbr *= (1UL << ((pCSD->DeviceSizeMul & 0x07U) + 2U));
2257 hmmc->MmcCard.BlockSize = (1UL << (pCSD->RdBlockLen & 0x0FU));
2259 hmmc->MmcCard.LogBlockNbr = (hmmc->MmcCard.BlockNbr) * ((hmmc->MmcCard.BlockSize) / MMC_BLOCKSIZE);
2260 hmmc->MmcCard.LogBlockSize = MMC_BLOCKSIZE;
2262 else if (hmmc->MmcCard.CardType == MMC_HIGH_CAPACITY_CARD)
2264 hmmc->MmcCard.BlockNbr = block_nbr;
2265 hmmc->MmcCard.LogBlockNbr = hmmc->MmcCard.BlockNbr;
2266 hmmc->MmcCard.BlockSize = MMC_BLOCKSIZE;
2267 hmmc->MmcCard.LogBlockSize = hmmc->MmcCard.BlockSize;
2272 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2273 hmmc->ErrorCode |= HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
2274 hmmc->State = HAL_MMC_STATE_READY;
2278 pCSD->EraseGrSize = (uint8_t)((hmmc->CSD[2] & 0x00004000U) >> 14U);
2280 pCSD->EraseGrMul = (uint8_t)((hmmc->CSD[2] & 0x00003F80U) >> 7U);
2282 pCSD->WrProtectGrSize = (uint8_t)(hmmc->CSD[2] & 0x0000007FU);
2284 pCSD->WrProtectGrEnable = (uint8_t)((hmmc->CSD[3] & 0x80000000U) >> 31U);
2286 pCSD->ManDeflECC = (uint8_t)((hmmc->CSD[3] & 0x60000000U) >> 29U);
2288 pCSD->WrSpeedFact = (uint8_t)((hmmc->CSD[3] & 0x1C000000U) >> 26U);
2290 pCSD->MaxWrBlockLen = (uint8_t)((hmmc->CSD[3] & 0x03C00000U) >> 22U);
2292 pCSD->WriteBlockPaPartial = (uint8_t)((hmmc->CSD[3] & 0x00200000U) >> 21U);
2294 pCSD->Reserved3 = 0;
2296 pCSD->ContentProtectAppli = (uint8_t)((hmmc->CSD[3] & 0x00010000U) >> 16U);
2298 pCSD->FileFormatGroup = (uint8_t)((hmmc->CSD[3] & 0x00008000U) >> 15U);
2300 pCSD->CopyFlag = (uint8_t)((hmmc->CSD[3] & 0x00004000U) >> 14U);
2302 pCSD->PermWrProtect = (uint8_t)((hmmc->CSD[3] & 0x00002000U) >> 13U);
2304 pCSD->TempWrProtect = (uint8_t)((hmmc->CSD[3] & 0x00001000U) >> 12U);
2306 pCSD->FileFormat = (uint8_t)((hmmc->CSD[3] & 0x00000C00U) >> 10U);
2308 pCSD->ECC = (uint8_t)((hmmc->CSD[3] & 0x00000300U) >> 8U);
2310 pCSD->CSD_CRC = (uint8_t)((hmmc->CSD[3] & 0x000000FEU) >> 1U);
2312 pCSD->Reserved4 = 1;
2324HAL_StatusTypeDef HAL_MMC_GetCardInfo(
const MMC_HandleTypeDef *hmmc, HAL_MMC_CardInfoTypeDef *pCardInfo)
2326 pCardInfo->CardType = (uint32_t)(hmmc->MmcCard.CardType);
2327 pCardInfo->Class = (uint32_t)(hmmc->MmcCard.Class);
2328 pCardInfo->RelCardAdd = (uint32_t)(hmmc->MmcCard.RelCardAdd);
2329 pCardInfo->BlockNbr = (uint32_t)(hmmc->MmcCard.BlockNbr);
2330 pCardInfo->BlockSize = (uint32_t)(hmmc->MmcCard.BlockSize);
2331 pCardInfo->LogBlockNbr = (uint32_t)(hmmc->MmcCard.LogBlockNbr);
2332 pCardInfo->LogBlockSize = (uint32_t)(hmmc->MmcCard.LogBlockSize);
2346HAL_StatusTypeDef HAL_MMC_GetCardExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pExtCSD, uint32_t Timeout)
2348 SDMMC_DataInitTypeDef
config;
2349 uint32_t errorstate;
2354 if (
NULL == pExtCSD)
2356 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
2360 if (hmmc->State == HAL_MMC_STATE_READY)
2362 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
2364 hmmc->State = HAL_MMC_STATE_BUSY;
2367 hmmc->Instance->DCTRL = 0;
2373 config.DataTimeOut = SDMMC_DATATIMEOUT;
2374 config.DataLength = MMC_BLOCKSIZE;
2375 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
2376 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
2377 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
2378 config.DPSM = SDMMC_DPSM_DISABLE;
2379 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
2380 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
2383 errorstate = SDMMC_CmdSendEXTCSD(hmmc->Instance, 0);
2384 if (errorstate != HAL_MMC_ERROR_NONE)
2387 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2388 hmmc->ErrorCode |= errorstate;
2389 hmmc->State = HAL_MMC_STATE_READY;
2394 while (!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXOVERR |
2395 SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
2397 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF))
2402 *tmp_buf = SDMMC_ReadFIFO(hmmc->Instance);
2407 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
2410 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2411 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
2412 hmmc->State = HAL_MMC_STATE_READY;
2417 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
2420 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
2423 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2424 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
2425 hmmc->State = HAL_MMC_STATE_READY;
2428 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
2431 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2432 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
2433 hmmc->State = HAL_MMC_STATE_READY;
2436 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXOVERR))
2439 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2440 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
2441 hmmc->State = HAL_MMC_STATE_READY;
2450 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
2451 hmmc->State = HAL_MMC_STATE_READY;
2468HAL_StatusTypeDef HAL_MMC_ConfigWideBusOperation(MMC_HandleTypeDef *hmmc, uint32_t WideMode)
2471 SDMMC_InitTypeDef Init;
2472 uint32_t errorstate;
2473 uint32_t response = 0U;
2479 hmmc->State = HAL_MMC_STATE_BUSY;
2486 errorstate = MMC_PwrClassUpdate(hmmc, WideMode, SDMMC_SPEED_MODE_DDR);
2490 errorstate = MMC_PwrClassUpdate(hmmc, WideMode, SDMMC_SPEED_MODE_HIGH);
2495 errorstate = MMC_PwrClassUpdate(hmmc, WideMode, SDMMC_SPEED_MODE_DEFAULT);
2498 if (errorstate == HAL_MMC_ERROR_NONE)
2500 if (WideMode == SDMMC_BUS_WIDE_8B)
2502 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70200U);
2504 else if (WideMode == SDMMC_BUS_WIDE_4B)
2506 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70100U);
2508 else if (WideMode == SDMMC_BUS_WIDE_1B)
2510 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70000U);
2515 errorstate = HAL_MMC_ERROR_PARAM;
2519 if (errorstate == HAL_MMC_ERROR_NONE)
2522 count = SDMMC_MAX_TRIAL;
2525 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
2526 if (errorstate != HAL_MMC_ERROR_NONE)
2532 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
2534 }
while (((response & 0x100U) == 0U) && (
count != 0U));
2537 if ((
count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
2540 if ((response & 0x80U) != 0U)
2542 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
2548 Init.BusWide = WideMode;
2549 (void)SDMMC_Init(hmmc->Instance, Init);
2552 else if (
count == 0U)
2554 errorstate = SDMMC_ERROR_TIMEOUT;
2564 hmmc->State = HAL_MMC_STATE_READY;
2566 if (errorstate != HAL_MMC_ERROR_NONE)
2569 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
2570 hmmc->ErrorCode |= errorstate;
2589HAL_StatusTypeDef HAL_MMC_ConfigSpeedBusOperation(MMC_HandleTypeDef *hmmc, uint32_t SpeedMode)
2593 uint32_t device_type;
2594 uint32_t errorstate;
2600 hmmc->State = HAL_MMC_STATE_BUSY;
2603 device_type = (hmmc->Ext_CSD[49] & 0x000000FFU);
2607 case SDMMC_SPEED_MODE_AUTO:
2609 if (((hmmc->Instance->CLKCR &
SDMMC_CLKCR_WIDBUS) != 0U) && ((device_type & 0x04U) != 0U))
2612 errorstate = MMC_HighSpeed(hmmc,
ENABLE);
2613 if (errorstate != HAL_MMC_ERROR_NONE)
2615 hmmc->ErrorCode |= errorstate;
2622 errorstate = MMC_DDR_Mode(hmmc,
ENABLE);
2623 if (errorstate != HAL_MMC_ERROR_NONE)
2625 hmmc->ErrorCode |= errorstate;
2630 else if ((device_type & 0x02U) != 0U)
2633 errorstate = MMC_HighSpeed(hmmc,
ENABLE);
2634 if (errorstate != HAL_MMC_ERROR_NONE)
2636 hmmc->ErrorCode |= errorstate;
2645 case SDMMC_SPEED_MODE_DDR:
2647 if (((hmmc->Instance->CLKCR &
SDMMC_CLKCR_WIDBUS) != 0U) && ((device_type & 0x04U) != 0U))
2650 errorstate = MMC_HighSpeed(hmmc,
ENABLE);
2651 if (errorstate != HAL_MMC_ERROR_NONE)
2653 hmmc->ErrorCode |= errorstate;
2660 errorstate = MMC_DDR_Mode(hmmc,
ENABLE);
2661 if (errorstate != HAL_MMC_ERROR_NONE)
2663 hmmc->ErrorCode |= errorstate;
2671 hmmc->ErrorCode |= HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
2676 case SDMMC_SPEED_MODE_HIGH:
2678 if ((device_type & 0x02U) != 0U)
2681 errorstate = MMC_HighSpeed(hmmc,
ENABLE);
2682 if (errorstate != HAL_MMC_ERROR_NONE)
2684 hmmc->ErrorCode |= errorstate;
2690 hmmc->ErrorCode |= HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
2695 case SDMMC_SPEED_MODE_DEFAULT:
2700 errorstate = MMC_DDR_Mode(hmmc,
DISABLE);
2701 if (errorstate != HAL_MMC_ERROR_NONE)
2703 hmmc->ErrorCode |= errorstate;
2709 errorstate = MMC_HighSpeed(hmmc,
DISABLE);
2710 if (errorstate != HAL_MMC_ERROR_NONE)
2712 hmmc->ErrorCode |= errorstate;
2718 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
2725 while ((HAL_MMC_GetCardState(hmmc) != HAL_MMC_CARD_TRANSFER))
2727 if ((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2729 hmmc->ErrorCode = HAL_MMC_ERROR_TIMEOUT;
2730 hmmc->State = HAL_MMC_STATE_READY;
2736 hmmc->State = HAL_MMC_STATE_READY;
2745HAL_MMC_CardStateTypeDef HAL_MMC_GetCardState(MMC_HandleTypeDef *hmmc)
2748 uint32_t errorstate;
2749 uint32_t resp1 = 0U;
2751 errorstate = MMC_SendStatus(hmmc, &resp1);
2752 if (errorstate != HAL_MMC_ERROR_NONE)
2754 hmmc->ErrorCode |= errorstate;
2757 cardstate = ((resp1 >> 9U) & 0x0FU);
2759 return (HAL_MMC_CardStateTypeDef)cardstate;
2770 uint32_t error_code;
2773 if (hmmc->State == HAL_MMC_STATE_BUSY)
2776 __HAL_MMC_DISABLE_IT(hmmc, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
2777 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
2778 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
2786 hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance);
2787 error_code = hmmc->ErrorCode;
2788 if ((error_code != HAL_MMC_ERROR_NONE) && (error_code != HAL_MMC_ERROR_CMD_RSP_TIMEOUT))
2796 if (hmmc->ErrorCode == HAL_MMC_ERROR_NONE)
2798 while (!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DABORT | SDMMC_FLAG_BUSYD0END))
2800 if ((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2802 hmmc->ErrorCode = HAL_MMC_ERROR_TIMEOUT;
2803 hmmc->State = HAL_MMC_STATE_READY;
2809 if (hmmc->ErrorCode == HAL_MMC_ERROR_CMD_RSP_TIMEOUT)
2811 while (!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DATAEND))
2813 if ((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2815 hmmc->ErrorCode = HAL_MMC_ERROR_TIMEOUT;
2816 hmmc->State = HAL_MMC_STATE_READY;
2822 else if ((hmmc->Instance->DCTRL &
SDMMC_DCTRL_DTDIR) == SDMMC_TRANSFER_DIR_TO_SDMMC)
2824 while (!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DABORT | SDMMC_FLAG_DATAEND))
2826 if ((
HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2828 hmmc->ErrorCode = HAL_MMC_ERROR_TIMEOUT;
2829 hmmc->State = HAL_MMC_STATE_READY;
2845 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_BUSYD0END);
2846 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
2848 hmmc->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2850 hmmc->State = HAL_MMC_STATE_READY;
2853 hmmc->Context = MMC_CONTEXT_NONE;
2865 HAL_MMC_CardStateTypeDef CardState;
2868 __HAL_MMC_DISABLE_IT(hmmc, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
2869 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
2872 hmmc->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2875 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
2877 CardState = HAL_MMC_GetCardState(hmmc);
2878 hmmc->State = HAL_MMC_STATE_READY;
2880 if ((CardState == HAL_MMC_CARD_RECEIVING) || (CardState == HAL_MMC_CARD_SENDING))
2882 hmmc->ErrorCode = SDMMC_CmdStopTransfer(hmmc->Instance);
2884 if (hmmc->ErrorCode != HAL_MMC_ERROR_NONE)
2890#if defined (USE_HAL_MMC_REGISTER_CALLBACKS) && (USE_HAL_MMC_REGISTER_CALLBACKS == 1U)
2891 hmmc->AbortCpltCallback(hmmc);
2893 HAL_MMC_AbortCallback(hmmc);
2919HAL_StatusTypeDef HAL_MMC_EraseSequence(MMC_HandleTypeDef *hmmc, uint32_t EraseType,
2920 uint32_t BlockStartAdd, uint32_t BlockEndAdd)
2922 uint32_t errorstate;
2923 uint32_t start_add = BlockStartAdd;
2924 uint32_t end_add = BlockEndAdd;
2931 if (end_add < start_add)
2933 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
2938 if (end_add > (hmmc->MmcCard.LogBlockNbr))
2940 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_OUT_OF_RANGE;
2945 if (((hmmc->Ext_CSD[(MMC_EXT_CSD_DATA_SEC_SIZE_INDEX / 4)] >> MMC_EXT_CSD_DATA_SEC_SIZE_POS) & 0x000000FFU) != 0x0U)
2947 if (((start_add % 8U) != 0U) || ((end_add % 8U) != 0U))
2950 hmmc->ErrorCode |= HAL_MMC_ERROR_ADDR_MISALIGNED;
2956 if (((hmmc->MmcCard.Class) & SDMMC_CCCC_ERASE) == 0U)
2958 hmmc->ErrorCode |= HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
2963 if (hmmc->State == HAL_MMC_STATE_READY)
2966 hmmc->State = HAL_MMC_STATE_BUSY;
2969 if ((SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
2971 hmmc->ErrorCode |= HAL_MMC_ERROR_LOCK_UNLOCK_FAILED;
2972 hmmc->State = HAL_MMC_STATE_READY;
2977 if ((hmmc->MmcCard.CardType) != MMC_HIGH_CAPACITY_CARD)
2979 start_add *= MMC_BLOCKSIZE;
2980 end_add *= MMC_BLOCKSIZE;
2984 errorstate = SDMMC_CmdEraseStartAdd(hmmc->Instance, start_add);
2985 if (errorstate == HAL_MMC_ERROR_NONE)
2988 errorstate = SDMMC_CmdEraseEndAdd(hmmc->Instance, end_add);
2989 if (errorstate == HAL_MMC_ERROR_NONE)
2992 errorstate = SDMMC_CmdErase(hmmc->Instance, EraseType);
2993 if (errorstate == HAL_MMC_ERROR_NONE)
2995 if ((EraseType == HAL_MMC_SECURE_ERASE) || (EraseType == HAL_MMC_SECURE_TRIM_STEP2))
2998 while ((!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_BUSYD0END)) && (errorstate == HAL_MMC_ERROR_NONE))
3000 if ((
HAL_GetTick() - tickstart) >= SDMMC_MAXERASETIMEOUT)
3002 errorstate = HAL_MMC_ERROR_TIMEOUT;
3007 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_BUSYD0END);
3014 hmmc->State = HAL_MMC_STATE_READY;
3017 if (errorstate != HAL_MMC_ERROR_NONE)
3020 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3021 hmmc->ErrorCode |= errorstate;
3023 if (errorstate != HAL_MMC_ERROR_TIMEOUT)
3052 uint32_t errorstate;
3053 uint32_t response = 0U;
3058 if (hmmc->State == HAL_MMC_STATE_READY)
3061 hmmc->State = HAL_MMC_STATE_BUSY;
3064 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03A50100U);
3065 if (errorstate == HAL_MMC_ERROR_NONE)
3068 while ((!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_BUSYD0END)) && (errorstate == HAL_MMC_ERROR_NONE))
3070 if ((
HAL_GetTick() - tickstart) >= SDMMC_MAXERASETIMEOUT)
3072 errorstate = HAL_MMC_ERROR_TIMEOUT;
3077 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_BUSYD0END);
3079 if (errorstate == HAL_MMC_ERROR_NONE)
3082 count = SDMMC_MAX_TRIAL;
3085 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3086 if (errorstate != HAL_MMC_ERROR_NONE)
3092 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3094 }
while (((response & 0x100U) == 0U) && (
count != 0U));
3097 if ((
count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
3100 if ((response & 0x80U) != 0U)
3102 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
3105 else if (
count == 0U)
3107 errorstate = SDMMC_ERROR_TIMEOUT;
3117 hmmc->State = HAL_MMC_STATE_READY;
3120 if (errorstate != HAL_MMC_ERROR_NONE)
3123 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3124 hmmc->ErrorCode |= errorstate;
3126 if (errorstate != HAL_MMC_ERROR_TIMEOUT)
3161HAL_StatusTypeDef HAL_MMC_ConfigSecRemovalType(MMC_HandleTypeDef *hmmc, uint32_t SRTMode)
3164 uint32_t errorstate;
3165 uint32_t response = 0U;
3172 if (hmmc->State == HAL_MMC_STATE_READY)
3175 if (HAL_MMC_GetSupportedSecRemovalType(hmmc, &srt) ==
HAL_OK)
3178 hmmc->State = HAL_MMC_STATE_BUSY;
3181 if ((SRTMode & srt) != 0U)
3185 errorstate = SDMMC_CmdSwitch(hmmc->Instance, (0x03100000U | (srt << 8U)));
3186 if (errorstate == HAL_MMC_ERROR_NONE)
3189 count = SDMMC_MAX_TRIAL;
3192 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3193 if (errorstate != HAL_MMC_ERROR_NONE)
3199 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3201 }
while (((response & 0x100U) == 0U) && (
count != 0U));
3204 if ((
count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
3207 if ((response & 0x80U) != 0U)
3209 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
3212 else if (
count == 0U)
3214 errorstate = SDMMC_ERROR_TIMEOUT;
3224 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3228 hmmc->State = HAL_MMC_STATE_READY;
3232 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
3236 if (errorstate != HAL_MMC_ERROR_NONE)
3239 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3240 hmmc->ErrorCode |= errorstate;
3267HAL_StatusTypeDef HAL_MMC_GetSupportedSecRemovalType(MMC_HandleTypeDef *hmmc, uint32_t *SupportedSRT)
3270 if (hmmc->State == HAL_MMC_STATE_READY)
3273 hmmc->State = HAL_MMC_STATE_BUSY;
3276 *SupportedSRT = (hmmc->Ext_CSD[4] & 0x0000000FU);
3279 hmmc->State = HAL_MMC_STATE_READY;
3296 uint32_t errorstate,
3304 if (hmmc->State == HAL_MMC_STATE_READY)
3307 hmmc->State = HAL_MMC_STATE_BUSY;
3310 errorstate = SDMMC_CmdSwitch(hmmc->Instance, (0x03220100U));
3311 if (errorstate == HAL_MMC_ERROR_NONE)
3314 count = SDMMC_MAX_TRIAL;
3317 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3318 if (errorstate != HAL_MMC_ERROR_NONE)
3324 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3326 }
while (((response & 0x100U) == 0U) && (
count != 0U));
3331 errorstate = SDMMC_ERROR_TIMEOUT;
3333 else if (errorstate == HAL_MMC_ERROR_NONE)
3336 if ((response & 0x80U) != 0U)
3338 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3343 errorstate = SDMMC_CmdSwitch(hmmc->Instance, (0x03220400U));
3344 if (errorstate == HAL_MMC_ERROR_NONE)
3347 sleep_timeout = ((hmmc->Ext_CSD[(MMC_EXT_CSD_SLEEP_NOTIFICATION_TIME_INDEX / 4)] >>
3348 MMC_EXT_CSD_SLEEP_NOTIFICATION_TIME_POS) & 0x000000FFU);
3352 if ((sleep_timeout == 0U) || (sleep_timeout > 0x17U))
3354 sleep_timeout = 0x17U;
3356 timeout = (((1UL << sleep_timeout) / 100U) + 1U);
3359 while ((!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_BUSYD0END)) && (errorstate == HAL_MMC_ERROR_NONE))
3363 errorstate = SDMMC_ERROR_TIMEOUT;
3368 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_BUSYD0END);
3370 if (errorstate == HAL_MMC_ERROR_NONE)
3373 count = SDMMC_MAX_TRIAL;
3376 errorstate = SDMMC_CmdSendStatus(hmmc->Instance,
3377 (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3378 if (errorstate != HAL_MMC_ERROR_NONE)
3384 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3386 }
while (((response & 0x100U) == 0U) && (
count != 0U));
3391 errorstate = SDMMC_ERROR_TIMEOUT;
3393 else if (errorstate == HAL_MMC_ERROR_NONE)
3396 if ((response & 0x80U) != 0U)
3398 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3403 (void)SDMMC_CmdSelDesel(hmmc->Instance, 0U);
3406 sleep_timeout = ((hmmc->Ext_CSD[(MMC_EXT_CSD_S_A_TIMEOUT_INDEX / 4)] >>
3407 MMC_EXT_CSD_S_A_TIMEOUT_POS) & 0x000000FFU);
3411 if ((sleep_timeout == 0U) || (sleep_timeout > 0x17U))
3413 sleep_timeout = 0x17U;
3415 timeout = (((1UL << sleep_timeout) / 10000U) + 1U);
3417 if (HAL_MMC_GetCardState(hmmc) == HAL_MMC_CARD_STANDBY)
3420 errorstate = SDMMC_CmdSleepMmc(hmmc->Instance,
3421 ((hmmc->MmcCard.RelCardAdd << 16UL) | (0x1UL << 15UL)));
3422 if (errorstate == HAL_MMC_ERROR_NONE)
3425 while ((!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_BUSYD0END)) && (errorstate == HAL_MMC_ERROR_NONE))
3429 errorstate = SDMMC_ERROR_TIMEOUT;
3434 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_BUSYD0END);
3439 errorstate = SDMMC_ERROR_REQUEST_NOT_APPLICABLE;
3458 hmmc->State = HAL_MMC_STATE_READY;
3461 if (errorstate != HAL_MMC_ERROR_NONE)
3464 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3465 hmmc->ErrorCode |= errorstate;
3467 if (errorstate != HAL_MMC_ERROR_TIMEOUT)
3494 uint32_t errorstate;
3495 uint32_t sleep_timeout;
3498 uint32_t response = 0U;
3502 if (hmmc->State == HAL_MMC_STATE_READY)
3505 hmmc->State = HAL_MMC_STATE_BUSY;
3508 sleep_timeout = ((hmmc->Ext_CSD[(MMC_EXT_CSD_S_A_TIMEOUT_INDEX / 4)] >> MMC_EXT_CSD_S_A_TIMEOUT_POS) &
3513 if ((sleep_timeout == 0U) || (sleep_timeout > 0x17U))
3515 sleep_timeout = 0x17U;
3517 timeout = (((1UL << sleep_timeout) / 10000U) + 1U);
3520 errorstate = SDMMC_CmdSleepMmc(hmmc->Instance, (hmmc->MmcCard.RelCardAdd << 16U));
3521 if (errorstate == HAL_MMC_ERROR_NONE)
3524 while ((!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_BUSYD0END)) && (errorstate == HAL_MMC_ERROR_NONE))
3528 errorstate = SDMMC_ERROR_TIMEOUT;
3533 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_BUSYD0END);
3535 if (errorstate == HAL_MMC_ERROR_NONE)
3537 if (HAL_MMC_GetCardState(hmmc) == HAL_MMC_CARD_STANDBY)
3540 errorstate = SDMMC_CmdSelDesel(hmmc->Instance, (hmmc->MmcCard.RelCardAdd << 16U));
3541 if (errorstate == HAL_MMC_ERROR_NONE)
3543 if (HAL_MMC_GetCardState(hmmc) == HAL_MMC_CARD_TRANSFER)
3546 errorstate = SDMMC_CmdSwitch(hmmc->Instance, (0x03220100U));
3547 if (errorstate == HAL_MMC_ERROR_NONE)
3550 count = SDMMC_MAX_TRIAL;
3553 errorstate = SDMMC_CmdSendStatus(hmmc->Instance,
3554 (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3555 if (errorstate != HAL_MMC_ERROR_NONE)
3561 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3563 }
while (((response & 0x100U) == 0U) && (
count != 0U));
3568 errorstate = SDMMC_ERROR_TIMEOUT;
3570 else if (errorstate == HAL_MMC_ERROR_NONE)
3573 if ((response & 0x80U) != 0U)
3575 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3586 errorstate = SDMMC_ERROR_REQUEST_NOT_APPLICABLE;
3592 errorstate = SDMMC_ERROR_REQUEST_NOT_APPLICABLE;
3598 hmmc->State = HAL_MMC_STATE_READY;
3601 if (errorstate != HAL_MMC_ERROR_NONE)
3604 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3605 hmmc->ErrorCode |= errorstate;
3607 if (errorstate != HAL_MMC_ERROR_TIMEOUT)
3644static uint32_t MMC_InitCard(MMC_HandleTypeDef *hmmc)
3646 HAL_MMC_CardCSDTypeDef CSD;
3647 uint32_t errorstate;
3648 uint16_t mmc_rca = 2U;
3649 MMC_InitTypeDef Init;
3652 if (SDMMC_GetPowerState(hmmc->Instance) == 0U)
3655 return HAL_MMC_ERROR_REQUEST_NOT_APPLICABLE;
3659 errorstate = SDMMC_CmdSendCID(hmmc->Instance);
3660 if (errorstate != HAL_MMC_ERROR_NONE)
3667 hmmc->CID[0U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3668 hmmc->CID[1U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP2);
3669 hmmc->CID[2U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP3);
3670 hmmc->CID[3U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP4);
3675 errorstate = SDMMC_CmdSetRelAddMmc(hmmc->Instance, mmc_rca);
3676 if (errorstate != HAL_MMC_ERROR_NONE)
3682 hmmc->MmcCard.RelCardAdd = mmc_rca;
3685 errorstate = SDMMC_CmdSendCSD(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
3686 if (errorstate != HAL_MMC_ERROR_NONE)
3693 hmmc->CSD[0U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3694 hmmc->CSD[1U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP2);
3695 hmmc->CSD[2U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP3);
3696 hmmc->CSD[3U] = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP4);
3700 hmmc->MmcCard.Class = (SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP2) >> 20U);
3703 errorstate = SDMMC_CmdSelDesel(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3704 if (errorstate != HAL_MMC_ERROR_NONE)
3710 if (HAL_MMC_GetCardCSD(hmmc, &CSD) !=
HAL_OK)
3712 return hmmc->ErrorCode;
3716 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3717 if (errorstate != HAL_MMC_ERROR_NONE)
3719 hmmc->ErrorCode |= errorstate;
3723 if (HAL_MMC_GetCardExtCSD(hmmc, hmmc->Ext_CSD, SDMMC_DATATIMEOUT) !=
HAL_OK)
3725 return hmmc->ErrorCode;
3729 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
3730 if (errorstate != HAL_MMC_ERROR_NONE)
3732 hmmc->ErrorCode |= errorstate;
3737 Init.BusWide = SDMMC_BUS_WIDE_1B;
3738 (void)SDMMC_Init(hmmc->Instance, Init);
3741 return HAL_MMC_ERROR_NONE;
3751static uint32_t MMC_PowerON(MMC_HandleTypeDef *hmmc)
3754 uint32_t response = 0U;
3755 uint32_t validvoltage = 0U;
3756 uint32_t errorstate;
3759 errorstate = SDMMC_CmdGoIdleState(hmmc->Instance);
3760 if (errorstate != HAL_MMC_ERROR_NONE)
3765 while (validvoltage == 0U)
3767 if (
count++ == SDMMC_MAX_VOLT_TRIAL)
3769 return HAL_MMC_ERROR_INVALID_VOLTRANGE;
3773 errorstate = SDMMC_CmdOpCondition(hmmc->Instance, MMC_VOLTAGE_RANGE);
3774 if (errorstate != HAL_MMC_ERROR_NONE)
3776 return HAL_MMC_ERROR_UNSUPPORTED_FEATURE;
3780 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3783 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
3787 if (((response & (0xFF000000U)) >> 24) == 0xC0U)
3789 hmmc->MmcCard.CardType = MMC_HIGH_CAPACITY_CARD;
3793 hmmc->MmcCard.CardType = MMC_LOW_CAPACITY_CARD;
3796 return HAL_MMC_ERROR_NONE;
3804static void MMC_PowerOFF(MMC_HandleTypeDef *hmmc)
3807 (void)SDMMC_PowerState_OFF(hmmc->Instance);
3817static uint32_t MMC_SendStatus(MMC_HandleTypeDef *hmmc, uint32_t *pCardStatus)
3819 uint32_t errorstate;
3821 if (pCardStatus ==
NULL)
3823 return HAL_MMC_ERROR_PARAM;
3827 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(hmmc->MmcCard.RelCardAdd << 16U));
3828 if (errorstate != HAL_MMC_ERROR_NONE)
3834 *pCardStatus = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
3836 return HAL_MMC_ERROR_NONE;
3847static HAL_StatusTypeDef MMC_ReadExtCSD(MMC_HandleTypeDef *hmmc, uint32_t *pFieldData,
3848 uint16_t FieldIndex, uint32_t Timeout)
3850 SDMMC_DataInitTypeDef
config;
3851 uint32_t errorstate;
3857 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
3860 hmmc->Instance->DCTRL = 0;
3863 config.DataTimeOut = SDMMC_DATATIMEOUT;
3864 config.DataLength = MMC_BLOCKSIZE;
3865 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
3866 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3867 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3868 config.DPSM = SDMMC_DPSM_ENABLE;
3869 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
3872 errorstate = SDMMC_CmdSendEXTCSD(hmmc->Instance, 0);
3873 if (errorstate != HAL_MMC_ERROR_NONE)
3876 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3877 hmmc->ErrorCode |= errorstate;
3878 hmmc->State = HAL_MMC_STATE_READY;
3883 while (!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT |
3884 SDMMC_FLAG_DATAEND))
3886 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF))
3891 tmp_data = SDMMC_ReadFIFO(hmmc->Instance);
3894 if ((i +
count) == ((uint32_t)FieldIndex / 4U))
3896 *pFieldData = tmp_data;
3902 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
3905 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3906 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
3907 hmmc->State = HAL_MMC_STATE_READY;
3913 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
3916 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3917 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
3918 hmmc->State = HAL_MMC_STATE_READY;
3921 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
3924 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3925 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
3926 hmmc->State = HAL_MMC_STATE_READY;
3929 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXOVERR))
3932 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
3933 hmmc->ErrorCode |= HAL_MMC_ERROR_RX_OVERRUN;
3934 hmmc->State = HAL_MMC_STATE_READY;
3943 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16));
3944 if (errorstate != HAL_MMC_ERROR_NONE)
3946 hmmc->ErrorCode |= errorstate;
3950 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
3952 hmmc->State = HAL_MMC_STATE_READY;
3963static void MMC_Read_IT(MMC_HandleTypeDef *hmmc)
3969 tmp = hmmc->pRxBuffPtr;
3971 if (hmmc->RxXferSize >= SDMMC_FIFO_SIZE)
3976 data = SDMMC_ReadFIFO(hmmc->Instance);
3977 *tmp = (uint8_t)(data & 0xFFU);
3979 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3981 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3983 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3987 hmmc->pRxBuffPtr = tmp;
3988 hmmc->RxXferSize -= SDMMC_FIFO_SIZE;
3998static void MMC_Write_IT(MMC_HandleTypeDef *hmmc)
4004 tmp = hmmc->pTxBuffPtr;
4006 if (hmmc->TxXferSize >= SDMMC_FIFO_SIZE)
4011 data = (uint32_t)(*tmp);
4013 data |= ((uint32_t)(*tmp) << 8U);
4015 data |= ((uint32_t)(*tmp) << 16U);
4017 data |= ((uint32_t)(*tmp) << 24U);
4019 (void)SDMMC_WriteFIFO(hmmc->Instance, &data);
4022 hmmc->pTxBuffPtr = tmp;
4023 hmmc->TxXferSize -= SDMMC_FIFO_SIZE;
4035 uint32_t errorstate = HAL_MMC_ERROR_NONE;
4036 uint32_t response = 0U;
4039 SDMMC_InitTypeDef Init = {0U};
4043 errorstate = MMC_PwrClassUpdate(hmmc, (hmmc->Instance->CLKCR &
SDMMC_CLKCR_WIDBUS), SDMMC_SPEED_MODE_DEFAULT);
4044 if (errorstate == HAL_MMC_ERROR_NONE)
4047 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B90000U);
4053 errorstate = MMC_PwrClassUpdate(hmmc, (hmmc->Instance->CLKCR &
SDMMC_CLKCR_WIDBUS), SDMMC_SPEED_MODE_HIGH);
4054 if (errorstate == HAL_MMC_ERROR_NONE)
4057 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B90100U);
4061 if (errorstate == HAL_MMC_ERROR_NONE)
4064 count = SDMMC_MAX_TRIAL;
4067 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
4068 if (errorstate != HAL_MMC_ERROR_NONE)
4074 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
4076 }
while (((response & 0x100U) == 0U) && (
count != 0U));
4079 if ((
count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
4082 if ((response & 0x80U) != 0U)
4084 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4089 Init.ClockEdge = hmmc->Init.ClockEdge;
4090 Init.ClockPowerSave = hmmc->Init.ClockPowerSave;
4092 Init.HardwareFlowControl = hmmc->Init.HardwareFlowControl;
4096 Init.ClockDiv = hmmc->Init.ClockDiv;
4097 (void)SDMMC_Init(hmmc->Instance, Init);
4106 if (sdmmc_clk == 0U)
4108 errorstate = SDMMC_ERROR_INVALID_PARAMETER;
4112 if (sdmmc_clk <= MMC_HIGH_SPEED_FREQ)
4118 Init.ClockDiv = (sdmmc_clk / (2U * MMC_HIGH_SPEED_FREQ)) + 1U;
4120 (void)SDMMC_Init(hmmc->Instance, Init);
4127 else if (
count == 0U)
4129 errorstate = SDMMC_ERROR_TIMEOUT;
4148 uint32_t errorstate = HAL_MMC_ERROR_NONE;
4149 uint32_t response = 0U;
4156 errorstate = MMC_PwrClassUpdate(hmmc, SDMMC_BUS_WIDE_4B, SDMMC_SPEED_MODE_HIGH);
4157 if (errorstate == HAL_MMC_ERROR_NONE)
4160 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70100U);
4165 errorstate = MMC_PwrClassUpdate(hmmc, SDMMC_BUS_WIDE_8B, SDMMC_SPEED_MODE_HIGH);
4166 if (errorstate == HAL_MMC_ERROR_NONE)
4169 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70200U);
4178 errorstate = MMC_PwrClassUpdate(hmmc, SDMMC_BUS_WIDE_4B, SDMMC_SPEED_MODE_DDR);
4179 if (errorstate == HAL_MMC_ERROR_NONE)
4182 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70500U);
4187 errorstate = MMC_PwrClassUpdate(hmmc, SDMMC_BUS_WIDE_8B, SDMMC_SPEED_MODE_DDR);
4188 if (errorstate == HAL_MMC_ERROR_NONE)
4191 errorstate = SDMMC_CmdSwitch(hmmc->Instance, 0x03B70600U);
4196 if (errorstate == HAL_MMC_ERROR_NONE)
4199 count = SDMMC_MAX_TRIAL;
4202 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
4203 if (errorstate != HAL_MMC_ERROR_NONE)
4209 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
4211 }
while (((response & 0x100U) == 0U) && (
count != 0U));
4214 if ((
count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
4217 if ((response & 0x80U) != 0U)
4219 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4234 else if (
count == 0U)
4236 errorstate = SDMMC_ERROR_TIMEOUT;
4254static uint32_t MMC_PwrClassUpdate(MMC_HandleTypeDef *hmmc, uint32_t Wide, uint32_t Speed)
4257 uint32_t response = 0U;
4258 uint32_t errorstate = HAL_MMC_ERROR_NONE;
4259 uint32_t power_class;
4260 uint32_t supported_pwr_class;
4262 if ((Wide == SDMMC_BUS_WIDE_8B) || (Wide == SDMMC_BUS_WIDE_4B))
4267 if (MMC_ReadExtCSD(hmmc, &power_class, 187, SDMMC_DATATIMEOUT) !=
HAL_OK)
4269 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
4273 power_class = ((power_class >> 24U) & 0x000000FFU);
4277 if (Speed == SDMMC_SPEED_MODE_DDR)
4280 supported_pwr_class = ((hmmc->Ext_CSD[(MMC_EXT_CSD_PWR_CL_DDR_52_INDEX / 4)] >> MMC_EXT_CSD_PWR_CL_DDR_52_POS) &
4283 else if (Speed == SDMMC_SPEED_MODE_HIGH)
4286 supported_pwr_class = ((hmmc->Ext_CSD[(MMC_EXT_CSD_PWR_CL_52_INDEX / 4)] >> MMC_EXT_CSD_PWR_CL_52_POS) &
4292 supported_pwr_class = ((hmmc->Ext_CSD[(MMC_EXT_CSD_PWR_CL_26_INDEX / 4)] >> MMC_EXT_CSD_PWR_CL_26_POS) &
4296 if (errorstate == HAL_MMC_ERROR_NONE)
4298 if (Wide == SDMMC_BUS_WIDE_8B)
4301 supported_pwr_class = (supported_pwr_class >> 4U);
4304 if ((power_class & 0x0FU) != (supported_pwr_class & 0x0FU))
4307 errorstate = SDMMC_CmdSwitch(hmmc->Instance, (0x03BB0000U | ((supported_pwr_class & 0x0FU) << 8U)));
4309 if (errorstate == HAL_MMC_ERROR_NONE)
4312 count = SDMMC_MAX_TRIAL;
4315 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
4316 if (errorstate != HAL_MMC_ERROR_NONE)
4322 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
4324 }
while (((response & 0x100U) == 0U) && (
count != 0U));
4327 if ((
count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
4330 if ((response & 0x80U) != 0U)
4332 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4335 else if (
count == 0U)
4337 errorstate = SDMMC_ERROR_TIMEOUT;
4357HAL_StatusTypeDef HAL_MMC_SwitchPartition(MMC_HandleTypeDef *hmmc, HAL_MMC_PartitionTypeDef Partition)
4359 uint32_t errorstate;
4360 uint32_t response = 0U;
4363 uint32_t arg = Partition | 0x03B30000U;
4366 if (hmmc->State == HAL_MMC_STATE_READY)
4369 hmmc->State = HAL_MMC_STATE_BUSY;
4372 errorstate = SDMMC_CmdSwitch(hmmc->Instance, arg);
4373 if (errorstate == HAL_MMC_ERROR_NONE)
4376 while ((!__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_BUSYD0END)) && (errorstate == HAL_MMC_ERROR_NONE))
4378 if ((
HAL_GetTick() - tickstart) >= SDMMC_MAXERASETIMEOUT)
4380 errorstate = HAL_MMC_ERROR_TIMEOUT;
4385 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_FLAG_BUSYD0END);
4387 if (errorstate == HAL_MMC_ERROR_NONE)
4390 count = SDMMC_MAX_TRIAL;
4393 errorstate = SDMMC_CmdSendStatus(hmmc->Instance, (uint32_t)(((uint32_t)hmmc->MmcCard.RelCardAdd) << 16U));
4394 if (errorstate != HAL_MMC_ERROR_NONE)
4400 response = SDMMC_GetResponse(hmmc->Instance, SDMMC_RESP1);
4402 }
while (((response & 0x100U) == 0U) && (
count != 0U));
4405 if ((
count != 0U) && (errorstate == HAL_MMC_ERROR_NONE))
4408 if ((response & 0x80U) != 0U)
4410 errorstate = SDMMC_ERROR_GENERAL_UNKNOWN_ERR;
4413 else if (
count == 0U)
4415 errorstate = SDMMC_ERROR_TIMEOUT;
4425 hmmc->State = HAL_MMC_STATE_READY;
4428 if (errorstate != HAL_MMC_ERROR_NONE)
4431 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4432 hmmc->ErrorCode |= errorstate;
4434 if (errorstate != HAL_MMC_ERROR_TIMEOUT)
4461HAL_StatusTypeDef HAL_MMC_RPMB_ProgramAuthenticationKey(MMC_HandleTypeDef *hmmc,
const uint8_t *pKey, uint32_t Timeout)
4463 SDMMC_DataInitTypeDef
config;
4464 uint32_t errorstate;
4467 uint32_t byte_count = 0;
4469 uint32_t dataremaining;
4470 uint8_t tail_pack[12] = {0};
4471 uint8_t zero_pack[4] = {0};
4472 const uint8_t *rtempbuff;
4475 tail_pack[11] = 0x01;
4479 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
4483 if (hmmc->State == HAL_MMC_STATE_READY)
4485 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
4487 hmmc->State = HAL_MMC_STATE_BUSY;
4490 hmmc->Instance->DCTRL = 0U;
4492 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, 0x80000001U);
4493 if (errorstate != HAL_MMC_ERROR_NONE)
4496 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4497 hmmc->ErrorCode |= errorstate;
4498 hmmc->State = HAL_MMC_STATE_READY;
4503 config.DataTimeOut = SDMMC_DATATIMEOUT;
4504 config.DataLength = MMC_BLOCKSIZE;
4505 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
4506 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
4507 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
4508 config.DPSM = SDMMC_DPSM_DISABLE;
4509 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
4510 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
4514 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
4517 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, 0);
4520 if (errorstate != HAL_MMC_ERROR_NONE)
4523 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4524 hmmc->ErrorCode |= errorstate;
4525 hmmc->State = HAL_MMC_STATE_READY;
4530 rtempbuff = zero_pack;
4531 dataremaining =
config.DataLength;
4532 while (!__HAL_MMC_GET_FLAG(hmmc,
4533 SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
4535 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= SDMMC_FIFO_SIZE))
4540 data = (uint32_t)(*rtempbuff);
4543 data |= ((uint32_t)(*rtempbuff) << 8U);
4546 data |= ((uint32_t)(*rtempbuff) << 16U);
4549 data |= ((uint32_t)(*rtempbuff) << 24U);
4552 (void)SDMMC_WriteFIFO(hmmc->Instance, &data);
4553 if (byte_count < MMC_RPMB_KEYMAC_POSITION)
4555 rtempbuff = zero_pack;
4557 else if (byte_count == MMC_RPMB_KEYMAC_POSITION)
4561 else if ((byte_count < MMC_RPMB_WRITE_COUNTER_POSITION) && \
4562 (byte_count >= MMC_RPMB_DATA_POSITION))
4564 rtempbuff = zero_pack;
4566 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
4568 rtempbuff = tail_pack;
4576 dataremaining -= SDMMC_FIFO_SIZE;
4579 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
4582 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4583 hmmc->ErrorCode |= errorstate;
4584 hmmc->State = HAL_MMC_STATE_READY;
4588 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
4591 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, 0x00000001);
4592 if (errorstate != HAL_MMC_ERROR_NONE)
4595 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4596 hmmc->ErrorCode |= errorstate;
4597 hmmc->State = HAL_MMC_STATE_READY;
4602 config.DataTimeOut = SDMMC_DATATIMEOUT;
4603 config.DataLength = MMC_BLOCKSIZE;
4604 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
4605 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
4606 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
4607 config.DPSM = SDMMC_DPSM_DISABLE;
4608 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
4609 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
4612 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
4615 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, 0);
4617 if (errorstate != HAL_MMC_ERROR_NONE)
4620 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4621 hmmc->ErrorCode |= errorstate;
4622 hmmc->State = HAL_MMC_STATE_READY;
4627 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
4629 tempbuff = zero_pack;
4632 dataremaining =
config.DataLength;
4633 while (!__HAL_MMC_GET_FLAG(hmmc,
4634 SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
4636 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= SDMMC_FIFO_SIZE))
4641 data = SDMMC_ReadFIFO(hmmc->Instance);
4642 *tempbuff = (uint8_t)(data & 0xFFU);
4645 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
4648 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
4651 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
4654 if (byte_count < MMC_RPMB_WRITE_COUNTER_POSITION)
4656 tempbuff = zero_pack;
4658 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
4660 tempbuff = tail_pack;
4667 dataremaining -= SDMMC_FIFO_SIZE;
4670 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
4673 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4674 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
4675 hmmc->State = HAL_MMC_STATE_READY;
4679 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
4682 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
4685 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4686 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
4687 hmmc->State = HAL_MMC_STATE_READY;
4690 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
4693 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4694 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
4695 hmmc->State = HAL_MMC_STATE_READY;
4698 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXUNDERR))
4701 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4702 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
4703 hmmc->State = HAL_MMC_STATE_READY;
4712 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
4714 hmmc->State = HAL_MMC_STATE_READY;
4717 if ((tail_pack[9] != 0x00U) || (tail_pack[10] != 0x01U))
4719 hmmc->RPMBErrorCode |= tail_pack[9];
4727 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
4739uint32_t HAL_MMC_RPMB_GetWriteCounter(MMC_HandleTypeDef *hmmc, uint8_t *pNonce, uint32_t Timeout)
4741 SDMMC_DataInitTypeDef
config;
4742 uint32_t errorstate;
4745 uint32_t byte_count = 0;
4747 uint32_t dataremaining;
4748 uint8_t tail_pack[12] = {0};
4749 uint8_t zero_pack[4] = {0};
4750 uint8_t echo_nonce[16] = {0};
4751 uint8_t *tempbuff = zero_pack;
4753 tail_pack[11] = 0x02;
4757 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
4758 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4762 if (hmmc->State == HAL_MMC_STATE_READY)
4764 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
4765 hmmc->State = HAL_MMC_STATE_BUSY;
4768 hmmc->Instance->DCTRL = 0U;
4770 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, 0x00000001U);
4771 if (errorstate != HAL_MMC_ERROR_NONE)
4774 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4775 hmmc->ErrorCode |= errorstate;
4776 hmmc->State = HAL_MMC_STATE_READY;
4777 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4784 config.DataTimeOut = SDMMC_DATATIMEOUT;
4785 config.DataLength = MMC_BLOCKSIZE;
4786 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
4787 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
4788 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
4789 config.DPSM = SDMMC_DPSM_DISABLE;
4790 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
4791 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
4794 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
4797 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, 0);
4799 if (errorstate != HAL_MMC_ERROR_NONE)
4802 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4803 hmmc->ErrorCode |= errorstate;
4804 hmmc->State = HAL_MMC_STATE_READY;
4805 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4810 dataremaining =
config.DataLength;
4811 while (!__HAL_MMC_GET_FLAG(hmmc,
4812 SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
4814 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= SDMMC_FIFO_SIZE))
4820 data = (uint32_t)(*tempbuff);
4823 data |= ((uint32_t)(*tempbuff) << 8U);
4826 data |= ((uint32_t)(*tempbuff) << 16U);
4829 data |= ((uint32_t)(*tempbuff) << 24U);
4832 (void)SDMMC_WriteFIFO(hmmc->Instance, &data);
4833 if (byte_count < MMC_RPMB_NONCE_POSITION)
4835 tempbuff = zero_pack;
4837 else if (byte_count == MMC_RPMB_NONCE_POSITION)
4839 tempbuff = (uint8_t *)pNonce;
4841 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
4843 tempbuff = tail_pack;
4851 dataremaining -= SDMMC_FIFO_SIZE;
4854 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
4857 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4858 hmmc->ErrorCode |= errorstate;
4859 hmmc->State = HAL_MMC_STATE_READY;
4860 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4864 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
4867 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, 0x00000001U);
4868 if (errorstate != HAL_MMC_ERROR_NONE)
4871 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4872 hmmc->ErrorCode |= errorstate;
4873 hmmc->State = HAL_MMC_STATE_READY;
4874 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4879 config.DataTimeOut = SDMMC_DATATIMEOUT;
4880 config.DataLength = MMC_BLOCKSIZE;
4881 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
4882 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
4883 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
4884 config.DPSM = SDMMC_DPSM_DISABLE;
4885 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
4886 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
4889 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
4892 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, 0);
4894 if (errorstate != HAL_MMC_ERROR_NONE)
4897 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4898 hmmc->ErrorCode |= errorstate;
4899 hmmc->State = HAL_MMC_STATE_READY;
4900 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4905 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
4907 tempbuff = zero_pack;
4910 dataremaining =
config.DataLength;
4911 while (!__HAL_MMC_GET_FLAG(hmmc,
4912 SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
4914 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= SDMMC_FIFO_SIZE))
4919 data = SDMMC_ReadFIFO(hmmc->Instance);
4920 *tempbuff = (uint8_t)(data & 0xFFU);
4923 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
4926 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
4929 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
4932 if (byte_count < MMC_RPMB_NONCE_POSITION)
4934 tempbuff = zero_pack;
4936 else if (byte_count == MMC_RPMB_NONCE_POSITION)
4938 tempbuff = echo_nonce;
4940 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
4942 tempbuff = tail_pack;
4949 dataremaining -= SDMMC_FIFO_SIZE;
4952 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
4955 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4956 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
4957 hmmc->State = HAL_MMC_STATE_READY;
4958 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4962 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
4965 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
4968 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4969 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
4970 hmmc->State = HAL_MMC_STATE_READY;
4971 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4974 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
4977 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4978 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
4979 hmmc->State = HAL_MMC_STATE_READY;
4980 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4983 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXUNDERR))
4986 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
4987 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
4988 hmmc->State = HAL_MMC_STATE_READY;
4989 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
4998 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
5000 hmmc->State = HAL_MMC_STATE_READY;
5002 for (uint8_t i = 0; i < 16U; i++)
5004 if (pNonce[i] != echo_nonce[i])
5006 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
5011 return ((uint32_t)tail_pack[3] | ((uint32_t)tail_pack[2] << 8) | ((uint32_t)tail_pack[1] << 16) | \
5012 ((uint32_t)tail_pack[0] << 24));
5016 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
5017 hmmc->RPMBErrorCode |= HAL_MMC_ERROR_RPMB_COUNTER_FAILURE;
5033HAL_StatusTypeDef HAL_MMC_RPMB_WriteBlocks(MMC_HandleTypeDef *hmmc,
const uint8_t *pData, uint16_t BlockAdd,
5034 uint16_t NumberOfBlocks,
const uint8_t *pMAC, uint32_t Timeout)
5037 SDMMC_DataInitTypeDef
config;
5038 uint32_t errorstate;
5041 uint32_t byte_count = 0;
5043 uint32_t dataremaining;
5044 uint8_t tail_pack[12] = {0};
5045 uint8_t zero_pack[4] = {0};
5046 uint8_t echo_nonce[16] = {0};
5047 const uint8_t local_nonce[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02,
5048 0x03, 0x04, 0x00, 0x01, 0x02, 0x03, 0x04, 0x08
5050 const uint8_t *rtempbuff;
5052 uint32_t arg = 0x80000000U;
5053 uint32_t offset = 0;
5055 if ((NumberOfBlocks != 0x1U) && (NumberOfBlocks != 0x2U) && (NumberOfBlocks != 0x20U))
5057 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
5061 if ((
NULL == pData) || (
NULL == pMAC))
5063 hmmc->ErrorCode |= HAL_MMC_ERROR_PARAM;
5067 tail_pack[11] = 0x02;
5069 if (hmmc->State == HAL_MMC_STATE_READY)
5071 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
5072 hmmc->State = HAL_MMC_STATE_BUSY;
5075 hmmc->Instance->DCTRL = 0U;
5077 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, 0x00000001U);
5078 if (errorstate != HAL_MMC_ERROR_NONE)
5081 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5082 hmmc->ErrorCode |= errorstate;
5083 hmmc->State = HAL_MMC_STATE_READY;
5090 config.DataTimeOut = SDMMC_DATATIMEOUT;
5091 config.DataLength = MMC_BLOCKSIZE;
5092 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
5093 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
5094 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
5095 config.DPSM = SDMMC_DPSM_DISABLE;
5096 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
5097 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
5100 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
5103 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, 0);
5105 if (errorstate != HAL_MMC_ERROR_NONE)
5108 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5109 hmmc->ErrorCode |= errorstate;
5110 hmmc->State = HAL_MMC_STATE_READY;
5115 rtempbuff = zero_pack;
5116 dataremaining =
config.DataLength;
5117 while (!__HAL_MMC_GET_FLAG(hmmc,
5118 SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
5120 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= SDMMC_FIFO_SIZE))
5126 data = (uint32_t)(*rtempbuff);
5129 data |= ((uint32_t)(*rtempbuff) << 8U);
5132 data |= ((uint32_t)(*rtempbuff) << 16U);
5135 data |= ((uint32_t)(*rtempbuff) << 24U);
5138 (void)SDMMC_WriteFIFO(hmmc->Instance, &data);
5139 if (byte_count < MMC_RPMB_NONCE_POSITION)
5141 rtempbuff = zero_pack;
5143 else if (byte_count == MMC_RPMB_NONCE_POSITION)
5145 rtempbuff = local_nonce;
5147 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
5149 rtempbuff = tail_pack;
5156 dataremaining -= SDMMC_FIFO_SIZE;
5159 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
5162 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5163 hmmc->ErrorCode |= errorstate;
5164 hmmc->State = HAL_MMC_STATE_READY;
5168 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
5171 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, 0x00000001);
5172 if (errorstate != HAL_MMC_ERROR_NONE)
5175 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5176 hmmc->ErrorCode |= errorstate;
5177 hmmc->State = HAL_MMC_STATE_READY;
5182 config.DataTimeOut = SDMMC_DATATIMEOUT;
5183 config.DataLength = MMC_BLOCKSIZE;
5184 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
5185 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
5186 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
5187 config.DPSM = SDMMC_DPSM_DISABLE;
5188 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
5189 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
5192 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
5195 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, 0);
5197 if (errorstate != HAL_MMC_ERROR_NONE)
5200 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5201 hmmc->ErrorCode |= errorstate;
5202 hmmc->State = HAL_MMC_STATE_READY;
5207 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
5209 tempbuff = zero_pack;
5212 dataremaining =
config.DataLength;
5213 while (!__HAL_MMC_GET_FLAG(hmmc,
5214 SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
5216 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= SDMMC_FIFO_SIZE))
5221 data = SDMMC_ReadFIFO(hmmc->Instance);
5222 *tempbuff = (uint8_t)(data & 0xFFU);
5225 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
5228 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
5231 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
5234 if (byte_count < MMC_RPMB_NONCE_POSITION)
5236 tempbuff = zero_pack;
5238 else if (byte_count == MMC_RPMB_NONCE_POSITION)
5240 tempbuff = echo_nonce;
5242 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
5244 tempbuff = tail_pack;
5251 dataremaining -= SDMMC_FIFO_SIZE;
5254 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
5257 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5258 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
5259 hmmc->State = HAL_MMC_STATE_READY;
5263 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
5266 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
5269 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5270 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
5271 hmmc->State = HAL_MMC_STATE_READY;
5274 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
5277 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5278 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
5279 hmmc->State = HAL_MMC_STATE_READY;
5282 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXUNDERR))
5285 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5286 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
5287 hmmc->State = HAL_MMC_STATE_READY;
5296 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
5298 hmmc->State = HAL_MMC_STATE_READY;
5300 for (uint8_t i = 0; i < 16U; i++)
5302 if (local_nonce[i] != echo_nonce[i])
5310 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
5313 tail_pack[11] = 0x03;
5314 tail_pack[10] = 0x00;
5315 tail_pack[7] = (uint8_t)(NumberOfBlocks) & 0xFFU;
5316 tail_pack[6] = (uint8_t)(NumberOfBlocks >> 8) & 0xFFU;
5317 tail_pack[5] = (uint8_t)(BlockAdd) & 0xFFU;
5318 tail_pack[4] = (uint8_t)(BlockAdd >> 8) & 0xFFU;
5320 rtempbuff = zero_pack;
5322 arg |= NumberOfBlocks;
5324 if (hmmc->State == HAL_MMC_STATE_READY)
5326 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
5329 hmmc->State = HAL_MMC_STATE_BUSY;
5332 hmmc->Instance->DCTRL = 0U;
5334 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, arg);
5335 if (errorstate != HAL_MMC_ERROR_NONE)
5338 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5339 hmmc->ErrorCode |= errorstate;
5340 hmmc->State = HAL_MMC_STATE_READY;
5346 config.DataTimeOut = SDMMC_DATATIMEOUT;
5347 config.DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
5348 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
5349 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
5350 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
5351 config.DPSM = SDMMC_DPSM_DISABLE;
5352 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
5353 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
5358 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
5361 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, 0);
5364 if (errorstate != HAL_MMC_ERROR_NONE)
5367 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5368 hmmc->ErrorCode |= errorstate;
5369 hmmc->State = HAL_MMC_STATE_READY;
5375 dataremaining =
config.DataLength;
5376 while (!__HAL_MMC_GET_FLAG(hmmc,
5377 SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
5379 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= SDMMC_FIFO_SIZE))
5385 data = (uint32_t)(*rtempbuff);
5388 data |= ((uint32_t)(*rtempbuff) << 8U);
5391 data |= ((uint32_t)(*rtempbuff) << 16U);
5394 data |= ((uint32_t)(*rtempbuff) << 24U);
5397 (void)SDMMC_WriteFIFO(hmmc->Instance, &data);
5398 if (byte_count == MMC_RPMB_KEYMAC_POSITION)
5402 if (byte_count == MMC_RPMB_DATA_POSITION)
5404 rtempbuff = &pData[offset];
5406 if ((byte_count >= MMC_RPMB_NONCE_POSITION) && \
5407 (byte_count < MMC_RPMB_WRITE_COUNTER_POSITION))
5409 rtempbuff = zero_pack;
5411 if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
5413 rtempbuff = tail_pack;
5415 else if (byte_count == MMC_BLOCKSIZE)
5417 offset += (uint32_t)256U;
5425 dataremaining -= SDMMC_FIFO_SIZE;
5428 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
5431 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5432 hmmc->ErrorCode |= errorstate;
5433 hmmc->State = HAL_MMC_STATE_READY;
5437 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
5441 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, arg);
5442 if (errorstate != HAL_MMC_ERROR_NONE)
5445 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5446 hmmc->ErrorCode |= errorstate;
5447 hmmc->State = HAL_MMC_STATE_READY;
5452 config.DataTimeOut = SDMMC_DATATIMEOUT;
5453 config.DataLength = MMC_BLOCKSIZE;
5454 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
5455 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
5456 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
5457 config.DPSM = SDMMC_DPSM_DISABLE;
5458 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
5459 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
5464 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
5467 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, 0);
5470 if (errorstate != HAL_MMC_ERROR_NONE)
5473 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5474 hmmc->ErrorCode |= errorstate;
5475 hmmc->State = HAL_MMC_STATE_READY;
5481 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
5483 tempbuff = zero_pack;
5485 dataremaining =
config.DataLength;
5486 while (!__HAL_MMC_GET_FLAG(hmmc,
5487 SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
5489 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= SDMMC_FIFO_SIZE))
5494 data = SDMMC_ReadFIFO(hmmc->Instance);
5495 *tempbuff = (uint8_t)(data & 0xFFU);
5498 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
5501 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
5504 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
5507 if (byte_count < MMC_RPMB_WRITE_COUNTER_POSITION)
5509 tempbuff = zero_pack;
5511 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
5513 tempbuff = tail_pack;
5520 dataremaining -= SDMMC_FIFO_SIZE;
5523 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
5526 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5527 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
5528 hmmc->State = HAL_MMC_STATE_READY;
5532 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
5535 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
5538 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5539 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
5540 hmmc->State = HAL_MMC_STATE_READY;
5543 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
5546 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5547 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
5548 hmmc->State = HAL_MMC_STATE_READY;
5551 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXUNDERR))
5554 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5555 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
5556 hmmc->State = HAL_MMC_STATE_READY;
5565 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
5567 hmmc->State = HAL_MMC_STATE_READY;
5570 if (((tail_pack[9] & (uint8_t)0xFEU) != 0x00U) || (tail_pack[10] != 0x03U))
5572 hmmc->RPMBErrorCode |= tail_pack[9];
5580 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
5597HAL_StatusTypeDef HAL_MMC_RPMB_ReadBlocks(MMC_HandleTypeDef *hmmc, uint8_t *pData, uint16_t BlockAdd,
5598 uint16_t NumberOfBlocks,
const uint8_t *pNonce, uint8_t *pMAC,
5601 SDMMC_DataInitTypeDef
config;
5602 uint32_t errorstate;
5605 uint32_t byte_count = 0;
5607 uint8_t tail_pack[12] = {0};
5608 uint8_t zero_pack[4] = {0};
5609 uint8_t echo_nonce[16] = {0};
5610 uint32_t dataremaining;
5611 const uint8_t *rtempbuff;
5614 uint32_t offset = 0;
5616 arg |= NumberOfBlocks;
5618 tail_pack[11] = 0x04;
5619 tail_pack[10] = 0x00;
5620 tail_pack[7] = 0x00;
5621 tail_pack[6] = 0x00;
5622 tail_pack[5] = (uint8_t)(BlockAdd) & 0xFFU;
5623 tail_pack[4] = (uint8_t)(BlockAdd >> 8) & 0xFFU;
5624 tail_pack[3] = 0x00;
5625 tail_pack[2] = 0x00;
5626 tail_pack[1] = 0x00;
5627 tail_pack[0] = 0x00;
5629 if (hmmc->State == HAL_MMC_STATE_READY)
5631 hmmc->ErrorCode = HAL_MMC_ERROR_NONE;
5632 hmmc->State = HAL_MMC_STATE_BUSY;
5635 hmmc->Instance->DCTRL = 0U;
5637 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, 1);
5638 if (errorstate != HAL_MMC_ERROR_NONE)
5641 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5642 hmmc->ErrorCode |= errorstate;
5643 hmmc->State = HAL_MMC_STATE_READY;
5650 config.DataTimeOut = SDMMC_DATATIMEOUT;
5651 config.DataLength = MMC_BLOCKSIZE;
5652 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
5653 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
5654 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
5655 config.DPSM = SDMMC_DPSM_DISABLE;
5656 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
5657 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
5660 hmmc->Context = MMC_CONTEXT_WRITE_MULTIPLE_BLOCK;
5663 errorstate = SDMMC_CmdWriteMultiBlock(hmmc->Instance, 0);
5665 if (errorstate != HAL_MMC_ERROR_NONE)
5668 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5669 hmmc->ErrorCode |= errorstate;
5670 hmmc->State = HAL_MMC_STATE_READY;
5675 rtempbuff = zero_pack;
5676 dataremaining =
config.DataLength;
5677 while (!__HAL_MMC_GET_FLAG(hmmc,
5678 SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
5680 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= SDMMC_FIFO_SIZE))
5686 data = (uint32_t)(*rtempbuff);
5689 data |= ((uint32_t)(*rtempbuff) << 8U);
5692 data |= ((uint32_t)(*rtempbuff) << 16U);
5695 data |= ((uint32_t)(*rtempbuff) << 24U);
5698 (void)SDMMC_WriteFIFO(hmmc->Instance, &data);
5699 if (byte_count < MMC_RPMB_NONCE_POSITION)
5701 rtempbuff = zero_pack;
5703 else if (byte_count == MMC_RPMB_NONCE_POSITION)
5707 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
5709 rtempbuff = tail_pack;
5716 dataremaining -= SDMMC_FIFO_SIZE;
5719 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
5722 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5723 hmmc->ErrorCode |= errorstate;
5724 hmmc->State = HAL_MMC_STATE_READY;
5728 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
5731 errorstate = SDMMC_CmdBlockCount(hmmc->Instance, arg);
5732 if (errorstate != HAL_MMC_ERROR_NONE)
5735 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5736 hmmc->ErrorCode |= errorstate;
5737 hmmc->State = HAL_MMC_STATE_READY;
5742 config.DataTimeOut = SDMMC_DATATIMEOUT;
5743 config.DataLength = NumberOfBlocks * MMC_BLOCKSIZE;
5744 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
5745 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
5746 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
5747 config.DPSM = SDMMC_DPSM_DISABLE;
5748 (void)SDMMC_ConfigData(hmmc->Instance, &
config);
5749 __SDMMC_CMDTRANS_ENABLE(hmmc->Instance);
5752 hmmc->Context = MMC_CONTEXT_READ_MULTIPLE_BLOCK;
5755 errorstate = SDMMC_CmdReadMultiBlock(hmmc->Instance, 0);
5757 if (errorstate != HAL_MMC_ERROR_NONE)
5760 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5761 hmmc->ErrorCode |= errorstate;
5762 hmmc->State = HAL_MMC_STATE_READY;
5767 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
5769 tempbuff = zero_pack;
5772 dataremaining =
config.DataLength;
5773 while (!__HAL_MMC_GET_FLAG(hmmc,
5774 SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
5776 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= SDMMC_FIFO_SIZE))
5781 data = SDMMC_ReadFIFO(hmmc->Instance);
5782 *tempbuff = (uint8_t)(data & 0xFFU);
5785 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
5788 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
5791 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
5794 if (byte_count < MMC_RPMB_KEYMAC_POSITION)
5796 tempbuff = zero_pack;
5798 else if (byte_count == MMC_RPMB_KEYMAC_POSITION)
5800 tempbuff = (uint8_t *)pMAC;
5802 else if (byte_count == MMC_RPMB_DATA_POSITION)
5804 tempbuff = &pData[offset];
5806 else if (byte_count == MMC_RPMB_NONCE_POSITION)
5808 tempbuff = echo_nonce;
5810 else if (byte_count == MMC_RPMB_WRITE_COUNTER_POSITION)
5812 tempbuff = tail_pack;
5814 else if (byte_count == MMC_BLOCKSIZE)
5817 offset += (uint32_t)256U;
5824 dataremaining -= SDMMC_FIFO_SIZE;
5827 if (((
HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
5830 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5831 hmmc->ErrorCode |= HAL_MMC_ERROR_TIMEOUT;
5832 hmmc->State = HAL_MMC_STATE_READY;
5836 __SDMMC_CMDTRANS_DISABLE(hmmc->Instance);
5839 if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DTIMEOUT))
5842 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5843 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_TIMEOUT;
5844 hmmc->State = HAL_MMC_STATE_READY;
5847 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_DCRCFAIL))
5850 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5851 hmmc->ErrorCode |= HAL_MMC_ERROR_DATA_CRC_FAIL;
5852 hmmc->State = HAL_MMC_STATE_READY;
5855 else if (__HAL_MMC_GET_FLAG(hmmc, SDMMC_FLAG_TXUNDERR))
5858 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_FLAGS);
5859 hmmc->ErrorCode |= HAL_MMC_ERROR_TX_UNDERRUN;
5860 hmmc->State = HAL_MMC_STATE_READY;
5869 __HAL_MMC_CLEAR_FLAG(hmmc, SDMMC_STATIC_DATA_FLAGS);
5871 hmmc->State = HAL_MMC_STATE_READY;
5873 for (uint8_t i = 0; i < 16U; i++)
5875 if (pNonce[i] != echo_nonce[i])
5882 if ((tail_pack[9] != 0x00U) || (tail_pack[10] != 0x04U))
5884 hmmc->RPMBErrorCode |= tail_pack[9];
5892 hmmc->ErrorCode |= HAL_MMC_ERROR_BUSY;
5903__weak
void HAL_MMCEx_Read_DMADoubleBuf0CpltCallback(MMC_HandleTypeDef *hmmc)
5918__weak
void HAL_MMCEx_Read_DMADoubleBuf1CpltCallback(MMC_HandleTypeDef *hmmc)
5933__weak
void HAL_MMCEx_Write_DMADoubleBuf0CpltCallback(MMC_HandleTypeDef *hmmc)
5948__weak
void HAL_MMCEx_Write_DMADoubleBuf1CpltCallback(MMC_HandleTypeDef *hmmc)
#define __IO
Defines 'read / write' permissions.
void HAL_MMC_TxCpltCallback(MMC_HandleTypeDef *hmmc)
void HAL_MMC_ErrorCallback(MMC_HandleTypeDef *hmmc)
void HAL_MMC_RxCpltCallback(MMC_HandleTypeDef *hmmc)
static ActuatorControllerState state
#define HAL_DMA_ERROR_NONE
No error.
#define CLEAR_BIT(REG, BIT)
#define SET_BIT(REG, BIT)
#define POSITION_VAL(VAL)
#define READ_BIT(REG, BIT)
#define IS_SDMMC_ALL_INSTANCE(_INSTANCE_)
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 SDMMC_CLKCR_DDR
Data rate signaling selection.
#define SDMMC_CLKCR_WIDBUS
WIDBUS[1:0] bits (Wide bus mode enable bit).
#define SDMMC_CLKCR_BUSSPEED
Bus speed mode selection.
#define SDMMC_DCTRL_DTDIR
Data transfer direction selection.
#define SDMMC_CLKCR_WIDBUS_0
0x00004000
#define SDMMC_IDMA_IDMABACT
Uses buffer 1 when double buffer mode is selected.
#define SDMMC_CMD_CMDSTOP
CPSM Treats command as a Stop.
#define SDMMC_CLKCR_CLKDIV
Clock divide factor.
#define SDMMC_DCTRL_FIFORST
FIFO reset.
uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint64_t PeriphClk)
#define RCC_PERIPHCLK_SDMMC
static const idle_config_t config
size_type count(const key_type &key) const
This file contains all the functions prototypes for the HAL module driver.
#define assert_param(expr)
Uncomment the line below to expanse the "assert_param" macro in the HAL drivers code.
HAL_StatusTypeDef
HAL Status structures definition.
void HAL_MMC_MspInit(MMC_HandleTypeDef *hmmc)
MMC MSP Initialization This function configures the hardware resources used in this example.
void HAL_MMC_MspDeInit(MMC_HandleTypeDef *hmmc)
MMC MSP De-Initialization This function freeze the hardware resources used in this example.