File indexing completed on 2025-05-11 08:23:09
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254 #include "stm32h7xx_hal.h"
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264 #ifdef HAL_SD_MODULE_ENABLED
0265
0266
0267
0268
0269
0270
0271
0272 #define SD_INIT_FREQ 400000U
0273 #define SD_NORMAL_SPEED_FREQ 25000000U
0274 #define SD_HIGH_SPEED_FREQ 50000000U
0275
0276 #if defined (DLYB_SDMMC1) && defined (DLYB_SDMMC2)
0277 #define SD_GET_DLYB_INSTANCE(SDMMC_INSTANCE) (((SDMMC_INSTANCE) == SDMMC1)? \
0278 DLYB_SDMMC1 : DLYB_SDMMC2 )
0279 #elif defined (DLYB_SDMMC1)
0280 #define SD_GET_DLYB_INSTANCE(SDMMC_INSTANCE) ( DLYB_SDMMC1 )
0281 #endif
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294 static uint32_t SD_InitCard(SD_HandleTypeDef *hsd);
0295 static uint32_t SD_PowerON(SD_HandleTypeDef *hsd);
0296 static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus);
0297 static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
0298 static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd);
0299 static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd);
0300 static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);
0301 static void SD_PowerOFF(SD_HandleTypeDef *hsd);
0302 static void SD_Write_IT(SD_HandleTypeDef *hsd);
0303 static void SD_Read_IT(SD_HandleTypeDef *hsd);
0304 static uint32_t SD_SwitchSpeed(SD_HandleTypeDef *hsd, uint32_t SwitchSpeedMode);
0305 #if (USE_SD_TRANSCEIVER != 0U)
0306 static uint32_t SD_UltraHighSpeed(SD_HandleTypeDef *hsd, uint32_t UltraHighSpeedMode);
0307 static uint32_t SD_DDR_Mode(SD_HandleTypeDef *hsd);
0308 #endif
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339 HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd)
0340 {
0341 HAL_SD_CardStatusTypeDef CardStatus;
0342 uint32_t speedgrade;
0343 uint32_t unitsize;
0344 uint32_t tickstart;
0345
0346
0347 if (hsd == NULL)
0348 {
0349 return HAL_ERROR;
0350 }
0351
0352
0353 assert_param(IS_SDMMC_ALL_INSTANCE(hsd->Instance));
0354 assert_param(IS_SDMMC_CLOCK_EDGE(hsd->Init.ClockEdge));
0355 assert_param(IS_SDMMC_CLOCK_POWER_SAVE(hsd->Init.ClockPowerSave));
0356 assert_param(IS_SDMMC_BUS_WIDE(hsd->Init.BusWide));
0357 assert_param(IS_SDMMC_HARDWARE_FLOW_CONTROL(hsd->Init.HardwareFlowControl));
0358 assert_param(IS_SDMMC_CLKDIV(hsd->Init.ClockDiv));
0359
0360 if (hsd->State == HAL_SD_STATE_RESET)
0361 {
0362
0363 hsd->Lock = HAL_UNLOCKED;
0364
0365 #if (USE_SD_TRANSCEIVER != 0U)
0366
0367 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_UNKNOWN)
0368 {
0369 hsd->Init.TranceiverPresent = SDMMC_TRANSCEIVER_PRESENT;
0370 }
0371 #endif
0372 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
0373
0374 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
0375 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
0376 hsd->ErrorCallback = HAL_SD_ErrorCallback;
0377 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
0378 hsd->Read_DMADblBuf0CpltCallback = HAL_SDEx_Read_DMADoubleBuf0CpltCallback;
0379 hsd->Read_DMADblBuf1CpltCallback = HAL_SDEx_Read_DMADoubleBuf1CpltCallback;
0380 hsd->Write_DMADblBuf0CpltCallback = HAL_SDEx_Write_DMADoubleBuf0CpltCallback;
0381 hsd->Write_DMADblBuf1CpltCallback = HAL_SDEx_Write_DMADoubleBuf1CpltCallback;
0382 #if (USE_SD_TRANSCEIVER != 0U)
0383 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
0384 {
0385 hsd->DriveTransceiver_1_8V_Callback = HAL_SD_DriveTransceiver_1_8V_Callback;
0386 }
0387 #endif
0388
0389 if (hsd->MspInitCallback == NULL)
0390 {
0391 hsd->MspInitCallback = HAL_SD_MspInit;
0392 }
0393
0394
0395 hsd->MspInitCallback(hsd);
0396 #else
0397
0398 HAL_SD_MspInit(hsd);
0399 #endif
0400 }
0401
0402 hsd->State = HAL_SD_STATE_PROGRAMMING;
0403
0404
0405 if (HAL_SD_InitCard(hsd) != HAL_OK)
0406 {
0407 return HAL_ERROR;
0408 }
0409
0410 if (HAL_SD_GetCardStatus(hsd, &CardStatus) != HAL_OK)
0411 {
0412 return HAL_ERROR;
0413 }
0414
0415 speedgrade = CardStatus.UhsSpeedGrade;
0416 unitsize = CardStatus.UhsAllocationUnitSize;
0417 if ((hsd->SdCard.CardType == CARD_SDHC_SDXC) && ((speedgrade != 0U) || (unitsize != 0U)))
0418 {
0419 hsd->SdCard.CardSpeed = CARD_ULTRA_HIGH_SPEED;
0420 }
0421 else
0422 {
0423 if (hsd->SdCard.CardType == CARD_SDHC_SDXC)
0424 {
0425 hsd->SdCard.CardSpeed = CARD_HIGH_SPEED;
0426 }
0427 else
0428 {
0429 hsd->SdCard.CardSpeed = CARD_NORMAL_SPEED;
0430 }
0431
0432 }
0433
0434 if (HAL_SD_ConfigWideBusOperation(hsd, hsd->Init.BusWide) != HAL_OK)
0435 {
0436 return HAL_ERROR;
0437 }
0438
0439
0440 tickstart = HAL_GetTick();
0441 while ((HAL_SD_GetCardState(hsd) != HAL_SD_CARD_TRANSFER))
0442 {
0443 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
0444 {
0445 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
0446 hsd->State = HAL_SD_STATE_READY;
0447 return HAL_TIMEOUT;
0448 }
0449 }
0450
0451
0452 hsd->ErrorCode = HAL_SD_ERROR_NONE;
0453
0454
0455 hsd->Context = SD_CONTEXT_NONE;
0456
0457
0458 hsd->State = HAL_SD_STATE_READY;
0459
0460 return HAL_OK;
0461 }
0462
0463
0464
0465
0466
0467
0468
0469
0470 HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
0471 {
0472 uint32_t errorstate;
0473 SD_InitTypeDef Init;
0474 uint32_t sdmmc_clk;
0475
0476
0477 Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
0478 Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
0479 Init.BusWide = SDMMC_BUS_WIDE_1B;
0480 Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
0481
0482
0483 sdmmc_clk = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC);
0484 if (sdmmc_clk == 0U)
0485 {
0486 hsd->State = HAL_SD_STATE_READY;
0487 hsd->ErrorCode = SDMMC_ERROR_INVALID_PARAMETER;
0488 return HAL_ERROR;
0489 }
0490 Init.ClockDiv = sdmmc_clk / (2U * SD_INIT_FREQ);
0491
0492 #if (USE_SD_TRANSCEIVER != 0U)
0493 Init.TranceiverPresent = hsd->Init.TranceiverPresent;
0494
0495 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
0496 {
0497
0498 hsd->Instance->POWER |= SDMMC_POWER_DIRPOL;
0499 }
0500 #elif defined (USE_SD_DIRPOL)
0501
0502 hsd->Instance->POWER |= SDMMC_POWER_DIRPOL;
0503 #endif
0504
0505
0506 (void)SDMMC_Init(hsd->Instance, Init);
0507
0508
0509 (void)SDMMC_PowerState_ON(hsd->Instance);
0510
0511
0512
0513 if (Init.ClockDiv != 0U)
0514 {
0515 sdmmc_clk = sdmmc_clk / (2U * Init.ClockDiv);
0516 }
0517
0518 if (sdmmc_clk != 0U)
0519 {
0520 HAL_Delay(1U + (74U * 1000U / (sdmmc_clk)));
0521 }
0522
0523
0524 errorstate = SD_PowerON(hsd);
0525 if (errorstate != HAL_SD_ERROR_NONE)
0526 {
0527 hsd->State = HAL_SD_STATE_READY;
0528 hsd->ErrorCode |= errorstate;
0529 return HAL_ERROR;
0530 }
0531
0532
0533 errorstate = SD_InitCard(hsd);
0534 if (errorstate != HAL_SD_ERROR_NONE)
0535 {
0536 hsd->State = HAL_SD_STATE_READY;
0537 hsd->ErrorCode |= errorstate;
0538 return HAL_ERROR;
0539 }
0540
0541
0542 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
0543 if (errorstate != HAL_SD_ERROR_NONE)
0544 {
0545
0546 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0547 hsd->ErrorCode |= errorstate;
0548 hsd->State = HAL_SD_STATE_READY;
0549 return HAL_ERROR;
0550 }
0551
0552 return HAL_OK;
0553 }
0554
0555
0556
0557
0558
0559
0560 HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
0561 {
0562
0563 if (hsd == NULL)
0564 {
0565 return HAL_ERROR;
0566 }
0567
0568
0569 assert_param(IS_SDMMC_ALL_INSTANCE(hsd->Instance));
0570
0571 hsd->State = HAL_SD_STATE_BUSY;
0572
0573 #if (USE_SD_TRANSCEIVER != 0U)
0574
0575 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
0576 {
0577 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
0578 if (hsd->DriveTransceiver_1_8V_Callback == NULL)
0579 {
0580 hsd->DriveTransceiver_1_8V_Callback = HAL_SD_DriveTransceiver_1_8V_Callback;
0581 }
0582 hsd->DriveTransceiver_1_8V_Callback(RESET);
0583 #else
0584 HAL_SD_DriveTransceiver_1_8V_Callback(RESET);
0585 #endif
0586 }
0587 #endif
0588
0589
0590 SD_PowerOFF(hsd);
0591
0592 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
0593 if (hsd->MspDeInitCallback == NULL)
0594 {
0595 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
0596 }
0597
0598
0599 hsd->MspDeInitCallback(hsd);
0600 #else
0601
0602 HAL_SD_MspDeInit(hsd);
0603 #endif
0604
0605 hsd->ErrorCode = HAL_SD_ERROR_NONE;
0606 hsd->State = HAL_SD_STATE_RESET;
0607
0608 return HAL_OK;
0609 }
0610
0611
0612 #ifndef __rtems__
0613
0614
0615
0616
0617
0618 __weak void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
0619 {
0620
0621 UNUSED(hsd);
0622
0623
0624
0625
0626 }
0627 #endif
0628
0629
0630
0631
0632
0633
0634 __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
0635 {
0636
0637 UNUSED(hsd);
0638
0639
0640
0641
0642 }
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675 HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks,
0676 uint32_t Timeout)
0677 {
0678 SDMMC_DataInitTypeDef config;
0679 uint32_t errorstate;
0680 uint32_t tickstart = HAL_GetTick();
0681 uint32_t count;
0682 uint32_t data;
0683 uint32_t dataremaining;
0684 uint32_t add = BlockAdd;
0685 uint8_t *tempbuff = pData;
0686
0687 if (NULL == pData)
0688 {
0689 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
0690 return HAL_ERROR;
0691 }
0692
0693 if (hsd->State == HAL_SD_STATE_READY)
0694 {
0695 hsd->ErrorCode = HAL_SD_ERROR_NONE;
0696
0697 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
0698 {
0699 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
0700 return HAL_ERROR;
0701 }
0702
0703 hsd->State = HAL_SD_STATE_BUSY;
0704
0705
0706 hsd->Instance->DCTRL = 0U;
0707
0708 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
0709 {
0710 add *= 512U;
0711 }
0712
0713
0714 config.DataTimeOut = SDMMC_DATATIMEOUT;
0715 config.DataLength = NumberOfBlocks * BLOCKSIZE;
0716 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
0717 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
0718 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
0719 config.DPSM = SDMMC_DPSM_DISABLE;
0720 (void)SDMMC_ConfigData(hsd->Instance, &config);
0721 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
0722
0723
0724 if (NumberOfBlocks > 1U)
0725 {
0726 hsd->Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;
0727
0728
0729 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
0730 }
0731 else
0732 {
0733 hsd->Context = SD_CONTEXT_READ_SINGLE_BLOCK;
0734
0735
0736 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
0737 }
0738 if (errorstate != HAL_SD_ERROR_NONE)
0739 {
0740
0741 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0742 hsd->ErrorCode |= errorstate;
0743 hsd->State = HAL_SD_STATE_READY;
0744 hsd->Context = SD_CONTEXT_NONE;
0745 return HAL_ERROR;
0746 }
0747
0748
0749 dataremaining = config.DataLength;
0750 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
0751 {
0752 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF) && (dataremaining >= 32U))
0753 {
0754
0755 for (count = 0U; count < 8U; count++)
0756 {
0757 data = SDMMC_ReadFIFO(hsd->Instance);
0758 *tempbuff = (uint8_t)(data & 0xFFU);
0759 tempbuff++;
0760 *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
0761 tempbuff++;
0762 *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
0763 tempbuff++;
0764 *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
0765 tempbuff++;
0766 }
0767 dataremaining -= 32U;
0768 }
0769
0770 if (((HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
0771 {
0772
0773 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0774 hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
0775 hsd->State = HAL_SD_STATE_READY;
0776 hsd->Context = SD_CONTEXT_NONE;
0777 return HAL_TIMEOUT;
0778 }
0779 }
0780 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
0781
0782
0783 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
0784 {
0785 if (hsd->SdCard.CardType != CARD_SECURED)
0786 {
0787
0788 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
0789 if (errorstate != HAL_SD_ERROR_NONE)
0790 {
0791
0792 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0793 hsd->ErrorCode |= errorstate;
0794 hsd->State = HAL_SD_STATE_READY;
0795 hsd->Context = SD_CONTEXT_NONE;
0796 return HAL_ERROR;
0797 }
0798 }
0799 }
0800
0801
0802 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
0803 {
0804
0805 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0806 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
0807 hsd->State = HAL_SD_STATE_READY;
0808 hsd->Context = SD_CONTEXT_NONE;
0809 return HAL_ERROR;
0810 }
0811 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
0812 {
0813
0814 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0815 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
0816 hsd->State = HAL_SD_STATE_READY;
0817 hsd->Context = SD_CONTEXT_NONE;
0818 return HAL_ERROR;
0819 }
0820 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
0821 {
0822
0823 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0824 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
0825 hsd->State = HAL_SD_STATE_READY;
0826 hsd->Context = SD_CONTEXT_NONE;
0827 return HAL_ERROR;
0828 }
0829 else
0830 {
0831
0832 }
0833
0834
0835 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
0836
0837 hsd->State = HAL_SD_STATE_READY;
0838
0839 return HAL_OK;
0840 }
0841 else
0842 {
0843 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
0844 return HAL_ERROR;
0845 }
0846 }
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860 HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, const uint8_t *pData, uint32_t BlockAdd,
0861 uint32_t NumberOfBlocks, uint32_t Timeout)
0862 {
0863 SDMMC_DataInitTypeDef config;
0864 uint32_t errorstate;
0865 uint32_t tickstart = HAL_GetTick();
0866 uint32_t count;
0867 uint32_t data;
0868 uint32_t dataremaining;
0869 uint32_t add = BlockAdd;
0870 const uint8_t *tempbuff = pData;
0871
0872 if (NULL == pData)
0873 {
0874 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
0875 return HAL_ERROR;
0876 }
0877
0878 if (hsd->State == HAL_SD_STATE_READY)
0879 {
0880 hsd->ErrorCode = HAL_SD_ERROR_NONE;
0881
0882 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
0883 {
0884 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
0885 return HAL_ERROR;
0886 }
0887
0888 hsd->State = HAL_SD_STATE_BUSY;
0889
0890
0891 hsd->Instance->DCTRL = 0U;
0892
0893 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
0894 {
0895 add *= 512U;
0896 }
0897
0898
0899 config.DataTimeOut = SDMMC_DATATIMEOUT;
0900 config.DataLength = NumberOfBlocks * BLOCKSIZE;
0901 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
0902 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
0903 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
0904 config.DPSM = SDMMC_DPSM_DISABLE;
0905 (void)SDMMC_ConfigData(hsd->Instance, &config);
0906 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
0907
0908
0909 if (NumberOfBlocks > 1U)
0910 {
0911 hsd->Context = SD_CONTEXT_WRITE_MULTIPLE_BLOCK;
0912
0913
0914 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
0915 }
0916 else
0917 {
0918 hsd->Context = SD_CONTEXT_WRITE_SINGLE_BLOCK;
0919
0920
0921 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
0922 }
0923 if (errorstate != HAL_SD_ERROR_NONE)
0924 {
0925
0926 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0927 hsd->ErrorCode |= errorstate;
0928 hsd->State = HAL_SD_STATE_READY;
0929 hsd->Context = SD_CONTEXT_NONE;
0930 return HAL_ERROR;
0931 }
0932
0933
0934 dataremaining = config.DataLength;
0935 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXUNDERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT |
0936 SDMMC_FLAG_DATAEND))
0937 {
0938 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXFIFOHE) && (dataremaining >= 32U))
0939 {
0940
0941 for (count = 0U; count < 8U; count++)
0942 {
0943 data = (uint32_t)(*tempbuff);
0944 tempbuff++;
0945 data |= ((uint32_t)(*tempbuff) << 8U);
0946 tempbuff++;
0947 data |= ((uint32_t)(*tempbuff) << 16U);
0948 tempbuff++;
0949 data |= ((uint32_t)(*tempbuff) << 24U);
0950 tempbuff++;
0951 (void)SDMMC_WriteFIFO(hsd->Instance, &data);
0952 }
0953 dataremaining -= 32U;
0954 }
0955
0956 if (((HAL_GetTick() - tickstart) >= Timeout) || (Timeout == 0U))
0957 {
0958
0959 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0960 hsd->ErrorCode |= errorstate;
0961 hsd->State = HAL_SD_STATE_READY;
0962 hsd->Context = SD_CONTEXT_NONE;
0963 return HAL_TIMEOUT;
0964 }
0965 }
0966 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
0967
0968
0969 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) && (NumberOfBlocks > 1U))
0970 {
0971 if (hsd->SdCard.CardType != CARD_SECURED)
0972 {
0973
0974 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
0975 if (errorstate != HAL_SD_ERROR_NONE)
0976 {
0977
0978 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0979 hsd->ErrorCode |= errorstate;
0980 hsd->State = HAL_SD_STATE_READY;
0981 hsd->Context = SD_CONTEXT_NONE;
0982 return HAL_ERROR;
0983 }
0984 }
0985 }
0986
0987
0988 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
0989 {
0990
0991 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
0992 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
0993 hsd->State = HAL_SD_STATE_READY;
0994 hsd->Context = SD_CONTEXT_NONE;
0995 return HAL_ERROR;
0996 }
0997 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
0998 {
0999
1000 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1001 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1002 hsd->State = HAL_SD_STATE_READY;
1003 hsd->Context = SD_CONTEXT_NONE;
1004 return HAL_ERROR;
1005 }
1006 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXUNDERR))
1007 {
1008
1009 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1010 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1011 hsd->State = HAL_SD_STATE_READY;
1012 hsd->Context = SD_CONTEXT_NONE;
1013 return HAL_ERROR;
1014 }
1015 else
1016 {
1017
1018 }
1019
1020
1021 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1022
1023 hsd->State = HAL_SD_STATE_READY;
1024
1025 return HAL_OK;
1026 }
1027 else
1028 {
1029 hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
1030 return HAL_ERROR;
1031 }
1032 }
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047 HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd,
1048 uint32_t NumberOfBlocks)
1049 {
1050 SDMMC_DataInitTypeDef config;
1051 uint32_t errorstate;
1052 uint32_t add = BlockAdd;
1053
1054 if (NULL == pData)
1055 {
1056 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1057 return HAL_ERROR;
1058 }
1059
1060 if (hsd->State == HAL_SD_STATE_READY)
1061 {
1062 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1063
1064 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1065 {
1066 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1067 return HAL_ERROR;
1068 }
1069
1070 hsd->State = HAL_SD_STATE_BUSY;
1071
1072
1073 hsd->Instance->DCTRL = 0U;
1074
1075 hsd->pRxBuffPtr = pData;
1076 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1077
1078 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1079 {
1080 add *= 512U;
1081 }
1082
1083
1084 config.DataTimeOut = SDMMC_DATATIMEOUT;
1085 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1086 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1087 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
1088 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1089 config.DPSM = SDMMC_DPSM_DISABLE;
1090 (void)SDMMC_ConfigData(hsd->Instance, &config);
1091 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1092
1093
1094 if (NumberOfBlocks > 1U)
1095 {
1096 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1097
1098
1099 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1100 }
1101 else
1102 {
1103 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_IT);
1104
1105
1106 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1107 }
1108 if (errorstate != HAL_SD_ERROR_NONE)
1109 {
1110
1111 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1112 hsd->ErrorCode |= errorstate;
1113 hsd->State = HAL_SD_STATE_READY;
1114 hsd->Context = SD_CONTEXT_NONE;
1115 return HAL_ERROR;
1116 }
1117
1118 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND |
1119 SDMMC_FLAG_RXFIFOHF));
1120
1121 return HAL_OK;
1122 }
1123 else
1124 {
1125 return HAL_BUSY;
1126 }
1127 }
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142 HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, const uint8_t *pData, uint32_t BlockAdd,
1143 uint32_t NumberOfBlocks)
1144 {
1145 SDMMC_DataInitTypeDef config;
1146 uint32_t errorstate;
1147 uint32_t add = BlockAdd;
1148
1149 if (NULL == pData)
1150 {
1151 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1152 return HAL_ERROR;
1153 }
1154
1155 if (hsd->State == HAL_SD_STATE_READY)
1156 {
1157 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1158
1159 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1160 {
1161 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1162 return HAL_ERROR;
1163 }
1164
1165 hsd->State = HAL_SD_STATE_BUSY;
1166
1167
1168 hsd->Instance->DCTRL = 0U;
1169
1170 hsd->pTxBuffPtr = pData;
1171 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1172
1173 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1174 {
1175 add *= 512U;
1176 }
1177
1178
1179 config.DataTimeOut = SDMMC_DATATIMEOUT;
1180 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1181 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1182 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
1183 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1184 config.DPSM = SDMMC_DPSM_DISABLE;
1185 (void)SDMMC_ConfigData(hsd->Instance, &config);
1186
1187 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1188
1189
1190 if (NumberOfBlocks > 1U)
1191 {
1192 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1193
1194
1195 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1196 }
1197 else
1198 {
1199 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_IT);
1200
1201
1202 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1203 }
1204 if (errorstate != HAL_SD_ERROR_NONE)
1205 {
1206
1207 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1208 hsd->ErrorCode |= errorstate;
1209 hsd->State = HAL_SD_STATE_READY;
1210 hsd->Context = SD_CONTEXT_NONE;
1211 return HAL_ERROR;
1212 }
1213
1214
1215 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND |
1216 SDMMC_FLAG_TXFIFOHE));
1217
1218 return HAL_OK;
1219 }
1220 else
1221 {
1222 return HAL_BUSY;
1223 }
1224 }
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239 HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd,
1240 uint32_t NumberOfBlocks)
1241 {
1242 SDMMC_DataInitTypeDef config;
1243 uint32_t errorstate;
1244 uint32_t add = BlockAdd;
1245
1246 if (NULL == pData)
1247 {
1248 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1249 return HAL_ERROR;
1250 }
1251
1252 if (hsd->State == HAL_SD_STATE_READY)
1253 {
1254 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1255
1256 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1257 {
1258 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1259 return HAL_ERROR;
1260 }
1261
1262 hsd->State = HAL_SD_STATE_BUSY;
1263
1264
1265 hsd->Instance->DCTRL = 0U;
1266
1267 hsd->pRxBuffPtr = pData;
1268 hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
1269
1270 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1271 {
1272 add *= 512U;
1273 }
1274
1275
1276 config.DataTimeOut = SDMMC_DATATIMEOUT;
1277 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1278 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1279 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
1280 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1281 config.DPSM = SDMMC_DPSM_DISABLE;
1282 (void)SDMMC_ConfigData(hsd->Instance, &config);
1283
1284 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1285 hsd->Instance->IDMABASE0 = (uint32_t) pData ;
1286 hsd->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1287
1288
1289 if (NumberOfBlocks > 1U)
1290 {
1291 hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1292
1293
1294 errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1295 }
1296 else
1297 {
1298 hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_DMA);
1299
1300
1301 errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1302 }
1303 if (errorstate != HAL_SD_ERROR_NONE)
1304 {
1305
1306 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1307 hsd->ErrorCode |= errorstate;
1308 hsd->State = HAL_SD_STATE_READY;
1309 hsd->Context = SD_CONTEXT_NONE;
1310 return HAL_ERROR;
1311 }
1312
1313
1314 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_RXOVERR | SDMMC_IT_DATAEND));
1315
1316
1317 return HAL_OK;
1318 }
1319 else
1320 {
1321 return HAL_BUSY;
1322 }
1323 }
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338 HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, const uint8_t *pData, uint32_t BlockAdd,
1339 uint32_t NumberOfBlocks)
1340 {
1341 SDMMC_DataInitTypeDef config;
1342 uint32_t errorstate;
1343 uint32_t add = BlockAdd;
1344
1345 if (NULL == pData)
1346 {
1347 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1348 return HAL_ERROR;
1349 }
1350
1351 if (hsd->State == HAL_SD_STATE_READY)
1352 {
1353 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1354
1355 if ((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1356 {
1357 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1358 return HAL_ERROR;
1359 }
1360
1361 hsd->State = HAL_SD_STATE_BUSY;
1362
1363
1364 hsd->Instance->DCTRL = 0U;
1365
1366 hsd->pTxBuffPtr = pData;
1367 hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1368
1369 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1370 {
1371 add *= 512U;
1372 }
1373
1374
1375 config.DataTimeOut = SDMMC_DATATIMEOUT;
1376 config.DataLength = BLOCKSIZE * NumberOfBlocks;
1377 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_512B;
1378 config.TransferDir = SDMMC_TRANSFER_DIR_TO_CARD;
1379 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
1380 config.DPSM = SDMMC_DPSM_DISABLE;
1381 (void)SDMMC_ConfigData(hsd->Instance, &config);
1382
1383
1384 __SDMMC_CMDTRANS_ENABLE(hsd->Instance);
1385
1386 hsd->Instance->IDMABASE0 = (uint32_t) pData ;
1387 hsd->Instance->IDMACTRL = SDMMC_ENABLE_IDMA_SINGLE_BUFF;
1388
1389
1390 if (NumberOfBlocks > 1U)
1391 {
1392 hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1393
1394
1395 errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1396 }
1397 else
1398 {
1399 hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_DMA);
1400
1401
1402 errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1403 }
1404 if (errorstate != HAL_SD_ERROR_NONE)
1405 {
1406
1407 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1408 hsd->ErrorCode |= errorstate;
1409 hsd->State = HAL_SD_STATE_READY;
1410 hsd->Context = SD_CONTEXT_NONE;
1411 return HAL_ERROR;
1412 }
1413
1414
1415 __HAL_SD_ENABLE_IT(hsd, (SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | SDMMC_IT_TXUNDERR | SDMMC_IT_DATAEND));
1416
1417 return HAL_OK;
1418 }
1419 else
1420 {
1421 return HAL_BUSY;
1422 }
1423 }
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434 HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
1435 {
1436 uint32_t errorstate;
1437 uint32_t start_add = BlockStartAdd;
1438 uint32_t end_add = BlockEndAdd;
1439
1440 if (hsd->State == HAL_SD_STATE_READY)
1441 {
1442 hsd->ErrorCode = HAL_SD_ERROR_NONE;
1443
1444 if (end_add < start_add)
1445 {
1446 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1447 return HAL_ERROR;
1448 }
1449
1450 if (end_add > (hsd->SdCard.LogBlockNbr))
1451 {
1452 hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1453 return HAL_ERROR;
1454 }
1455
1456 hsd->State = HAL_SD_STATE_BUSY;
1457
1458
1459 if (((hsd->SdCard.Class) & SDMMC_CCCC_ERASE) == 0U)
1460 {
1461
1462 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1463 hsd->ErrorCode |= HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
1464 hsd->State = HAL_SD_STATE_READY;
1465 return HAL_ERROR;
1466 }
1467
1468 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1469 {
1470
1471 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1472 hsd->ErrorCode |= HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
1473 hsd->State = HAL_SD_STATE_READY;
1474 return HAL_ERROR;
1475 }
1476
1477
1478 if (hsd->SdCard.CardType != CARD_SDHC_SDXC)
1479 {
1480 start_add *= 512U;
1481 end_add *= 512U;
1482 }
1483
1484
1485 if (hsd->SdCard.CardType != CARD_SECURED)
1486 {
1487
1488 errorstate = SDMMC_CmdSDEraseStartAdd(hsd->Instance, start_add);
1489 if (errorstate != HAL_SD_ERROR_NONE)
1490 {
1491
1492 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1493 hsd->ErrorCode |= errorstate;
1494 hsd->State = HAL_SD_STATE_READY;
1495 return HAL_ERROR;
1496 }
1497
1498
1499 errorstate = SDMMC_CmdSDEraseEndAdd(hsd->Instance, end_add);
1500 if (errorstate != HAL_SD_ERROR_NONE)
1501 {
1502
1503 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1504 hsd->ErrorCode |= errorstate;
1505 hsd->State = HAL_SD_STATE_READY;
1506 return HAL_ERROR;
1507 }
1508 }
1509
1510
1511 errorstate = SDMMC_CmdErase(hsd->Instance, 0UL);
1512 if (errorstate != HAL_SD_ERROR_NONE)
1513 {
1514
1515 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
1516 hsd->ErrorCode |= errorstate;
1517 hsd->State = HAL_SD_STATE_READY;
1518 return HAL_ERROR;
1519 }
1520
1521 hsd->State = HAL_SD_STATE_READY;
1522
1523 return HAL_OK;
1524 }
1525 else
1526 {
1527 return HAL_BUSY;
1528 }
1529 }
1530
1531
1532
1533
1534
1535
1536 void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
1537 {
1538 uint32_t errorstate;
1539 uint32_t context = hsd->Context;
1540
1541
1542 if ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1543 {
1544 SD_Read_IT(hsd);
1545 }
1546
1547 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND) != RESET)
1548 {
1549 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DATAEND);
1550
1551 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
1552 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR | SDMMC_IT_TXFIFOHE | \
1553 SDMMC_IT_RXFIFOHF);
1554
1555 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_IDMABTC);
1556 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
1557
1558 if ((context & SD_CONTEXT_IT) != 0U)
1559 {
1560 if (((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1561 {
1562 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1563 if (errorstate != HAL_SD_ERROR_NONE)
1564 {
1565 hsd->ErrorCode |= errorstate;
1566 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1567 hsd->ErrorCallback(hsd);
1568 #else
1569 HAL_SD_ErrorCallback(hsd);
1570 #endif
1571 }
1572 }
1573
1574
1575 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1576
1577 hsd->State = HAL_SD_STATE_READY;
1578 hsd->Context = SD_CONTEXT_NONE;
1579 if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1580 {
1581 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1582 hsd->RxCpltCallback(hsd);
1583 #else
1584 HAL_SD_RxCpltCallback(hsd);
1585 #endif
1586 }
1587 else
1588 {
1589 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1590 hsd->TxCpltCallback(hsd);
1591 #else
1592 HAL_SD_TxCpltCallback(hsd);
1593 #endif
1594 }
1595 }
1596 else if ((context & SD_CONTEXT_DMA) != 0U)
1597 {
1598 hsd->Instance->DLEN = 0;
1599 hsd->Instance->DCTRL = 0;
1600 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
1601
1602
1603 if (((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1604 {
1605 errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1606 if (errorstate != HAL_SD_ERROR_NONE)
1607 {
1608 hsd->ErrorCode |= errorstate;
1609 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1610 hsd->ErrorCallback(hsd);
1611 #else
1612 HAL_SD_ErrorCallback(hsd);
1613 #endif
1614 }
1615 }
1616
1617 hsd->State = HAL_SD_STATE_READY;
1618 hsd->Context = SD_CONTEXT_NONE;
1619 if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1620 {
1621 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1622 hsd->TxCpltCallback(hsd);
1623 #else
1624 HAL_SD_TxCpltCallback(hsd);
1625 #endif
1626 }
1627 if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1628 {
1629 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1630 hsd->RxCpltCallback(hsd);
1631 #else
1632 HAL_SD_RxCpltCallback(hsd);
1633 #endif
1634 }
1635 }
1636 else
1637 {
1638
1639 }
1640 }
1641
1642 else if ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_TXFIFOHE) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1643 {
1644 SD_Write_IT(hsd);
1645 }
1646
1647 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_RXOVERR |
1648 SDMMC_FLAG_TXUNDERR) != RESET)
1649 {
1650
1651 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_DCRCFAIL) != RESET)
1652 {
1653 hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1654 }
1655 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_DTIMEOUT) != RESET)
1656 {
1657 hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1658 }
1659 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_RXOVERR) != RESET)
1660 {
1661 hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
1662 }
1663 if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_TXUNDERR) != RESET)
1664 {
1665 hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1666 }
1667
1668
1669 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
1670
1671
1672 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
1673 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
1674
1675 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
1676 hsd->Instance->DCTRL |= SDMMC_DCTRL_FIFORST;
1677 hsd->Instance->CMD |= SDMMC_CMD_CMDSTOP;
1678 hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
1679 hsd->Instance->CMD &= ~(SDMMC_CMD_CMDSTOP);
1680 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DABORT);
1681
1682 if ((context & SD_CONTEXT_IT) != 0U)
1683 {
1684
1685 hsd->State = HAL_SD_STATE_READY;
1686 hsd->Context = SD_CONTEXT_NONE;
1687 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1688 hsd->ErrorCallback(hsd);
1689 #else
1690 HAL_SD_ErrorCallback(hsd);
1691 #endif
1692 }
1693 else if ((context & SD_CONTEXT_DMA) != 0U)
1694 {
1695 if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
1696 {
1697
1698 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_IDMABTC);
1699 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
1700
1701
1702 hsd->State = HAL_SD_STATE_READY;
1703 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1704 hsd->ErrorCallback(hsd);
1705 #else
1706 HAL_SD_ErrorCallback(hsd);
1707 #endif
1708 }
1709 }
1710 else
1711 {
1712
1713 }
1714 }
1715
1716 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_IDMABTC) != RESET)
1717 {
1718 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_IDMABTC);
1719 if (READ_BIT(hsd->Instance->IDMACTRL, SDMMC_IDMA_IDMABACT) == 0U)
1720 {
1721
1722 if ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1723 {
1724 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1725 hsd->Write_DMADblBuf1CpltCallback(hsd);
1726 #else
1727 HAL_SDEx_Write_DMADoubleBuf1CpltCallback(hsd);
1728 #endif
1729 }
1730 else
1731 {
1732 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1733 hsd->Read_DMADblBuf1CpltCallback(hsd);
1734 #else
1735 HAL_SDEx_Read_DMADoubleBuf1CpltCallback(hsd);
1736 #endif
1737 }
1738 }
1739 else
1740 {
1741
1742 if ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1743 {
1744 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1745 hsd->Write_DMADblBuf0CpltCallback(hsd);
1746 #else
1747 HAL_SDEx_Write_DMADoubleBuf0CpltCallback(hsd);
1748 #endif
1749 }
1750 else
1751 {
1752 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1753 hsd->Read_DMADblBuf0CpltCallback(hsd);
1754 #else
1755 HAL_SDEx_Read_DMADoubleBuf0CpltCallback(hsd);
1756 #endif
1757 }
1758 }
1759 }
1760 else
1761 {
1762
1763 }
1764 }
1765
1766
1767
1768
1769
1770
1771 HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd)
1772 {
1773 return hsd->State;
1774 }
1775
1776
1777
1778
1779
1780
1781
1782 uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd)
1783 {
1784 return hsd->ErrorCode;
1785 }
1786
1787
1788
1789
1790
1791
1792 __weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
1793 {
1794
1795 UNUSED(hsd);
1796
1797
1798
1799
1800 }
1801
1802
1803
1804
1805
1806
1807 __weak void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
1808 {
1809
1810 UNUSED(hsd);
1811
1812
1813
1814
1815 }
1816
1817
1818
1819
1820
1821
1822 __weak void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
1823 {
1824
1825 UNUSED(hsd);
1826
1827
1828
1829
1830 }
1831
1832
1833
1834
1835
1836
1837 __weak void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
1838 {
1839
1840 UNUSED(hsd);
1841
1842
1843
1844
1845 }
1846
1847 #if (USE_SD_TRANSCEIVER != 0U)
1848
1849
1850
1851
1852
1853 __weak void HAL_SD_DriveTransceiver_1_8V_Callback(FlagStatus status)
1854 {
1855
1856 UNUSED(status);
1857
1858
1859
1860 }
1861 #endif
1862
1863 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886 HAL_StatusTypeDef HAL_SD_RegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID,
1887 pSD_CallbackTypeDef pCallback)
1888 {
1889 HAL_StatusTypeDef status = HAL_OK;
1890
1891 if (pCallback == NULL)
1892 {
1893
1894 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1895 return HAL_ERROR;
1896 }
1897
1898 if (hsd->State == HAL_SD_STATE_READY)
1899 {
1900 switch (CallbackID)
1901 {
1902 case HAL_SD_TX_CPLT_CB_ID :
1903 hsd->TxCpltCallback = pCallback;
1904 break;
1905 case HAL_SD_RX_CPLT_CB_ID :
1906 hsd->RxCpltCallback = pCallback;
1907 break;
1908 case HAL_SD_ERROR_CB_ID :
1909 hsd->ErrorCallback = pCallback;
1910 break;
1911 case HAL_SD_ABORT_CB_ID :
1912 hsd->AbortCpltCallback = pCallback;
1913 break;
1914 case HAL_SD_READ_DMA_DBL_BUF0_CPLT_CB_ID :
1915 hsd->Read_DMADblBuf0CpltCallback = pCallback;
1916 break;
1917 case HAL_SD_READ_DMA_DBL_BUF1_CPLT_CB_ID :
1918 hsd->Read_DMADblBuf1CpltCallback = pCallback;
1919 break;
1920 case HAL_SD_WRITE_DMA_DBL_BUF0_CPLT_CB_ID :
1921 hsd->Write_DMADblBuf0CpltCallback = pCallback;
1922 break;
1923 case HAL_SD_WRITE_DMA_DBL_BUF1_CPLT_CB_ID :
1924 hsd->Write_DMADblBuf1CpltCallback = pCallback;
1925 break;
1926 case HAL_SD_MSP_INIT_CB_ID :
1927 hsd->MspInitCallback = pCallback;
1928 break;
1929 case HAL_SD_MSP_DEINIT_CB_ID :
1930 hsd->MspDeInitCallback = pCallback;
1931 break;
1932 default :
1933
1934 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1935
1936 status = HAL_ERROR;
1937 break;
1938 }
1939 }
1940 else if (hsd->State == HAL_SD_STATE_RESET)
1941 {
1942 switch (CallbackID)
1943 {
1944 case HAL_SD_MSP_INIT_CB_ID :
1945 hsd->MspInitCallback = pCallback;
1946 break;
1947 case HAL_SD_MSP_DEINIT_CB_ID :
1948 hsd->MspDeInitCallback = pCallback;
1949 break;
1950 default :
1951
1952 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1953
1954 status = HAL_ERROR;
1955 break;
1956 }
1957 }
1958 else
1959 {
1960
1961 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1962
1963 status = HAL_ERROR;
1964 }
1965
1966 return status;
1967 }
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990 HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID)
1991 {
1992 HAL_StatusTypeDef status = HAL_OK;
1993
1994 if (hsd->State == HAL_SD_STATE_READY)
1995 {
1996 switch (CallbackID)
1997 {
1998 case HAL_SD_TX_CPLT_CB_ID :
1999 hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
2000 break;
2001 case HAL_SD_RX_CPLT_CB_ID :
2002 hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
2003 break;
2004 case HAL_SD_ERROR_CB_ID :
2005 hsd->ErrorCallback = HAL_SD_ErrorCallback;
2006 break;
2007 case HAL_SD_ABORT_CB_ID :
2008 hsd->AbortCpltCallback = HAL_SD_AbortCallback;
2009 break;
2010 case HAL_SD_READ_DMA_DBL_BUF0_CPLT_CB_ID :
2011 hsd->Read_DMADblBuf0CpltCallback = HAL_SDEx_Read_DMADoubleBuf0CpltCallback;
2012 break;
2013 case HAL_SD_READ_DMA_DBL_BUF1_CPLT_CB_ID :
2014 hsd->Read_DMADblBuf1CpltCallback = HAL_SDEx_Read_DMADoubleBuf1CpltCallback;
2015 break;
2016 case HAL_SD_WRITE_DMA_DBL_BUF0_CPLT_CB_ID :
2017 hsd->Write_DMADblBuf0CpltCallback = HAL_SDEx_Write_DMADoubleBuf0CpltCallback;
2018 break;
2019 case HAL_SD_WRITE_DMA_DBL_BUF1_CPLT_CB_ID :
2020 hsd->Write_DMADblBuf1CpltCallback = HAL_SDEx_Write_DMADoubleBuf1CpltCallback;
2021 break;
2022 case HAL_SD_MSP_INIT_CB_ID :
2023 hsd->MspInitCallback = HAL_SD_MspInit;
2024 break;
2025 case HAL_SD_MSP_DEINIT_CB_ID :
2026 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
2027 break;
2028 default :
2029
2030 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2031
2032 status = HAL_ERROR;
2033 break;
2034 }
2035 }
2036 else if (hsd->State == HAL_SD_STATE_RESET)
2037 {
2038 switch (CallbackID)
2039 {
2040 case HAL_SD_MSP_INIT_CB_ID :
2041 hsd->MspInitCallback = HAL_SD_MspInit;
2042 break;
2043 case HAL_SD_MSP_DEINIT_CB_ID :
2044 hsd->MspDeInitCallback = HAL_SD_MspDeInit;
2045 break;
2046 default :
2047
2048 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2049
2050 status = HAL_ERROR;
2051 break;
2052 }
2053 }
2054 else
2055 {
2056
2057 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2058
2059 status = HAL_ERROR;
2060 }
2061
2062 return status;
2063 }
2064
2065 #if (USE_SD_TRANSCEIVER != 0U)
2066
2067
2068
2069
2070
2071
2072
2073 HAL_StatusTypeDef HAL_SD_RegisterTransceiverCallback(SD_HandleTypeDef *hsd, pSD_TransceiverCallbackTypeDef pCallback)
2074 {
2075 HAL_StatusTypeDef status = HAL_OK;
2076
2077 if (pCallback == NULL)
2078 {
2079
2080 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2081 return HAL_ERROR;
2082 }
2083
2084
2085 __HAL_LOCK(hsd);
2086
2087 if (hsd->State == HAL_SD_STATE_READY)
2088 {
2089 hsd->DriveTransceiver_1_8V_Callback = pCallback;
2090 }
2091 else
2092 {
2093
2094 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2095
2096 status = HAL_ERROR;
2097 }
2098
2099
2100 __HAL_UNLOCK(hsd);
2101 return status;
2102 }
2103
2104
2105
2106
2107
2108
2109
2110 HAL_StatusTypeDef HAL_SD_UnRegisterTransceiverCallback(SD_HandleTypeDef *hsd)
2111 {
2112 HAL_StatusTypeDef status = HAL_OK;
2113
2114
2115 __HAL_LOCK(hsd);
2116
2117 if (hsd->State == HAL_SD_STATE_READY)
2118 {
2119 hsd->DriveTransceiver_1_8V_Callback = HAL_SD_DriveTransceiver_1_8V_Callback;
2120 }
2121 else
2122 {
2123
2124 hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
2125
2126 status = HAL_ERROR;
2127 }
2128
2129
2130 __HAL_UNLOCK(hsd);
2131 return status;
2132 }
2133 #endif
2134 #endif
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163 HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID)
2164 {
2165 pCID->ManufacturerID = (uint8_t)((hsd->CID[0] & 0xFF000000U) >> 24U);
2166
2167 pCID->OEM_AppliID = (uint16_t)((hsd->CID[0] & 0x00FFFF00U) >> 8U);
2168
2169 pCID->ProdName1 = (((hsd->CID[0] & 0x000000FFU) << 24U) | ((hsd->CID[1] & 0xFFFFFF00U) >> 8U));
2170
2171 pCID->ProdName2 = (uint8_t)(hsd->CID[1] & 0x000000FFU);
2172
2173 pCID->ProdRev = (uint8_t)((hsd->CID[2] & 0xFF000000U) >> 24U);
2174
2175 pCID->ProdSN = (((hsd->CID[2] & 0x00FFFFFFU) << 8U) | ((hsd->CID[3] & 0xFF000000U) >> 24U));
2176
2177 pCID->Reserved1 = (uint8_t)((hsd->CID[3] & 0x00F00000U) >> 20U);
2178
2179 pCID->ManufactDate = (uint16_t)((hsd->CID[3] & 0x000FFF00U) >> 8U);
2180
2181 pCID->CID_CRC = (uint8_t)((hsd->CID[3] & 0x000000FEU) >> 1U);
2182
2183 pCID->Reserved2 = 1U;
2184
2185 return HAL_OK;
2186 }
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196 HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD)
2197 {
2198 pCSD->CSDStruct = (uint8_t)((hsd->CSD[0] & 0xC0000000U) >> 30U);
2199
2200 pCSD->SysSpecVersion = (uint8_t)((hsd->CSD[0] & 0x3C000000U) >> 26U);
2201
2202 pCSD->Reserved1 = (uint8_t)((hsd->CSD[0] & 0x03000000U) >> 24U);
2203
2204 pCSD->TAAC = (uint8_t)((hsd->CSD[0] & 0x00FF0000U) >> 16U);
2205
2206 pCSD->NSAC = (uint8_t)((hsd->CSD[0] & 0x0000FF00U) >> 8U);
2207
2208 pCSD->MaxBusClkFrec = (uint8_t)(hsd->CSD[0] & 0x000000FFU);
2209
2210 pCSD->CardComdClasses = (uint16_t)((hsd->CSD[1] & 0xFFF00000U) >> 20U);
2211
2212 pCSD->RdBlockLen = (uint8_t)((hsd->CSD[1] & 0x000F0000U) >> 16U);
2213
2214 pCSD->PartBlockRead = (uint8_t)((hsd->CSD[1] & 0x00008000U) >> 15U);
2215
2216 pCSD->WrBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00004000U) >> 14U);
2217
2218 pCSD->RdBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00002000U) >> 13U);
2219
2220 pCSD->DSRImpl = (uint8_t)((hsd->CSD[1] & 0x00001000U) >> 12U);
2221
2222 pCSD->Reserved2 = 0U;
2223
2224 if (hsd->SdCard.CardType == CARD_SDSC)
2225 {
2226 pCSD->DeviceSize = (((hsd->CSD[1] & 0x000003FFU) << 2U) | ((hsd->CSD[2] & 0xC0000000U) >> 30U));
2227
2228 pCSD->MaxRdCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x38000000U) >> 27U);
2229
2230 pCSD->MaxRdCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x07000000U) >> 24U);
2231
2232 pCSD->MaxWrCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x00E00000U) >> 21U);
2233
2234 pCSD->MaxWrCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x001C0000U) >> 18U);
2235
2236 pCSD->DeviceSizeMul = (uint8_t)((hsd->CSD[2] & 0x00038000U) >> 15U);
2237
2238 hsd->SdCard.BlockNbr = (pCSD->DeviceSize + 1U) ;
2239 hsd->SdCard.BlockNbr *= (1UL << ((pCSD->DeviceSizeMul & 0x07U) + 2U));
2240 hsd->SdCard.BlockSize = (1UL << (pCSD->RdBlockLen & 0x0FU));
2241
2242 hsd->SdCard.LogBlockNbr = (hsd->SdCard.BlockNbr) * ((hsd->SdCard.BlockSize) / 512U);
2243 hsd->SdCard.LogBlockSize = 512U;
2244 }
2245 else if (hsd->SdCard.CardType == CARD_SDHC_SDXC)
2246 {
2247
2248 pCSD->DeviceSize = (((hsd->CSD[1] & 0x0000003FU) << 16U) | ((hsd->CSD[2] & 0xFFFF0000U) >> 16U));
2249
2250 hsd->SdCard.BlockNbr = ((pCSD->DeviceSize + 1U) * 1024U);
2251 hsd->SdCard.LogBlockNbr = hsd->SdCard.BlockNbr;
2252 hsd->SdCard.BlockSize = 512U;
2253 hsd->SdCard.LogBlockSize = hsd->SdCard.BlockSize;
2254 }
2255 else
2256 {
2257
2258 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2259 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2260 hsd->State = HAL_SD_STATE_READY;
2261 return HAL_ERROR;
2262 }
2263
2264 pCSD->EraseGrSize = (uint8_t)((hsd->CSD[2] & 0x00004000U) >> 14U);
2265
2266 pCSD->EraseGrMul = (uint8_t)((hsd->CSD[2] & 0x00003F80U) >> 7U);
2267
2268 pCSD->WrProtectGrSize = (uint8_t)(hsd->CSD[2] & 0x0000007FU);
2269
2270 pCSD->WrProtectGrEnable = (uint8_t)((hsd->CSD[3] & 0x80000000U) >> 31U);
2271
2272 pCSD->ManDeflECC = (uint8_t)((hsd->CSD[3] & 0x60000000U) >> 29U);
2273
2274 pCSD->WrSpeedFact = (uint8_t)((hsd->CSD[3] & 0x1C000000U) >> 26U);
2275
2276 pCSD->MaxWrBlockLen = (uint8_t)((hsd->CSD[3] & 0x03C00000U) >> 22U);
2277
2278 pCSD->WriteBlockPaPartial = (uint8_t)((hsd->CSD[3] & 0x00200000U) >> 21U);
2279
2280 pCSD->Reserved3 = 0;
2281
2282 pCSD->ContentProtectAppli = (uint8_t)((hsd->CSD[3] & 0x00010000U) >> 16U);
2283
2284 pCSD->FileFormatGroup = (uint8_t)((hsd->CSD[3] & 0x00008000U) >> 15U);
2285
2286 pCSD->CopyFlag = (uint8_t)((hsd->CSD[3] & 0x00004000U) >> 14U);
2287
2288 pCSD->PermWrProtect = (uint8_t)((hsd->CSD[3] & 0x00002000U) >> 13U);
2289
2290 pCSD->TempWrProtect = (uint8_t)((hsd->CSD[3] & 0x00001000U) >> 12U);
2291
2292 pCSD->FileFormat = (uint8_t)((hsd->CSD[3] & 0x00000C00U) >> 10U);
2293
2294 pCSD->ECC = (uint8_t)((hsd->CSD[3] & 0x00000300U) >> 8U);
2295
2296 pCSD->CSD_CRC = (uint8_t)((hsd->CSD[3] & 0x000000FEU) >> 1U);
2297
2298 pCSD->Reserved4 = 1;
2299
2300 return HAL_OK;
2301 }
2302
2303
2304
2305
2306
2307
2308
2309
2310 HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus)
2311 {
2312 uint32_t sd_status[16];
2313 uint32_t errorstate;
2314 HAL_StatusTypeDef status = HAL_OK;
2315
2316 if (hsd->State == HAL_SD_STATE_BUSY)
2317 {
2318 return HAL_ERROR;
2319 }
2320
2321 errorstate = SD_SendSDStatus(hsd, sd_status);
2322 if (errorstate != HAL_SD_ERROR_NONE)
2323 {
2324
2325 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2326 hsd->ErrorCode |= errorstate;
2327 hsd->State = HAL_SD_STATE_READY;
2328 status = HAL_ERROR;
2329 }
2330 else
2331 {
2332 pStatus->DataBusWidth = (uint8_t)((sd_status[0] & 0xC0U) >> 6U);
2333
2334 pStatus->SecuredMode = (uint8_t)((sd_status[0] & 0x20U) >> 5U);
2335
2336 pStatus->CardType = (uint16_t)(((sd_status[0] & 0x00FF0000U) >> 8U) | ((sd_status[0] & 0xFF000000U) >> 24U));
2337
2338 pStatus->ProtectedAreaSize = (((sd_status[1] & 0xFFU) << 24U) | ((sd_status[1] & 0xFF00U) << 8U) |
2339 ((sd_status[1] & 0xFF0000U) >> 8U) | ((sd_status[1] & 0xFF000000U) >> 24U));
2340
2341 pStatus->SpeedClass = (uint8_t)(sd_status[2] & 0xFFU);
2342
2343 pStatus->PerformanceMove = (uint8_t)((sd_status[2] & 0xFF00U) >> 8U);
2344
2345 pStatus->AllocationUnitSize = (uint8_t)((sd_status[2] & 0xF00000U) >> 20U);
2346
2347 pStatus->EraseSize = (uint16_t)(((sd_status[2] & 0xFF000000U) >> 16U) | (sd_status[3] & 0xFFU));
2348
2349 pStatus->EraseTimeout = (uint8_t)((sd_status[3] & 0xFC00U) >> 10U);
2350
2351 pStatus->EraseOffset = (uint8_t)((sd_status[3] & 0x0300U) >> 8U);
2352
2353 pStatus->UhsSpeedGrade = (uint8_t)((sd_status[3] & 0x00F0U) >> 4U);
2354 pStatus->UhsAllocationUnitSize = (uint8_t)(sd_status[3] & 0x000FU) ;
2355 pStatus->VideoSpeedClass = (uint8_t)((sd_status[4] & 0xFF000000U) >> 24U);
2356 }
2357
2358
2359 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2360 if (errorstate != HAL_SD_ERROR_NONE)
2361 {
2362
2363 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2364 hsd->ErrorCode = errorstate;
2365 hsd->State = HAL_SD_STATE_READY;
2366 status = HAL_ERROR;
2367 }
2368
2369
2370 return status;
2371 }
2372
2373
2374
2375
2376
2377
2378
2379
2380 HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo)
2381 {
2382 pCardInfo->CardType = (uint32_t)(hsd->SdCard.CardType);
2383 pCardInfo->CardVersion = (uint32_t)(hsd->SdCard.CardVersion);
2384 pCardInfo->Class = (uint32_t)(hsd->SdCard.Class);
2385 pCardInfo->RelCardAdd = (uint32_t)(hsd->SdCard.RelCardAdd);
2386 pCardInfo->BlockNbr = (uint32_t)(hsd->SdCard.BlockNbr);
2387 pCardInfo->BlockSize = (uint32_t)(hsd->SdCard.BlockSize);
2388 pCardInfo->LogBlockNbr = (uint32_t)(hsd->SdCard.LogBlockNbr);
2389 pCardInfo->LogBlockSize = (uint32_t)(hsd->SdCard.LogBlockSize);
2390
2391 return HAL_OK;
2392 }
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405 HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
2406 {
2407 SDMMC_InitTypeDef Init;
2408 uint32_t errorstate;
2409 uint32_t sdmmc_clk;
2410 HAL_StatusTypeDef status = HAL_OK;
2411
2412
2413 assert_param(IS_SDMMC_BUS_WIDE(WideMode));
2414
2415
2416 hsd->State = HAL_SD_STATE_BUSY;
2417
2418 if (hsd->SdCard.CardType != CARD_SECURED)
2419 {
2420 if (WideMode == SDMMC_BUS_WIDE_8B)
2421 {
2422 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2423 }
2424 else if (WideMode == SDMMC_BUS_WIDE_4B)
2425 {
2426 errorstate = SD_WideBus_Enable(hsd);
2427
2428 hsd->ErrorCode |= errorstate;
2429 }
2430 else if (WideMode == SDMMC_BUS_WIDE_1B)
2431 {
2432 errorstate = SD_WideBus_Disable(hsd);
2433
2434 hsd->ErrorCode |= errorstate;
2435 }
2436 else
2437 {
2438
2439 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2440 }
2441 }
2442 else
2443 {
2444
2445 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2446 }
2447
2448 if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
2449 {
2450
2451 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2452 status = HAL_ERROR;
2453 }
2454 else
2455 {
2456 sdmmc_clk = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC);
2457 if (sdmmc_clk != 0U)
2458 {
2459
2460 Init.ClockEdge = hsd->Init.ClockEdge;
2461 Init.ClockPowerSave = hsd->Init.ClockPowerSave;
2462 Init.BusWide = WideMode;
2463 Init.HardwareFlowControl = hsd->Init.HardwareFlowControl;
2464
2465
2466 if (hsd->Init.ClockDiv >= (sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ)))
2467 {
2468 Init.ClockDiv = hsd->Init.ClockDiv;
2469 }
2470 else if (hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
2471 {
2472
2473 Init.ClockDiv = hsd->Init.ClockDiv;
2474 }
2475 else if (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED)
2476 {
2477
2478 if (hsd->Init.ClockDiv == 0U)
2479 {
2480 if (sdmmc_clk > SD_HIGH_SPEED_FREQ)
2481 {
2482 Init.ClockDiv = sdmmc_clk / (2U * SD_HIGH_SPEED_FREQ);
2483 }
2484 else
2485 {
2486 Init.ClockDiv = hsd->Init.ClockDiv;
2487 }
2488 }
2489 else
2490 {
2491 if ((sdmmc_clk / (2U * hsd->Init.ClockDiv)) > SD_HIGH_SPEED_FREQ)
2492 {
2493 Init.ClockDiv = sdmmc_clk / (2U * SD_HIGH_SPEED_FREQ);
2494 }
2495 else
2496 {
2497 Init.ClockDiv = hsd->Init.ClockDiv;
2498 }
2499 }
2500 }
2501 else
2502 {
2503
2504 if (hsd->Init.ClockDiv == 0U)
2505 {
2506 if (sdmmc_clk > SD_NORMAL_SPEED_FREQ)
2507 {
2508 Init.ClockDiv = sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ);
2509 }
2510 else
2511 {
2512 Init.ClockDiv = hsd->Init.ClockDiv;
2513 }
2514 }
2515 else
2516 {
2517 if ((sdmmc_clk / (2U * hsd->Init.ClockDiv)) > SD_NORMAL_SPEED_FREQ)
2518 {
2519 Init.ClockDiv = sdmmc_clk / (2U * SD_NORMAL_SPEED_FREQ);
2520 }
2521 else
2522 {
2523 Init.ClockDiv = hsd->Init.ClockDiv;
2524 }
2525 }
2526 }
2527
2528 #if (USE_SD_TRANSCEIVER != 0U)
2529 Init.TranceiverPresent = hsd->Init.TranceiverPresent;
2530 #endif
2531
2532 (void)SDMMC_Init(hsd->Instance, Init);
2533 }
2534 else
2535 {
2536 hsd->ErrorCode |= SDMMC_ERROR_INVALID_PARAMETER;
2537 status = HAL_ERROR;
2538 }
2539 }
2540
2541
2542 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2543 if (errorstate != HAL_SD_ERROR_NONE)
2544 {
2545
2546 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2547 hsd->ErrorCode |= errorstate;
2548 status = HAL_ERROR;
2549 }
2550
2551
2552 hsd->State = HAL_SD_STATE_READY;
2553
2554 return status;
2555 }
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569 HAL_StatusTypeDef HAL_SD_ConfigSpeedBusOperation(SD_HandleTypeDef *hsd, uint32_t SpeedMode)
2570 {
2571 uint32_t tickstart;
2572 uint32_t errorstate;
2573 HAL_StatusTypeDef status = HAL_OK;
2574
2575
2576 assert_param(IS_SDMMC_SPEED_MODE(SpeedMode));
2577
2578 hsd->State = HAL_SD_STATE_BUSY;
2579
2580 #if (USE_SD_TRANSCEIVER != 0U)
2581 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
2582 {
2583 switch (SpeedMode)
2584 {
2585 case SDMMC_SPEED_MODE_AUTO:
2586 {
2587 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2588 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2589 {
2590 hsd->Instance->CLKCR |= SDMMC_CLKCR_BUSSPEED;
2591
2592 if (SD_UltraHighSpeed(hsd, SDMMC_SDR104_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2593 {
2594 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2595 {
2596 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2597 status = HAL_ERROR;
2598 }
2599 }
2600 }
2601 else if (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED)
2602 {
2603
2604 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2605 {
2606 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2607 status = HAL_ERROR;
2608 }
2609 }
2610 else
2611 {
2612
2613 }
2614 break;
2615 }
2616 case SDMMC_SPEED_MODE_ULTRA_SDR104:
2617 {
2618 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2619 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2620 {
2621
2622 if (SD_UltraHighSpeed(hsd, SDMMC_SDR104_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2623 {
2624 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2625 status = HAL_ERROR;
2626 }
2627 hsd->Instance->CLKCR |= SDMMC_CLKCR_BUSSPEED;
2628 }
2629 else
2630 {
2631 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2632 status = HAL_ERROR;
2633 }
2634 break;
2635 }
2636 case SDMMC_SPEED_MODE_ULTRA_SDR50:
2637 {
2638 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2639 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2640 {
2641
2642 if (SD_UltraHighSpeed(hsd, SDMMC_SDR50_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2643 {
2644 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2645 status = HAL_ERROR;
2646 }
2647 hsd->Instance->CLKCR |= SDMMC_CLKCR_BUSSPEED;
2648 }
2649 else
2650 {
2651 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2652 status = HAL_ERROR;
2653 }
2654 break;
2655 }
2656 case SDMMC_SPEED_MODE_DDR:
2657 {
2658 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2659 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2660 {
2661
2662 if (SD_DDR_Mode(hsd) != HAL_SD_ERROR_NONE)
2663 {
2664 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2665 status = HAL_ERROR;
2666 }
2667 hsd->Instance->CLKCR |= SDMMC_CLKCR_BUSSPEED | SDMMC_CLKCR_DDR;
2668 }
2669 else
2670 {
2671 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2672 status = HAL_ERROR;
2673 }
2674 break;
2675 }
2676 case SDMMC_SPEED_MODE_HIGH:
2677 {
2678 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2679 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2680 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2681 {
2682
2683 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2684 {
2685 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2686 status = HAL_ERROR;
2687 }
2688 }
2689 else
2690 {
2691 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2692 status = HAL_ERROR;
2693 }
2694 break;
2695 }
2696 case SDMMC_SPEED_MODE_DEFAULT:
2697 {
2698
2699 if (SD_SwitchSpeed(hsd, SDMMC_SDR12_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2700 {
2701 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2702 status = HAL_ERROR;
2703 }
2704
2705 break;
2706 }
2707 default:
2708 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2709 status = HAL_ERROR;
2710 break;
2711 }
2712 }
2713 else
2714 {
2715 switch (SpeedMode)
2716 {
2717 case SDMMC_SPEED_MODE_AUTO:
2718 {
2719 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2720 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2721 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2722 {
2723
2724 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2725 {
2726 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2727 status = HAL_ERROR;
2728 }
2729 }
2730 else
2731 {
2732
2733 }
2734 break;
2735 }
2736 case SDMMC_SPEED_MODE_HIGH:
2737 {
2738 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2739 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2740 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2741 {
2742
2743 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2744 {
2745 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2746 status = HAL_ERROR;
2747 }
2748 }
2749 else
2750 {
2751 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2752 status = HAL_ERROR;
2753 }
2754 break;
2755 }
2756 case SDMMC_SPEED_MODE_DEFAULT:
2757 {
2758
2759 if (SD_SwitchSpeed(hsd, SDMMC_SDR12_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2760 {
2761 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2762 status = HAL_ERROR;
2763 }
2764
2765 break;
2766 }
2767 case SDMMC_SPEED_MODE_ULTRA:
2768 default:
2769 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2770 status = HAL_ERROR;
2771 break;
2772 }
2773 }
2774 #else
2775 switch (SpeedMode)
2776 {
2777 case SDMMC_SPEED_MODE_AUTO:
2778 {
2779 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2780 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2781 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2782 {
2783
2784 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2785 {
2786 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2787 status = HAL_ERROR;
2788 }
2789 }
2790 else
2791 {
2792
2793 }
2794 break;
2795 }
2796 case SDMMC_SPEED_MODE_HIGH:
2797 {
2798 if ((hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED) ||
2799 (hsd->SdCard.CardSpeed == CARD_HIGH_SPEED) ||
2800 (hsd->SdCard.CardType == CARD_SDHC_SDXC))
2801 {
2802
2803 if (SD_SwitchSpeed(hsd, SDMMC_SDR25_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2804 {
2805 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2806 status = HAL_ERROR;
2807 }
2808 }
2809 else
2810 {
2811 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2812 status = HAL_ERROR;
2813 }
2814 break;
2815 }
2816 case SDMMC_SPEED_MODE_DEFAULT:
2817 {
2818
2819 if (SD_SwitchSpeed(hsd, SDMMC_SDR12_SWITCH_PATTERN) != HAL_SD_ERROR_NONE)
2820 {
2821 hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2822 status = HAL_ERROR;
2823 }
2824
2825 break;
2826 }
2827 case SDMMC_SPEED_MODE_ULTRA:
2828 default:
2829 hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2830 status = HAL_ERROR;
2831 break;
2832 }
2833 #endif
2834
2835
2836 tickstart = HAL_GetTick();
2837 while ((HAL_SD_GetCardState(hsd) != HAL_SD_CARD_TRANSFER))
2838 {
2839 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2840 {
2841 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2842 hsd->State = HAL_SD_STATE_READY;
2843 return HAL_TIMEOUT;
2844 }
2845 }
2846
2847
2848 errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2849 if (errorstate != HAL_SD_ERROR_NONE)
2850 {
2851
2852 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS);
2853 hsd->ErrorCode |= errorstate;
2854 status = HAL_ERROR;
2855 }
2856
2857
2858 hsd->State = HAL_SD_STATE_READY;
2859 return status;
2860 }
2861
2862
2863
2864
2865
2866
2867 HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
2868 {
2869 uint32_t cardstate;
2870 uint32_t errorstate;
2871 uint32_t resp1 = 0;
2872
2873 errorstate = SD_SendStatus(hsd, &resp1);
2874 if (errorstate != HAL_SD_ERROR_NONE)
2875 {
2876 hsd->ErrorCode |= errorstate;
2877 }
2878
2879 cardstate = ((resp1 >> 9U) & 0x0FU);
2880
2881 return (HAL_SD_CardStateTypeDef)cardstate;
2882 }
2883
2884
2885
2886
2887
2888
2889
2890 HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd)
2891 {
2892 uint32_t error_code;
2893 uint32_t tickstart;
2894
2895 if (hsd->State == HAL_SD_STATE_BUSY)
2896 {
2897
2898 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
2899 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
2900 __SDMMC_CMDTRANS_DISABLE(hsd->Instance);
2901
2902
2903
2904
2905
2906
2907 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2908 error_code = hsd->ErrorCode;
2909 if ((error_code != HAL_SD_ERROR_NONE) && (error_code != HAL_SD_ERROR_CMD_RSP_TIMEOUT))
2910 {
2911 return HAL_ERROR;
2912 }
2913
2914 tickstart = HAL_GetTick();
2915 if ((hsd->Instance->DCTRL & SDMMC_DCTRL_DTDIR) == SDMMC_TRANSFER_DIR_TO_CARD)
2916 {
2917 if (hsd->ErrorCode == HAL_SD_ERROR_NONE)
2918 {
2919 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DABORT | SDMMC_FLAG_BUSYD0END))
2920 {
2921 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2922 {
2923 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2924 hsd->State = HAL_SD_STATE_READY;
2925 return HAL_TIMEOUT;
2926 }
2927 }
2928 }
2929
2930 if (hsd->ErrorCode == HAL_SD_ERROR_CMD_RSP_TIMEOUT)
2931 {
2932 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DATAEND))
2933 {
2934 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2935 {
2936 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2937 hsd->State = HAL_SD_STATE_READY;
2938 return HAL_TIMEOUT;
2939 }
2940 }
2941 }
2942 }
2943 else if ((hsd->Instance->DCTRL & SDMMC_DCTRL_DTDIR) == SDMMC_TRANSFER_DIR_TO_SDMMC)
2944 {
2945 while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DABORT | SDMMC_FLAG_DATAEND))
2946 {
2947 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
2948 {
2949 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
2950 hsd->State = HAL_SD_STATE_READY;
2951 return HAL_TIMEOUT;
2952 }
2953 }
2954 }
2955 else
2956 {
2957
2958 }
2959
2960
2961
2962
2963
2964
2965
2966 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_BUSYD0END);
2967 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
2968
2969 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2970
2971 hsd->State = HAL_SD_STATE_READY;
2972
2973
2974 hsd->Context = SD_CONTEXT_NONE;
2975 }
2976 return HAL_OK;
2977 }
2978
2979
2980
2981
2982
2983
2984
2985
2986 HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd)
2987 {
2988 HAL_SD_CardStateTypeDef CardState;
2989
2990
2991 __HAL_SD_DISABLE_IT(hsd, SDMMC_IT_DATAEND | SDMMC_IT_DCRCFAIL | SDMMC_IT_DTIMEOUT | \
2992 SDMMC_IT_TXUNDERR | SDMMC_IT_RXOVERR);
2993
2994
2995 hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
2996
2997
2998 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
2999
3000 CardState = HAL_SD_GetCardState(hsd);
3001 hsd->State = HAL_SD_STATE_READY;
3002
3003 if ((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
3004 {
3005 hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
3006 }
3007
3008 if (hsd->ErrorCode != HAL_SD_ERROR_NONE)
3009 {
3010 return HAL_ERROR;
3011 }
3012 else
3013 {
3014 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3015 hsd->AbortCpltCallback(hsd);
3016 #else
3017 HAL_SD_AbortCallback(hsd);
3018 #endif
3019 }
3020
3021 return HAL_OK;
3022 }
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043 static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
3044 {
3045 HAL_SD_CardCSDTypeDef CSD;
3046 uint32_t errorstate;
3047 uint16_t sd_rca = 0U;
3048 uint32_t tickstart = HAL_GetTick();
3049
3050
3051 if (SDMMC_GetPowerState(hsd->Instance) == 0U)
3052 {
3053
3054 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3055 }
3056
3057 if (hsd->SdCard.CardType != CARD_SECURED)
3058 {
3059
3060 errorstate = SDMMC_CmdSendCID(hsd->Instance);
3061 if (errorstate != HAL_SD_ERROR_NONE)
3062 {
3063 return errorstate;
3064 }
3065 else
3066 {
3067
3068 hsd->CID[0U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3069 hsd->CID[1U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP2);
3070 hsd->CID[2U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP3);
3071 hsd->CID[3U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP4);
3072 }
3073 }
3074
3075 if (hsd->SdCard.CardType != CARD_SECURED)
3076 {
3077
3078
3079 while (sd_rca == 0U)
3080 {
3081 errorstate = SDMMC_CmdSetRelAdd(hsd->Instance, &sd_rca);
3082 if (errorstate != HAL_SD_ERROR_NONE)
3083 {
3084 return errorstate;
3085 }
3086 if ((HAL_GetTick() - tickstart) >= SDMMC_CMDTIMEOUT)
3087 {
3088 return HAL_SD_ERROR_TIMEOUT;
3089 }
3090 }
3091 }
3092 if (hsd->SdCard.CardType != CARD_SECURED)
3093 {
3094
3095 hsd->SdCard.RelCardAdd = sd_rca;
3096
3097
3098 errorstate = SDMMC_CmdSendCSD(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3099 if (errorstate != HAL_SD_ERROR_NONE)
3100 {
3101 return errorstate;
3102 }
3103 else
3104 {
3105
3106 hsd->CSD[0U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3107 hsd->CSD[1U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP2);
3108 hsd->CSD[2U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP3);
3109 hsd->CSD[3U] = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP4);
3110 }
3111 }
3112
3113
3114 hsd->SdCard.Class = (SDMMC_GetResponse(hsd->Instance, SDMMC_RESP2) >> 20U);
3115
3116
3117 if (HAL_SD_GetCardCSD(hsd, &CSD) != HAL_OK)
3118 {
3119 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3120 }
3121
3122
3123 errorstate = SDMMC_CmdSelDesel(hsd->Instance, (uint32_t)(((uint32_t)hsd->SdCard.RelCardAdd) << 16U));
3124 if (errorstate != HAL_SD_ERROR_NONE)
3125 {
3126 return errorstate;
3127 }
3128
3129
3130 return HAL_SD_ERROR_NONE;
3131 }
3132
3133
3134
3135
3136
3137
3138
3139
3140 static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
3141 {
3142 __IO uint32_t count = 0U;
3143 uint32_t response = 0U;
3144 uint32_t validvoltage = 0U;
3145 uint32_t errorstate;
3146 #if (USE_SD_TRANSCEIVER != 0U)
3147 uint32_t tickstart = HAL_GetTick();
3148 #endif
3149
3150
3151 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
3152 if (errorstate != HAL_SD_ERROR_NONE)
3153 {
3154 return errorstate;
3155 }
3156
3157
3158 errorstate = SDMMC_CmdOperCond(hsd->Instance);
3159 if (errorstate == SDMMC_ERROR_TIMEOUT)
3160 {
3161 hsd->SdCard.CardVersion = CARD_V1_X;
3162
3163 errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
3164 if (errorstate != HAL_SD_ERROR_NONE)
3165 {
3166 return errorstate;
3167 }
3168
3169 }
3170 else
3171 {
3172 hsd->SdCard.CardVersion = CARD_V2_X;
3173 }
3174
3175 if (hsd->SdCard.CardVersion == CARD_V2_X)
3176 {
3177
3178 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
3179 if (errorstate != HAL_SD_ERROR_NONE)
3180 {
3181 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3182 }
3183 }
3184
3185
3186 while ((count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
3187 {
3188
3189 errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
3190 if (errorstate != HAL_SD_ERROR_NONE)
3191 {
3192 return errorstate;
3193 }
3194
3195
3196 errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY |
3197 SD_SWITCH_1_8V_CAPACITY);
3198 if (errorstate != HAL_SD_ERROR_NONE)
3199 {
3200 return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
3201 }
3202
3203
3204 response = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3205
3206
3207 validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
3208
3209 count++;
3210 }
3211
3212 if (count >= SDMMC_MAX_VOLT_TRIAL)
3213 {
3214 return HAL_SD_ERROR_INVALID_VOLTRANGE;
3215 }
3216
3217
3218 hsd->SdCard.CardType = CARD_SDSC;
3219
3220 if ((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY)
3221 {
3222 hsd->SdCard.CardType = CARD_SDHC_SDXC;
3223 #if (USE_SD_TRANSCEIVER != 0U)
3224 if (hsd->Init.TranceiverPresent == SDMMC_TRANSCEIVER_PRESENT)
3225 {
3226 if ((response & SD_SWITCH_1_8V_CAPACITY) == SD_SWITCH_1_8V_CAPACITY)
3227 {
3228 hsd->SdCard.CardSpeed = CARD_ULTRA_HIGH_SPEED;
3229
3230
3231 hsd->Instance->POWER |= SDMMC_POWER_VSWITCHEN;
3232
3233
3234 errorstate = SDMMC_CmdVoltageSwitch(hsd->Instance);
3235 if (errorstate != HAL_SD_ERROR_NONE)
3236 {
3237 return errorstate;
3238 }
3239
3240
3241 while ((hsd->Instance->STA & SDMMC_FLAG_CKSTOP) != SDMMC_FLAG_CKSTOP)
3242 {
3243 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3244 {
3245 return HAL_SD_ERROR_TIMEOUT;
3246 }
3247 }
3248
3249
3250 hsd->Instance->ICR = SDMMC_FLAG_CKSTOP;
3251
3252
3253 if ((hsd->Instance->STA & SDMMC_FLAG_BUSYD0) != SDMMC_FLAG_BUSYD0)
3254 {
3255
3256 return SDMMC_ERROR_UNSUPPORTED_FEATURE;
3257 }
3258 else
3259 {
3260
3261 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3262 hsd->DriveTransceiver_1_8V_Callback(SET);
3263 #else
3264 HAL_SD_DriveTransceiver_1_8V_Callback(SET);
3265 #endif
3266
3267
3268 hsd->Instance->POWER |= SDMMC_POWER_VSWITCH;
3269
3270
3271 while ((hsd->Instance->STA & SDMMC_FLAG_VSWEND) != SDMMC_FLAG_VSWEND)
3272 {
3273 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3274 {
3275 return HAL_SD_ERROR_TIMEOUT;
3276 }
3277 }
3278
3279
3280 hsd->Instance->ICR = SDMMC_FLAG_VSWEND;
3281
3282
3283 if ((hsd->Instance->STA & SDMMC_FLAG_BUSYD0) == SDMMC_FLAG_BUSYD0)
3284 {
3285
3286 return HAL_SD_ERROR_INVALID_VOLTRANGE;
3287 }
3288
3289
3290
3291 hsd->Instance->POWER = 0x13U;
3292
3293
3294 hsd->Instance->ICR = 0xFFFFFFFFU;
3295 }
3296 }
3297 }
3298 #endif
3299 }
3300
3301 return HAL_SD_ERROR_NONE;
3302 }
3303
3304
3305
3306
3307
3308
3309 static void SD_PowerOFF(SD_HandleTypeDef *hsd)
3310 {
3311
3312 (void)SDMMC_PowerState_OFF(hsd->Instance);
3313 }
3314
3315
3316
3317
3318
3319
3320
3321
3322 static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
3323 {
3324 SDMMC_DataInitTypeDef config;
3325 uint32_t errorstate;
3326 uint32_t tickstart = HAL_GetTick();
3327 uint32_t count;
3328 uint32_t *pData = pSDstatus;
3329
3330
3331 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3332 {
3333 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3334 }
3335
3336
3337 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3338 if (errorstate != HAL_SD_ERROR_NONE)
3339 {
3340 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3341 return errorstate;
3342 }
3343
3344
3345 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3346 if (errorstate != HAL_SD_ERROR_NONE)
3347 {
3348 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3349 return errorstate;
3350 }
3351
3352
3353 config.DataTimeOut = SDMMC_DATATIMEOUT;
3354 config.DataLength = 64U;
3355 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B;
3356 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3357 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3358 config.DPSM = SDMMC_DPSM_ENABLE;
3359 (void)SDMMC_ConfigData(hsd->Instance, &config);
3360
3361
3362 errorstate = SDMMC_CmdStatusRegister(hsd->Instance);
3363 if (errorstate != HAL_SD_ERROR_NONE)
3364 {
3365 hsd->ErrorCode |= HAL_SD_ERROR_NONE;
3366 return errorstate;
3367 }
3368
3369
3370 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
3371 {
3372 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
3373 {
3374 for (count = 0U; count < 8U; count++)
3375 {
3376 *pData = SDMMC_ReadFIFO(hsd->Instance);
3377 pData++;
3378 }
3379 }
3380
3381 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3382 {
3383 return HAL_SD_ERROR_TIMEOUT;
3384 }
3385 }
3386
3387 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3388 {
3389 return HAL_SD_ERROR_DATA_TIMEOUT;
3390 }
3391 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3392 {
3393 return HAL_SD_ERROR_DATA_CRC_FAIL;
3394 }
3395 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3396 {
3397 return HAL_SD_ERROR_RX_OVERRUN;
3398 }
3399 else
3400 {
3401
3402 }
3403
3404 while ((__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DPSMACT)))
3405 {
3406 *pData = SDMMC_ReadFIFO(hsd->Instance);
3407 pData++;
3408
3409 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3410 {
3411 return HAL_SD_ERROR_TIMEOUT;
3412 }
3413 }
3414
3415
3416 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3417
3418 return HAL_SD_ERROR_NONE;
3419 }
3420
3421
3422
3423
3424
3425
3426
3427
3428 static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
3429 {
3430 uint32_t errorstate;
3431
3432 if (pCardStatus == NULL)
3433 {
3434 return HAL_SD_ERROR_PARAM;
3435 }
3436
3437
3438 errorstate = SDMMC_CmdSendStatus(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3439 if (errorstate != HAL_SD_ERROR_NONE)
3440 {
3441 return errorstate;
3442 }
3443
3444
3445 *pCardStatus = SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1);
3446
3447 return HAL_SD_ERROR_NONE;
3448 }
3449
3450
3451
3452
3453
3454
3455 static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
3456 {
3457 uint32_t scr[2U] = {0UL, 0UL};
3458 uint32_t errorstate;
3459
3460 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3461 {
3462 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3463 }
3464
3465
3466 errorstate = SD_FindSCR(hsd, scr);
3467 if (errorstate != HAL_SD_ERROR_NONE)
3468 {
3469 return errorstate;
3470 }
3471
3472
3473 if ((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO)
3474 {
3475
3476 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3477 if (errorstate != HAL_SD_ERROR_NONE)
3478 {
3479 return errorstate;
3480 }
3481
3482
3483 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U);
3484 if (errorstate != HAL_SD_ERROR_NONE)
3485 {
3486 return errorstate;
3487 }
3488
3489 return HAL_SD_ERROR_NONE;
3490 }
3491 else
3492 {
3493 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3494 }
3495 }
3496
3497
3498
3499
3500
3501
3502 static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
3503 {
3504 uint32_t scr[2U] = {0UL, 0UL};
3505 uint32_t errorstate;
3506
3507 if ((SDMMC_GetResponse(hsd->Instance, SDMMC_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
3508 {
3509 return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
3510 }
3511
3512
3513 errorstate = SD_FindSCR(hsd, scr);
3514 if (errorstate != HAL_SD_ERROR_NONE)
3515 {
3516 return errorstate;
3517 }
3518
3519
3520 if ((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO)
3521 {
3522
3523 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3524 if (errorstate != HAL_SD_ERROR_NONE)
3525 {
3526 return errorstate;
3527 }
3528
3529
3530 errorstate = SDMMC_CmdBusWidth(hsd->Instance, 0U);
3531 if (errorstate != HAL_SD_ERROR_NONE)
3532 {
3533 return errorstate;
3534 }
3535
3536 return HAL_SD_ERROR_NONE;
3537 }
3538 else
3539 {
3540 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3541 }
3542 }
3543
3544
3545
3546
3547
3548
3549
3550
3551 static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
3552 {
3553 SDMMC_DataInitTypeDef config;
3554 uint32_t errorstate;
3555 uint32_t tickstart = HAL_GetTick();
3556 uint32_t index = 0U;
3557 uint32_t tempscr[2U] = {0UL, 0UL};
3558 uint32_t *scr = pSCR;
3559
3560
3561 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 8U);
3562 if (errorstate != HAL_SD_ERROR_NONE)
3563 {
3564 return errorstate;
3565 }
3566
3567
3568 errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U));
3569 if (errorstate != HAL_SD_ERROR_NONE)
3570 {
3571 return errorstate;
3572 }
3573
3574 config.DataTimeOut = SDMMC_DATATIMEOUT;
3575 config.DataLength = 8U;
3576 config.DataBlockSize = SDMMC_DATABLOCK_SIZE_8B;
3577 config.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3578 config.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3579 config.DPSM = SDMMC_DPSM_ENABLE;
3580 (void)SDMMC_ConfigData(hsd->Instance, &config);
3581
3582
3583 errorstate = SDMMC_CmdSendSCR(hsd->Instance);
3584 if (errorstate != HAL_SD_ERROR_NONE)
3585 {
3586 return errorstate;
3587 }
3588
3589 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
3590 SDMMC_FLAG_DATAEND))
3591 {
3592 if ((!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOE)) && (index == 0U))
3593 {
3594 tempscr[0] = SDMMC_ReadFIFO(hsd->Instance);
3595 tempscr[1] = SDMMC_ReadFIFO(hsd->Instance);
3596 index++;
3597 }
3598
3599
3600 if ((HAL_GetTick() - tickstart) >= SDMMC_DATATIMEOUT)
3601 {
3602 return HAL_SD_ERROR_TIMEOUT;
3603 }
3604 }
3605
3606 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3607 {
3608 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
3609
3610 return HAL_SD_ERROR_DATA_TIMEOUT;
3611 }
3612 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3613 {
3614 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
3615
3616 return HAL_SD_ERROR_DATA_CRC_FAIL;
3617 }
3618 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3619 {
3620 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
3621
3622 return HAL_SD_ERROR_RX_OVERRUN;
3623 }
3624 else
3625 {
3626
3627
3628 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3629
3630 *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24) | ((tempscr[1] & SDMMC_8TO15BITS) << 8) | \
3631 ((tempscr[1] & SDMMC_16TO23BITS) >> 8) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24));
3632 scr++;
3633 *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24) | ((tempscr[0] & SDMMC_8TO15BITS) << 8) | \
3634 ((tempscr[0] & SDMMC_16TO23BITS) >> 8) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24));
3635
3636 }
3637
3638 return HAL_SD_ERROR_NONE;
3639 }
3640
3641
3642
3643
3644
3645
3646
3647 static void SD_Read_IT(SD_HandleTypeDef *hsd)
3648 {
3649 uint32_t count;
3650 uint32_t data;
3651 uint8_t *tmp;
3652
3653 tmp = hsd->pRxBuffPtr;
3654
3655 if (hsd->RxXferSize >= 32U)
3656 {
3657
3658 for (count = 0U; count < 8U; count++)
3659 {
3660 data = SDMMC_ReadFIFO(hsd->Instance);
3661 *tmp = (uint8_t)(data & 0xFFU);
3662 tmp++;
3663 *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3664 tmp++;
3665 *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3666 tmp++;
3667 *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3668 tmp++;
3669 }
3670
3671 hsd->pRxBuffPtr = tmp;
3672 hsd->RxXferSize -= 32U;
3673 }
3674 }
3675
3676
3677
3678
3679
3680
3681
3682 static void SD_Write_IT(SD_HandleTypeDef *hsd)
3683 {
3684 uint32_t count;
3685 uint32_t data;
3686 const uint8_t *tmp;
3687
3688 tmp = hsd->pTxBuffPtr;
3689
3690 if (hsd->TxXferSize >= 32U)
3691 {
3692
3693 for (count = 0U; count < 8U; count++)
3694 {
3695 data = (uint32_t)(*tmp);
3696 tmp++;
3697 data |= ((uint32_t)(*tmp) << 8U);
3698 tmp++;
3699 data |= ((uint32_t)(*tmp) << 16U);
3700 tmp++;
3701 data |= ((uint32_t)(*tmp) << 24U);
3702 tmp++;
3703 (void)SDMMC_WriteFIFO(hsd->Instance, &data);
3704 }
3705
3706 hsd->pTxBuffPtr = tmp;
3707 hsd->TxXferSize -= 32U;
3708 }
3709 }
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720 uint32_t SD_SwitchSpeed(SD_HandleTypeDef *hsd, uint32_t SwitchSpeedMode)
3721 {
3722 uint32_t errorstate = HAL_SD_ERROR_NONE;
3723 SDMMC_DataInitTypeDef sdmmc_datainitstructure;
3724 uint32_t SD_hs[16] = {0};
3725 uint32_t count;
3726 uint32_t loop = 0 ;
3727 uint32_t Timeout = HAL_GetTick();
3728
3729 if (hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
3730 {
3731
3732 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3733 }
3734
3735 if (hsd->SdCard.CardSpeed >= CARD_HIGH_SPEED)
3736 {
3737
3738 hsd->Instance->DCTRL = 0;
3739 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3740
3741 if (errorstate != HAL_SD_ERROR_NONE)
3742 {
3743 return errorstate;
3744 }
3745
3746
3747 sdmmc_datainitstructure.DataTimeOut = SDMMC_DATATIMEOUT;
3748 sdmmc_datainitstructure.DataLength = 64U;
3749 sdmmc_datainitstructure.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
3750 sdmmc_datainitstructure.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3751 sdmmc_datainitstructure.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3752 sdmmc_datainitstructure.DPSM = SDMMC_DPSM_ENABLE;
3753
3754 (void)SDMMC_ConfigData(hsd->Instance, &sdmmc_datainitstructure);
3755
3756
3757 errorstate = SDMMC_CmdSwitch(hsd->Instance, SwitchSpeedMode);
3758 if (errorstate != HAL_SD_ERROR_NONE)
3759 {
3760 return errorstate;
3761 }
3762
3763 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
3764 SDMMC_FLAG_DATAEND))
3765 {
3766 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
3767 {
3768 for (count = 0U; count < 8U; count++)
3769 {
3770 SD_hs[(8U * loop) + count] = SDMMC_ReadFIFO(hsd->Instance);
3771 }
3772 loop ++;
3773 }
3774
3775 if ((HAL_GetTick() - Timeout) >= SDMMC_DATATIMEOUT)
3776 {
3777 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
3778 hsd->State = HAL_SD_STATE_READY;
3779 return HAL_SD_ERROR_TIMEOUT;
3780 }
3781 }
3782
3783 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3784 {
3785 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
3786
3787 return errorstate;
3788 }
3789 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3790 {
3791 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
3792
3793 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
3794
3795 return errorstate;
3796 }
3797 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3798 {
3799 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
3800
3801 errorstate = SDMMC_ERROR_RX_OVERRUN;
3802
3803 return errorstate;
3804 }
3805 else
3806 {
3807
3808 }
3809
3810
3811 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3812
3813
3814 if ((((uint8_t *)SD_hs)[13] & 2U) != 2U)
3815 {
3816 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3817 }
3818
3819 }
3820
3821 return errorstate;
3822 }
3823
3824 #if (USE_SD_TRANSCEIVER != 0U)
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834 static uint32_t SD_UltraHighSpeed(SD_HandleTypeDef *hsd, uint32_t UltraHighSpeedMode)
3835 {
3836 uint32_t errorstate = HAL_SD_ERROR_NONE;
3837 SDMMC_DataInitTypeDef sdmmc_datainitstructure;
3838 uint32_t SD_hs[16] = {0};
3839 uint32_t count;
3840 uint32_t loop = 0 ;
3841 uint32_t Timeout = HAL_GetTick();
3842
3843 if (hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
3844 {
3845
3846 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3847 }
3848
3849 if (hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
3850 {
3851
3852 hsd->Instance->DCTRL = 0;
3853 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3854
3855 if (errorstate != HAL_SD_ERROR_NONE)
3856 {
3857 return errorstate;
3858 }
3859
3860
3861 sdmmc_datainitstructure.DataTimeOut = SDMMC_DATATIMEOUT;
3862 sdmmc_datainitstructure.DataLength = 64U;
3863 sdmmc_datainitstructure.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
3864 sdmmc_datainitstructure.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3865 sdmmc_datainitstructure.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3866 sdmmc_datainitstructure.DPSM = SDMMC_DPSM_ENABLE;
3867
3868 if (SDMMC_ConfigData(hsd->Instance, &sdmmc_datainitstructure) != HAL_OK)
3869 {
3870 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
3871 }
3872
3873 errorstate = SDMMC_CmdSwitch(hsd->Instance, UltraHighSpeedMode);
3874 if (errorstate != HAL_SD_ERROR_NONE)
3875 {
3876 return errorstate;
3877 }
3878
3879 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
3880 SDMMC_FLAG_DATAEND))
3881 {
3882 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
3883 {
3884 for (count = 0U; count < 8U; count++)
3885 {
3886 SD_hs[(8U * loop) + count] = SDMMC_ReadFIFO(hsd->Instance);
3887 }
3888 loop ++;
3889 }
3890
3891 if ((HAL_GetTick() - Timeout) >= SDMMC_DATATIMEOUT)
3892 {
3893 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
3894 hsd->State = HAL_SD_STATE_READY;
3895 return HAL_SD_ERROR_TIMEOUT;
3896 }
3897 }
3898
3899 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
3900 {
3901 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
3902
3903 return errorstate;
3904 }
3905 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
3906 {
3907 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
3908
3909 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
3910
3911 return errorstate;
3912 }
3913 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
3914 {
3915 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
3916
3917 errorstate = SDMMC_ERROR_RX_OVERRUN;
3918
3919 return errorstate;
3920 }
3921 else
3922 {
3923
3924 }
3925
3926
3927 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
3928
3929
3930 if ((((uint8_t *)SD_hs)[13] & 2U) != 2U)
3931 {
3932 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
3933 }
3934 else
3935 {
3936 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
3937 hsd->DriveTransceiver_1_8V_Callback(SET);
3938 #else
3939 HAL_SD_DriveTransceiver_1_8V_Callback(SET);
3940 #endif
3941 #if defined (DLYB_SDMMC1) || defined (DLYB_SDMMC2)
3942
3943
3944 MODIFY_REG(hsd->Instance->CLKCR, SDMMC_CLKCR_SELCLKRX, SDMMC_CLKCR_SELCLKRX_1);
3945 if (DelayBlock_Enable(SD_GET_DLYB_INSTANCE(hsd->Instance)) != HAL_OK)
3946 {
3947 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
3948 }
3949 #endif
3950 }
3951 }
3952
3953 return errorstate;
3954 }
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964 static uint32_t SD_DDR_Mode(SD_HandleTypeDef *hsd)
3965 {
3966 uint32_t errorstate = HAL_SD_ERROR_NONE;
3967 SDMMC_DataInitTypeDef sdmmc_datainitstructure;
3968 uint32_t SD_hs[16] = {0};
3969 uint32_t count;
3970 uint32_t loop = 0 ;
3971 uint32_t Timeout = HAL_GetTick();
3972
3973 if (hsd->SdCard.CardSpeed == CARD_NORMAL_SPEED)
3974 {
3975
3976 return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3977 }
3978
3979 if (hsd->SdCard.CardSpeed == CARD_ULTRA_HIGH_SPEED)
3980 {
3981
3982 hsd->Instance->DCTRL = 0;
3983 errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
3984
3985 if (errorstate != HAL_SD_ERROR_NONE)
3986 {
3987 return errorstate;
3988 }
3989
3990
3991 sdmmc_datainitstructure.DataTimeOut = SDMMC_DATATIMEOUT;
3992 sdmmc_datainitstructure.DataLength = 64U;
3993 sdmmc_datainitstructure.DataBlockSize = SDMMC_DATABLOCK_SIZE_64B ;
3994 sdmmc_datainitstructure.TransferDir = SDMMC_TRANSFER_DIR_TO_SDMMC;
3995 sdmmc_datainitstructure.TransferMode = SDMMC_TRANSFER_MODE_BLOCK;
3996 sdmmc_datainitstructure.DPSM = SDMMC_DPSM_ENABLE;
3997
3998 if (SDMMC_ConfigData(hsd->Instance, &sdmmc_datainitstructure) != HAL_OK)
3999 {
4000 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
4001 }
4002
4003 errorstate = SDMMC_CmdSwitch(hsd->Instance, SDMMC_DDR50_SWITCH_PATTERN);
4004 if (errorstate != HAL_SD_ERROR_NONE)
4005 {
4006 return errorstate;
4007 }
4008
4009 while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND |
4010 SDMMC_FLAG_DATAEND))
4011 {
4012 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
4013 {
4014 for (count = 0U; count < 8U; count++)
4015 {
4016 SD_hs[(8U * loop) + count] = SDMMC_ReadFIFO(hsd->Instance);
4017 }
4018 loop ++;
4019 }
4020
4021 if ((HAL_GetTick() - Timeout) >= SDMMC_DATATIMEOUT)
4022 {
4023 hsd->ErrorCode = HAL_SD_ERROR_TIMEOUT;
4024 hsd->State = HAL_SD_STATE_READY;
4025 return HAL_SD_ERROR_TIMEOUT;
4026 }
4027 }
4028
4029 if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DTIMEOUT))
4030 {
4031 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DTIMEOUT);
4032
4033 return errorstate;
4034 }
4035 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_DCRCFAIL))
4036 {
4037 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_DCRCFAIL);
4038
4039 errorstate = SDMMC_ERROR_DATA_CRC_FAIL;
4040
4041 return errorstate;
4042 }
4043 else if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR))
4044 {
4045 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_FLAG_RXOVERR);
4046
4047 errorstate = SDMMC_ERROR_RX_OVERRUN;
4048
4049 return errorstate;
4050 }
4051 else
4052 {
4053
4054 }
4055
4056
4057 __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_DATA_FLAGS);
4058
4059
4060 if ((((uint8_t *)SD_hs)[13] & 2U) != 2U)
4061 {
4062 errorstate = SDMMC_ERROR_UNSUPPORTED_FEATURE;
4063 }
4064 else
4065 {
4066 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
4067 hsd->DriveTransceiver_1_8V_Callback(SET);
4068 #else
4069 HAL_SD_DriveTransceiver_1_8V_Callback(SET);
4070 #endif
4071 #if defined (DLYB_SDMMC1) || defined (DLYB_SDMMC2)
4072
4073
4074 MODIFY_REG(hsd->Instance->CLKCR, SDMMC_CLKCR_SELCLKRX, SDMMC_CLKCR_SELCLKRX_0);
4075 if (DelayBlock_Enable(SD_GET_DLYB_INSTANCE(hsd->Instance)) != HAL_OK)
4076 {
4077 return (HAL_SD_ERROR_GENERAL_UNKNOWN_ERR);
4078 }
4079 #endif
4080 }
4081 }
4082
4083 return errorstate;
4084 }
4085
4086 #endif
4087
4088
4089
4090
4091
4092
4093 __weak void HAL_SDEx_Read_DMADoubleBuf0CpltCallback(SD_HandleTypeDef *hsd)
4094 {
4095
4096 UNUSED(hsd);
4097
4098
4099
4100
4101 }
4102
4103
4104
4105
4106
4107
4108 __weak void HAL_SDEx_Read_DMADoubleBuf1CpltCallback(SD_HandleTypeDef *hsd)
4109 {
4110
4111 UNUSED(hsd);
4112
4113
4114
4115
4116 }
4117
4118
4119
4120
4121
4122
4123 __weak void HAL_SDEx_Write_DMADoubleBuf0CpltCallback(SD_HandleTypeDef *hsd)
4124 {
4125
4126 UNUSED(hsd);
4127
4128
4129
4130
4131 }
4132
4133
4134
4135
4136
4137
4138 __weak void HAL_SDEx_Write_DMADoubleBuf1CpltCallback(SD_HandleTypeDef *hsd)
4139 {
4140
4141 UNUSED(hsd);
4142
4143
4144
4145
4146 }
4147
4148
4149
4150
4151
4152
4153 #endif
4154
4155
4156
4157
4158
4159
4160
4161