1 /** 2 ****************************************************************************** 3 * @file stm32mp1xx_hal_sd.h 4 * @author MCD Application Team 5 * @brief Header file of SD HAL module. 6 ****************************************************************************** 7 * @attention 8 * 9 * Copyright (c) 2019 STMicroelectronics. 10 * All rights reserved. 11 * 12 * This software is licensed under terms that can be found in the LICENSE file 13 * in the root directory of this software component. 14 * If no LICENSE file comes with this software, it is provided AS-IS. 15 * 16 ****************************************************************************** 17 */ 18 19 /* Define to prevent recursive inclusion -------------------------------------*/ 20 #ifndef STM32MP1xx_HAL_SD_H 21 #define STM32MP1xx_HAL_SD_H 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 /* Includes ------------------------------------------------------------------*/ 28 #include "stm32mp1xx_ll_sdmmc.h" 29 #if defined (DLYB_SDMMC1) || defined (DLYB_SDMMC2) || defined (DLYB_SDMMC3) 30 #include "stm32mp1xx_ll_delayblock.h" 31 #endif /* (DLYB_SDMMC1) || (DLYB_SDMMC2) */ 32 33 /** @addtogroup STM32MP1xx_HAL_Driver 34 * @{ 35 */ 36 37 /** @defgroup SD SD 38 * @brief SD HAL module driver 39 * @{ 40 */ 41 42 /* Exported types ------------------------------------------------------------*/ 43 /** @defgroup SD_Exported_Types SD Exported Types 44 * @{ 45 */ 46 47 /** @defgroup SD_Exported_Types_Group1 SD State enumeration structure 48 * @{ 49 */ 50 typedef enum 51 { 52 HAL_SD_STATE_RESET = ((uint32_t)0x00000000U), /*!< SD not yet initialized or disabled */ 53 HAL_SD_STATE_READY = ((uint32_t)0x00000001U), /*!< SD initialized and ready for use */ 54 HAL_SD_STATE_TIMEOUT = ((uint32_t)0x00000002U), /*!< SD Timeout state */ 55 HAL_SD_STATE_BUSY = ((uint32_t)0x00000003U), /*!< SD process ongoing */ 56 HAL_SD_STATE_PROGRAMMING = ((uint32_t)0x00000004U), /*!< SD Programming State */ 57 HAL_SD_STATE_RECEIVING = ((uint32_t)0x00000005U), /*!< SD Receiving State */ 58 HAL_SD_STATE_TRANSFER = ((uint32_t)0x00000006U), /*!< SD Transfert State */ 59 HAL_SD_STATE_ERROR = ((uint32_t)0x0000000FU) /*!< SD is in error state */ 60 }HAL_SD_StateTypeDef; 61 /** 62 * @} 63 */ 64 65 /** @defgroup SD_Exported_Types_Group2 SD Card State enumeration structure 66 * @{ 67 */ 68 typedef enum 69 { 70 HAL_SD_CARD_READY = ((uint32_t)0x00000001U), /*!< Card state is ready */ 71 HAL_SD_CARD_IDENTIFICATION = ((uint32_t)0x00000002U), /*!< Card is in identification state */ 72 HAL_SD_CARD_STANDBY = ((uint32_t)0x00000003U), /*!< Card is in standby state */ 73 HAL_SD_CARD_TRANSFER = ((uint32_t)0x00000004U), /*!< Card is in transfer state */ 74 HAL_SD_CARD_SENDING = ((uint32_t)0x00000005U), /*!< Card is sending an operation */ 75 HAL_SD_CARD_RECEIVING = ((uint32_t)0x00000006U), /*!< Card is receiving operation information */ 76 HAL_SD_CARD_PROGRAMMING = ((uint32_t)0x00000007U), /*!< Card is in programming state */ 77 HAL_SD_CARD_DISCONNECTED = ((uint32_t)0x00000008U), /*!< Card is disconnected */ 78 HAL_SD_CARD_ERROR = ((uint32_t)0x000000FFU) /*!< Card response Error */ 79 }HAL_SD_CardStateTypedef; 80 /** 81 * @} 82 */ 83 84 /** @defgroup SD_Exported_Types_Group3 SD Handle Structure definition 85 * @{ 86 */ 87 #define SD_InitTypeDef SDMMC_InitTypeDef 88 #define SD_TypeDef SDMMC_TypeDef 89 90 /** 91 * @brief SD Card Information Structure definition 92 */ 93 typedef struct 94 { 95 uint32_t CardType; /*!< Specifies the card Type */ 96 97 uint32_t CardVersion; /*!< Specifies the card version */ 98 99 uint32_t Class; /*!< Specifies the class of the card class */ 100 101 uint32_t RelCardAdd; /*!< Specifies the Relative Card Address */ 102 103 uint32_t BlockNbr; /*!< Specifies the Card Capacity in blocks */ 104 105 uint32_t BlockSize; /*!< Specifies one block size in bytes */ 106 107 uint32_t LogBlockNbr; /*!< Specifies the Card logical Capacity in blocks */ 108 109 uint32_t LogBlockSize; /*!< Specifies logical block size in bytes */ 110 111 uint32_t CardSpeed; /*!< Specifies the card Speed */ 112 113 }HAL_SD_CardInfoTypeDef; 114 115 /** 116 * @brief SD handle Structure definition 117 */ 118 typedef struct __SD_HandleTypeDef 119 { 120 SD_TypeDef *Instance; /*!< SD registers base address */ 121 122 SD_InitTypeDef Init; /*!< SD required parameters */ 123 124 HAL_LockTypeDef Lock; /*!< SD locking object */ 125 126 uint8_t *pTxBuffPtr; /*!< Pointer to SD Tx transfer Buffer */ 127 128 uint32_t TxXferSize; /*!< SD Tx Transfer size */ 129 130 uint8_t *pRxBuffPtr; /*!< Pointer to SD Rx transfer Buffer */ 131 132 uint32_t RxXferSize; /*!< SD Rx Transfer size */ 133 134 __IO uint32_t Context; /*!< SD transfer context */ 135 136 __IO HAL_SD_StateTypeDef State; /*!< SD card State */ 137 138 __IO uint32_t ErrorCode; /*!< SD Card Error codes */ 139 140 HAL_SD_CardInfoTypeDef SdCard; /*!< SD Card information */ 141 142 uint32_t CSD[4]; /*!< SD card specific data table */ 143 144 uint32_t CID[4]; /*!< SD card identification number table */ 145 146 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 147 void (* TxCpltCallback) (struct __SD_HandleTypeDef *hsd); 148 void (* RxCpltCallback) (struct __SD_HandleTypeDef *hsd); 149 void (* ErrorCallback) (struct __SD_HandleTypeDef *hsd); 150 void (* AbortCpltCallback) (struct __SD_HandleTypeDef *hsd); 151 void (* Read_DMADblBuf0CpltCallback) (struct __SD_HandleTypeDef *hsd); 152 void (* Read_DMADblBuf1CpltCallback) (struct __SD_HandleTypeDef *hsd); 153 void (* Write_DMADblBuf0CpltCallback) (struct __SD_HandleTypeDef *hsd); 154 void (* Write_DMADblBuf1CpltCallback) (struct __SD_HandleTypeDef *hsd); 155 156 #if (USE_SD_TRANSCEIVER != 0U) 157 void (* DriveTransceiver_1_8V_Callback) (FlagStatus status); 158 #endif 159 160 void (* MspInitCallback) (struct __SD_HandleTypeDef *hsd); 161 void (* MspDeInitCallback) (struct __SD_HandleTypeDef *hsd); 162 #endif 163 }SD_HandleTypeDef; 164 165 /** 166 * @} 167 */ 168 169 /** @defgroup SD_Exported_Types_Group4 Card Specific Data: CSD Register 170 * @{ 171 */ 172 typedef struct 173 { 174 __IO uint8_t CSDStruct; /*!< CSD structure */ 175 __IO uint8_t SysSpecVersion; /*!< System specification version */ 176 __IO uint8_t Reserved1; /*!< Reserved */ 177 __IO uint8_t TAAC; /*!< Data read access time 1 */ 178 __IO uint8_t NSAC; /*!< Data read access time 2 in CLK cycles */ 179 __IO uint8_t MaxBusClkFrec; /*!< Max. bus clock frequency */ 180 __IO uint16_t CardComdClasses; /*!< Card command classes */ 181 __IO uint8_t RdBlockLen; /*!< Max. read data block length */ 182 __IO uint8_t PartBlockRead; /*!< Partial blocks for read allowed */ 183 __IO uint8_t WrBlockMisalign; /*!< Write block misalignment */ 184 __IO uint8_t RdBlockMisalign; /*!< Read block misalignment */ 185 __IO uint8_t DSRImpl; /*!< DSR implemented */ 186 __IO uint8_t Reserved2; /*!< Reserved */ 187 __IO uint32_t DeviceSize; /*!< Device Size */ 188 __IO uint8_t MaxRdCurrentVDDMin; /*!< Max. read current @ VDD min */ 189 __IO uint8_t MaxRdCurrentVDDMax; /*!< Max. read current @ VDD max */ 190 __IO uint8_t MaxWrCurrentVDDMin; /*!< Max. write current @ VDD min */ 191 __IO uint8_t MaxWrCurrentVDDMax; /*!< Max. write current @ VDD max */ 192 __IO uint8_t DeviceSizeMul; /*!< Device size multiplier */ 193 __IO uint8_t EraseGrSize; /*!< Erase group size */ 194 __IO uint8_t EraseGrMul; /*!< Erase group size multiplier */ 195 __IO uint8_t WrProtectGrSize; /*!< Write protect group size */ 196 __IO uint8_t WrProtectGrEnable; /*!< Write protect group enable */ 197 __IO uint8_t ManDeflECC; /*!< Manufacturer default ECC */ 198 __IO uint8_t WrSpeedFact; /*!< Write speed factor */ 199 __IO uint8_t MaxWrBlockLen; /*!< Max. write data block length */ 200 __IO uint8_t WriteBlockPaPartial; /*!< Partial blocks for write allowed */ 201 __IO uint8_t Reserved3; /*!< Reserved */ 202 __IO uint8_t ContentProtectAppli; /*!< Content protection application */ 203 __IO uint8_t FileFormatGroup; /*!< File format group */ 204 __IO uint8_t CopyFlag; /*!< Copy flag (OTP) */ 205 __IO uint8_t PermWrProtect; /*!< Permanent write protection */ 206 __IO uint8_t TempWrProtect; /*!< Temporary write protection */ 207 __IO uint8_t FileFormat; /*!< File format */ 208 __IO uint8_t ECC; /*!< ECC code */ 209 __IO uint8_t CSD_CRC; /*!< CSD CRC */ 210 __IO uint8_t Reserved4; /*!< Always 1 */ 211 }HAL_SD_CardCSDTypedef; 212 /** 213 * @} 214 */ 215 216 /** @defgroup SD_Exported_Types_Group5 Card Identification Data: CID Register 217 * @{ 218 */ 219 typedef struct 220 { 221 __IO uint8_t ManufacturerID; /*!< Manufacturer ID */ 222 __IO uint16_t OEM_AppliID; /*!< OEM/Application ID */ 223 __IO uint32_t ProdName1; /*!< Product Name part1 */ 224 __IO uint8_t ProdName2; /*!< Product Name part2 */ 225 __IO uint8_t ProdRev; /*!< Product Revision */ 226 __IO uint32_t ProdSN; /*!< Product Serial Number */ 227 __IO uint8_t Reserved1; /*!< Reserved1 */ 228 __IO uint16_t ManufactDate; /*!< Manufacturing Date */ 229 __IO uint8_t CID_CRC; /*!< CID CRC */ 230 __IO uint8_t Reserved2; /*!< Always 1 */ 231 232 }HAL_SD_CardCIDTypedef; 233 /** 234 * @} 235 */ 236 237 /** @defgroup SD_Exported_Types_Group6 SD Card Status returned by ACMD13 238 * @{ 239 */ 240 typedef struct 241 { 242 __IO uint8_t DataBusWidth; /*!< Shows the currently defined data bus width */ 243 __IO uint8_t SecuredMode; /*!< Card is in secured mode of operation */ 244 __IO uint16_t CardType; /*!< Carries information about card type */ 245 __IO uint32_t ProtectedAreaSize; /*!< Carries information about the capacity of protected area */ 246 __IO uint8_t SpeedClass; /*!< Carries information about the speed class of the card */ 247 __IO uint8_t PerformanceMove; /*!< Carries information about the card's performance move */ 248 __IO uint8_t AllocationUnitSize; /*!< Carries information about the card's allocation unit size */ 249 __IO uint16_t EraseSize; /*!< Determines the number of AUs to be erased in one operation */ 250 __IO uint8_t EraseTimeout; /*!< Determines the timeout for any number of AU erase */ 251 __IO uint8_t EraseOffset; /*!< Carries information about the erase offset */ 252 __IO uint8_t UhsSpeedGrade; /*!< Carries information about the speed grade of UHS card */ 253 __IO uint8_t UhsAllocationUnitSize; /*!< Carries information about the UHS card's allocation unit size */ 254 __IO uint8_t VideoSpeedClass; /*!< Carries information about the Video Speed Class of UHS card */ 255 }HAL_SD_CardStatusTypedef; 256 /** 257 * @} 258 */ 259 260 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 261 /** @defgroup SD_Exported_Types_Group7 SD Callback ID enumeration definition 262 * @{ 263 */ 264 typedef enum 265 { 266 HAL_SD_TX_CPLT_CB_ID = 0x00U, /*!< SD Tx Complete Callback ID */ 267 HAL_SD_RX_CPLT_CB_ID = 0x01U, /*!< SD Rx Complete Callback ID */ 268 HAL_SD_ERROR_CB_ID = 0x02U, /*!< SD Error Callback ID */ 269 HAL_SD_ABORT_CB_ID = 0x03U, /*!< SD Abort Callback ID */ 270 HAL_SD_READ_DMA_DBL_BUF0_CPLT_CB_ID = 0x04U, /*!< SD Rx DMA Double Buffer 0 Complete Callback ID */ 271 HAL_SD_READ_DMA_DBL_BUF1_CPLT_CB_ID = 0x05U, /*!< SD Rx DMA Double Buffer 1 Complete Callback ID */ 272 HAL_SD_WRITE_DMA_DBL_BUF0_CPLT_CB_ID = 0x06U, /*!< SD Tx DMA Double Buffer 0 Complete Callback ID */ 273 HAL_SD_WRITE_DMA_DBL_BUF1_CPLT_CB_ID = 0x07U, /*!< SD Tx DMA Double Buffer 1 Complete Callback ID */ 274 275 HAL_SD_MSP_INIT_CB_ID = 0x10U, /*!< SD MspInit Callback ID */ 276 HAL_SD_MSP_DEINIT_CB_ID = 0x11U /*!< SD MspDeInit Callback ID */ 277 }HAL_SD_CallbackIDTypeDef; 278 /** 279 * @} 280 */ 281 282 /** @defgroup SD_Exported_Types_Group8 SD Callback pointer definition 283 * @{ 284 */ 285 typedef void (*pSD_CallbackTypeDef) (SD_HandleTypeDef *hsd); 286 #if (USE_SD_TRANSCEIVER != 0U) 287 typedef void (*pSD_TransceiverCallbackTypeDef)(FlagStatus status); 288 #endif 289 /** 290 * @} 291 */ 292 #endif 293 /** 294 * @} 295 */ 296 297 /* Exported constants --------------------------------------------------------*/ 298 /** @defgroup SD_Exported_Constants Exported Constants 299 * @{ 300 */ 301 302 #define BLOCKSIZE ((uint32_t)512U) /*!< Block size is 512 bytes */ 303 304 /** @defgroup SD_Exported_Constansts_Group1 SD Error status enumeration Structure definition 305 * @{ 306 */ 307 #define HAL_SD_ERROR_NONE SDMMC_ERROR_NONE /*!< No error */ 308 #define HAL_SD_ERROR_CMD_CRC_FAIL SDMMC_ERROR_CMD_CRC_FAIL /*!< Command response received (but CRC check failed) */ 309 #define HAL_SD_ERROR_DATA_CRC_FAIL SDMMC_ERROR_DATA_CRC_FAIL /*!< Data block sent/received (CRC check failed) */ 310 #define HAL_SD_ERROR_CMD_RSP_TIMEOUT SDMMC_ERROR_CMD_RSP_TIMEOUT /*!< Command response timeout */ 311 #define HAL_SD_ERROR_DATA_TIMEOUT SDMMC_ERROR_DATA_TIMEOUT /*!< Data timeout */ 312 #define HAL_SD_ERROR_TX_UNDERRUN SDMMC_ERROR_TX_UNDERRUN /*!< Transmit FIFO underrun */ 313 #define HAL_SD_ERROR_RX_OVERRUN SDMMC_ERROR_RX_OVERRUN /*!< Receive FIFO overrun */ 314 #define HAL_SD_ERROR_ADDR_MISALIGNED SDMMC_ERROR_ADDR_MISALIGNED /*!< Misaligned address */ 315 #define HAL_SD_ERROR_BLOCK_LEN_ERR SDMMC_ERROR_BLOCK_LEN_ERR /*!< Transferred block length is not allowed for the card or the 316 number of transferred bytes does not match the block length */ 317 #define HAL_SD_ERROR_ERASE_SEQ_ERR SDMMC_ERROR_ERASE_SEQ_ERR /*!< An error in the sequence of erase command occurs */ 318 #define HAL_SD_ERROR_BAD_ERASE_PARAM SDMMC_ERROR_BAD_ERASE_PARAM /*!< An invalid selection for erase groups */ 319 #define HAL_SD_ERROR_WRITE_PROT_VIOLATION SDMMC_ERROR_WRITE_PROT_VIOLATION /*!< Attempt to program a write protect block */ 320 #define HAL_SD_ERROR_LOCK_UNLOCK_FAILED SDMMC_ERROR_LOCK_UNLOCK_FAILED /*!< Sequence or password error has been detected in unlock 321 command or if there was an attempt to access a locked card */ 322 #define HAL_SD_ERROR_COM_CRC_FAILED SDMMC_ERROR_COM_CRC_FAILED /*!< CRC check of the previous command failed */ 323 #define HAL_SD_ERROR_ILLEGAL_CMD SDMMC_ERROR_ILLEGAL_CMD /*!< Command is not legal for the card state */ 324 #define HAL_SD_ERROR_CARD_ECC_FAILED SDMMC_ERROR_CARD_ECC_FAILED /*!< Card internal ECC was applied but failed to correct the data */ 325 #define HAL_SD_ERROR_CC_ERR SDMMC_ERROR_CC_ERR /*!< Internal card controller error */ 326 #define HAL_SD_ERROR_GENERAL_UNKNOWN_ERR SDMMC_ERROR_GENERAL_UNKNOWN_ERR /*!< General or unknown error */ 327 #define HAL_SD_ERROR_STREAM_READ_UNDERRUN SDMMC_ERROR_STREAM_READ_UNDERRUN /*!< The card could not sustain data reading in stream rmode */ 328 #define HAL_SD_ERROR_STREAM_WRITE_OVERRUN SDMMC_ERROR_STREAM_WRITE_OVERRUN /*!< The card could not sustain data programming in stream mode */ 329 #define HAL_SD_ERROR_CID_CSD_OVERWRITE SDMMC_ERROR_CID_CSD_OVERWRITE /*!< CID/CSD overwrite error */ 330 #define HAL_SD_ERROR_WP_ERASE_SKIP SDMMC_ERROR_WP_ERASE_SKIP /*!< Only partial address space was erased */ 331 #define HAL_SD_ERROR_CARD_ECC_DISABLED SDMMC_ERROR_CARD_ECC_DISABLED /*!< Command has been executed without using internal ECC */ 332 #define HAL_SD_ERROR_ERASE_RESET SDMMC_ERROR_ERASE_RESET /*!< Erase sequence was cleared before executing because an out 333 of erase sequence command was received */ 334 #define HAL_SD_ERROR_AKE_SEQ_ERR SDMMC_ERROR_AKE_SEQ_ERR /*!< Error in sequence of authentication */ 335 #define HAL_SD_ERROR_INVALID_VOLTRANGE SDMMC_ERROR_INVALID_VOLTRANGE /*!< Error in case of invalid voltage range */ 336 #define HAL_SD_ERROR_ADDR_OUT_OF_RANGE SDMMC_ERROR_ADDR_OUT_OF_RANGE /*!< Error when addressed block is out of range */ 337 #define HAL_SD_ERROR_REQUEST_NOT_APPLICABLE SDMMC_ERROR_REQUEST_NOT_APPLICABLE /*!< Error when command request is not applicable */ 338 #define HAL_SD_ERROR_PARAM SDMMC_ERROR_INVALID_PARAMETER /*!< the used parameter is not valid */ 339 #define HAL_SD_ERROR_UNSUPPORTED_FEATURE SDMMC_ERROR_UNSUPPORTED_FEATURE /*!< Error when feature is not insupported */ 340 #define HAL_SD_ERROR_BUSY SDMMC_ERROR_BUSY /*!< Error when transfer process is busy */ 341 #define HAL_SD_ERROR_DMA SDMMC_ERROR_DMA /*!< Error while DMA transfer */ 342 #define HAL_SD_ERROR_TIMEOUT SDMMC_ERROR_TIMEOUT /*!< Timeout error */ 343 344 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 345 #define HAL_SD_ERROR_INVALID_CALLBACK SDMMC_ERROR_INVALID_PARAMETER /*!< Invalid callback error */ 346 #endif 347 348 /** 349 * @} 350 */ 351 352 /** @defgroup SD_Exported_Constansts_Group2 SD context enumeration 353 * @{ 354 */ 355 #define SD_CONTEXT_NONE ((uint32_t)0x00000000U) /*!< None */ 356 #define SD_CONTEXT_READ_SINGLE_BLOCK ((uint32_t)0x00000001U) /*!< Read single block operation */ 357 #define SD_CONTEXT_READ_MULTIPLE_BLOCK ((uint32_t)0x00000002U) /*!< Read multiple blocks operation */ 358 #define SD_CONTEXT_WRITE_SINGLE_BLOCK ((uint32_t)0x00000010U) /*!< Write single block operation */ 359 #define SD_CONTEXT_WRITE_MULTIPLE_BLOCK ((uint32_t)0x00000020U) /*!< Write multiple blocks operation */ 360 #define SD_CONTEXT_IT ((uint32_t)0x00000008U) /*!< Process in Interrupt mode */ 361 #define SD_CONTEXT_DMA ((uint32_t)0x00000080U) /*!< Process in DMA mode */ 362 363 /** 364 * @} 365 */ 366 367 /** @defgroup SD_Exported_Constansts_Group3 SD Supported Memory Cards 368 * @{ 369 */ 370 #define CARD_NORMAL_SPEED ((uint32_t)0x00000000U) /*!< Normal Speed Card <12.5Mo/s , Spec Version 1.01 */ 371 #define CARD_HIGH_SPEED ((uint32_t)0x00000100U) /*!< High Speed Card <25Mo/s , Spec version 2.00 */ 372 #define CARD_ULTRA_HIGH_SPEED ((uint32_t)0x00000200U) /*!< UHS-I SD Card <50Mo/s for SDR50, DDR5 Cards 373 and <104Mo/s for SDR104, Spec version 3.01 */ 374 375 #define CARD_SDSC ((uint32_t)0x00000000U) /*!< SD Standard Capacity <2Go */ 376 #define CARD_SDHC_SDXC ((uint32_t)0x00000001U) /*!< SD High Capacity <32Go, SD Extended Capacity <2To */ 377 #define CARD_SECURED ((uint32_t)0x00000003U) 378 379 /** 380 * @} 381 */ 382 383 /** @defgroup SD_Exported_Constansts_Group4 SD Supported Version 384 * @{ 385 */ 386 #define CARD_V1_X ((uint32_t)0x00000000U) 387 #define CARD_V2_X ((uint32_t)0x00000001U) 388 /** 389 * @} 390 */ 391 392 /** 393 * @} 394 */ 395 396 /* Exported macro ------------------------------------------------------------*/ 397 /** @defgroup SD_Exported_macros SD Exported Macros 398 * @brief macros to handle interrupts and specific clock configurations 399 * @{ 400 */ 401 /** @brief Reset SD handle state. 402 * @param __HANDLE__ : SD handle. 403 * @retval None 404 */ 405 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 406 #define __HAL_SD_RESET_HANDLE_STATE(__HANDLE__) do { \ 407 (__HANDLE__)->State = HAL_SD_STATE_RESET; \ 408 (__HANDLE__)->MspInitCallback = NULL; \ 409 (__HANDLE__)->MspDeInitCallback = NULL; \ 410 } while(0) 411 #else 412 #define __HAL_SD_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SD_STATE_RESET) 413 #endif 414 415 /** 416 * @brief Enable the SD device interrupt. 417 * @param __HANDLE__: SD Handle 418 * @param __INTERRUPT__: specifies the SDMMC interrupt sources to be enabled. 419 * This parameter can be one or a combination of the following values: 420 * @arg SDMMC_IT_CCRCFAIL: Command response received (CRC check failed) interrupt 421 * @arg SDMMC_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt 422 * @arg SDMMC_IT_CTIMEOUT: Command response timeout interrupt 423 * @arg SDMMC_IT_DTIMEOUT: Data timeout interrupt 424 * @arg SDMMC_IT_TXUNDERR: Transmit FIFO underrun error interrupt 425 * @arg SDMMC_IT_RXOVERR: Received FIFO overrun error interrupt 426 * @arg SDMMC_IT_CMDREND: Command response received (CRC check passed) interrupt 427 * @arg SDMMC_IT_CMDSENT: Command sent (no response required) interrupt 428 * @arg SDMMC_IT_DATAEND: Data end (data counter, DATACOUNT, is zero) interrupt 429 * @arg SDMMC_IT_DHOLD: Data transfer Hold interrupt 430 * @arg SDMMC_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt 431 * @arg SDMMC_IT_DABORT: Data transfer aborted by CMD12 interrupt 432 * @arg SDMMC_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt 433 * @arg SDMMC_IT_RXFIFOHF: Receive FIFO Half Full interrupt 434 * @arg SDMMC_IT_RXFIFOF: Receive FIFO full interrupt 435 * @arg SDMMC_IT_TXFIFOE: Transmit FIFO empty interrupt 436 * @arg SDMMC_IT_BUSYD0END: End of SDMMC_D0 Busy following a CMD response detected interrupt 437 * @arg SDMMC_IT_SDIOIT: SDIO interrupt received interrupt 438 * @arg SDMMC_IT_ACKFAIL: Boot Acknowledgment received interrupt 439 * @arg SDMMC_IT_ACKTIMEOUT: Boot Acknowledgment timeout interrupt 440 * @arg SDMMC_IT_VSWEND: Voltage switch critical timing section completion interrupt 441 * @arg SDMMC_IT_CKSTOP: SDMMC_CK stopped in Voltage switch procedure interrupt 442 * @arg SDMMC_IT_IDMABTC: IDMA buffer transfer complete interrupt 443 * @retval None 444 */ 445 #define __HAL_SD_ENABLE_IT(__HANDLE__, __INTERRUPT__) __SDMMC_ENABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) 446 447 /** 448 * @brief Disable the SD device interrupt. 449 * @param __HANDLE__: SD Handle 450 * @param __INTERRUPT__: specifies the SDMMC interrupt sources to be disabled. 451 * This parameter can be one or a combination of the following values: 452 * @arg SDMMC_IT_CCRCFAIL: Command response received (CRC check failed) interrupt 453 * @arg SDMMC_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt 454 * @arg SDMMC_IT_CTIMEOUT: Command response timeout interrupt 455 * @arg SDMMC_IT_DTIMEOUT: Data timeout interrupt 456 * @arg SDMMC_IT_TXUNDERR: Transmit FIFO underrun error interrupt 457 * @arg SDMMC_IT_RXOVERR: Received FIFO overrun error interrupt 458 * @arg SDMMC_IT_CMDREND: Command response received (CRC check passed) interrupt 459 * @arg SDMMC_IT_CMDSENT: Command sent (no response required) interrupt 460 * @arg SDMMC_IT_DATAEND: Data end (data counter, DATACOUNT, is zero) interrupt 461 * @arg SDMMC_IT_DHOLD: Data transfer Hold interrupt 462 * @arg SDMMC_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt 463 * @arg SDMMC_IT_DABORT: Data transfer aborted by CMD12 interrupt 464 * @arg SDMMC_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt 465 * @arg SDMMC_IT_RXFIFOHF: Receive FIFO Half Full interrupt 466 * @arg SDMMC_IT_RXFIFOF: Receive FIFO full interrupt 467 * @arg SDMMC_IT_TXFIFOE: Transmit FIFO empty interrupt 468 * @arg SDMMC_IT_BUSYD0END: End of SDMMC_D0 Busy following a CMD response detected interrupt 469 * @arg SDMMC_IT_SDIOIT: SDIO interrupt received interrupt 470 * @arg SDMMC_IT_ACKFAIL: Boot Acknowledgment received interrupt 471 * @arg SDMMC_IT_ACKTIMEOUT: Boot Acknowledgment timeout interrupt 472 * @arg SDMMC_IT_VSWEND: Voltage switch critical timing section completion interrupt 473 * @arg SDMMC_IT_CKSTOP: SDMMC_CK stopped in Voltage switch procedure interrupt 474 * @arg SDMMC_IT_IDMABTC: IDMA buffer transfer complete interrupt 475 * @retval None 476 */ 477 #define __HAL_SD_DISABLE_IT(__HANDLE__, __INTERRUPT__) __SDMMC_DISABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) 478 479 /** 480 * @brief Check whether the specified SD flag is set or not. 481 * @param __HANDLE__: SD Handle 482 * @param __FLAG__: specifies the flag to check. 483 * This parameter can be one of the following values: 484 * @arg SDMMC_FLAG_CCRCFAIL: Command response received (CRC check failed) 485 * @arg SDMMC_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) 486 * @arg SDMMC_FLAG_CTIMEOUT: Command response timeout 487 * @arg SDMMC_FLAG_DTIMEOUT: Data timeout 488 * @arg SDMMC_FLAG_TXUNDERR: Transmit FIFO underrun error 489 * @arg SDMMC_FLAG_RXOVERR: Received FIFO overrun error 490 * @arg SDMMC_FLAG_CMDREND: Command response received (CRC check passed) 491 * @arg SDMMC_FLAG_CMDSENT: Command sent (no response required) 492 * @arg SDMMC_FLAG_DATAEND: Data end (data counter, DATACOUNT, is zero) 493 * @arg SDMMC_FLAG_DHOLD: Data transfer Hold 494 * @arg SDMMC_FLAG_DBCKEND: Data block sent/received (CRC check passed) 495 * @arg SDMMC_FLAG_DABORT: Data transfer aborted by CMD12 496 * @arg SDMMC_FLAG_CPSMACT: Command path state machine active 497 * @arg SDMMC_FLAG_DPSMACT: Data path state machine active 498 * @arg SDMMC_FLAG_TXFIFOHE: Transmit FIFO Half Empty 499 * @arg SDMMC_FLAG_RXFIFOHF: Receive FIFO Half Full 500 * @arg SDMMC_FLAG_TXFIFOF: Transmit FIFO full 501 * @arg SDMMC_FLAG_RXFIFOF: Receive FIFO full 502 * @arg SDMMC_FLAG_TXFIFOE: Transmit FIFO empty 503 * @arg SDMMC_FLAG_RXFIFOE: Receive FIFO empty 504 * @arg SDMMC_FLAG_BUSYD0: Inverted value of SDMMC_D0 line (Busy) 505 * @arg SDMMC_FLAG_BUSYD0END: End of SDMMC_D0 Busy following a CMD response detected 506 * @arg SDMMC_FLAG_SDIOIT: SDIO interrupt received 507 * @arg SDMMC_FLAG_ACKFAIL: Boot Acknowledgment received 508 * @arg SDMMC_FLAG_ACKTIMEOUT: Boot Acknowledgment timeout 509 * @arg SDMMC_FLAG_VSWEND: Voltage switch critical timing section completion 510 * @arg SDMMC_FLAG_CKSTOP: SDMMC_CK stopped in Voltage switch procedure 511 * @arg SDMMC_FLAG_IDMATE: IDMA transfer error 512 * @arg SDMMC_FLAG_IDMABTC: IDMA buffer transfer complete 513 * @retval The new state of SD FLAG (SET or RESET). 514 */ 515 #define __HAL_SD_GET_FLAG(__HANDLE__, __FLAG__) __SDMMC_GET_FLAG((__HANDLE__)->Instance, (__FLAG__)) 516 517 /** 518 * @brief Clear the SD's pending flags. 519 * @param __HANDLE__: SD Handle 520 * @param __FLAG__: specifies the flag to clear. 521 * This parameter can be one or a combination of the following values: 522 * @arg SDMMC_FLAG_CCRCFAIL: Command response received (CRC check failed) 523 * @arg SDMMC_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) 524 * @arg SDMMC_FLAG_CTIMEOUT: Command response timeout 525 * @arg SDMMC_FLAG_DTIMEOUT: Data timeout 526 * @arg SDMMC_FLAG_TXUNDERR: Transmit FIFO underrun error 527 * @arg SDMMC_FLAG_RXOVERR: Received FIFO overrun error 528 * @arg SDMMC_FLAG_CMDREND: Command response received (CRC check passed) 529 * @arg SDMMC_FLAG_CMDSENT: Command sent (no response required) 530 * @arg SDMMC_FLAG_DATAEND: Data end (data counter, DATACOUNT, is zero) 531 * @arg SDMMC_FLAG_DHOLD: Data transfer Hold 532 * @arg SDMMC_FLAG_DBCKEND: Data block sent/received (CRC check passed) 533 * @arg SDMMC_FLAG_DABORT: Data transfer aborted by CMD12 534 * @arg SDMMC_FLAG_BUSYD0END: End of SDMMC_D0 Busy following a CMD response detected 535 * @arg SDMMC_FLAG_SDIOIT: SDIO interrupt received 536 * @arg SDMMC_FLAG_ACKFAIL: Boot Acknowledgment received 537 * @arg SDMMC_FLAG_ACKTIMEOUT: Boot Acknowledgment timeout 538 * @arg SDMMC_FLAG_VSWEND: Voltage switch critical timing section completion 539 * @arg SDMMC_FLAG_CKSTOP: SDMMC_CK stopped in Voltage switch procedure 540 * @arg SDMMC_FLAG_IDMATE: IDMA transfer error 541 * @arg SDMMC_FLAG_IDMABTC: IDMA buffer transfer complete 542 * @retval None 543 */ 544 #define __HAL_SD_CLEAR_FLAG(__HANDLE__, __FLAG__) __SDMMC_CLEAR_FLAG((__HANDLE__)->Instance, (__FLAG__)) 545 546 /** 547 * @brief Check whether the specified SD interrupt has occurred or not. 548 * @param __HANDLE__: SD Handle 549 * @param __INTERRUPT__: specifies the SDMMC interrupt source to check. 550 * This parameter can be one of the following values: 551 * @arg SDMMC_IT_CCRCFAIL: Command response received (CRC check failed) interrupt 552 * @arg SDMMC_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt 553 * @arg SDMMC_IT_CTIMEOUT: Command response timeout interrupt 554 * @arg SDMMC_IT_DTIMEOUT: Data timeout interrupt 555 * @arg SDMMC_IT_TXUNDERR: Transmit FIFO underrun error interrupt 556 * @arg SDMMC_IT_RXOVERR: Received FIFO overrun error interrupt 557 * @arg SDMMC_IT_CMDREND: Command response received (CRC check passed) interrupt 558 * @arg SDMMC_IT_CMDSENT: Command sent (no response required) interrupt 559 * @arg SDMMC_IT_DATAEND: Data end (data counter, DATACOUNT, is zero) interrupt 560 * @arg SDMMC_IT_DHOLD: Data transfer Hold interrupt 561 * @arg SDMMC_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt 562 * @arg SDMMC_IT_DABORT: Data transfer aborted by CMD12 interrupt 563 * @arg SDMMC_IT_DPSMACT: Data path state machine active interrupt 564 * @arg SDMMC_IT_CPSMACT: Command path state machine active interrupt 565 * @arg SDMMC_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt 566 * @arg SDMMC_IT_RXFIFOHF: Receive FIFO Half Full interrupt 567 * @arg SDMMC_IT_TXFIFOF: Transmit FIFO full interrupt 568 * @arg SDMMC_IT_RXFIFOF: Receive FIFO full interrupt 569 * @arg SDMMC_IT_TXFIFOE: Transmit FIFO empty interrupt 570 * @arg SDMMC_IT_RXFIFOE: Receive FIFO empty interrupt 571 * @arg SDMMC_IT_BUSYD0: Inverted value of SDMMC_D0 line (Busy) 572 * @arg SDMMC_IT_BUSYD0END: End of SDMMC_D0 Busy following a CMD response detected interrupt 573 * @arg SDMMC_IT_SDIOIT: SDIO interrupt received interrupt 574 * @arg SDMMC_IT_ACKFAIL: Boot Acknowledgment received interrupt 575 * @arg SDMMC_IT_ACKTIMEOUT: Boot Acknowledgment timeout interrupt 576 * @arg SDMMC_IT_VSWEND: Voltage switch critical timing section completion interrupt 577 * @arg SDMMC_IT_CKSTOP: SDMMC_CK stopped in Voltage switch procedure interrupt 578 * @arg SDMMC_IT_IDMATE: IDMA transfer error interrupt 579 * @arg SDMMC_IT_IDMABTC: IDMA buffer transfer complete interrupt 580 * @retval The new state of SD IT (SET or RESET). 581 */ 582 #define __HAL_SD_GET_IT(__HANDLE__, __INTERRUPT__) __SDMMC_GET_IT((__HANDLE__)->Instance, (__INTERRUPT__)) 583 584 /** 585 * @brief Clear the SD's interrupt pending bits. 586 * @param __HANDLE__: SD Handle 587 * @param __INTERRUPT__: specifies the interrupt pending bit to clear. 588 * This parameter can be one or a combination of the following values: 589 * @arg SDMMC_IT_CCRCFAIL: Command response received (CRC check failed) interrupt 590 * @arg SDMMC_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt 591 * @arg SDMMC_IT_CTIMEOUT: Command response timeout interrupt 592 * @arg SDMMC_IT_DTIMEOUT: Data timeout interrupt 593 * @arg SDMMC_IT_TXUNDERR: Transmit FIFO underrun error interrupt 594 * @arg SDMMC_IT_RXOVERR: Received FIFO overrun error interrupt 595 * @arg SDMMC_IT_CMDREND: Command response received (CRC check passed) interrupt 596 * @arg SDMMC_IT_CMDSENT: Command sent (no response required) interrupt 597 * @arg SDMMC_IT_DATAEND: Data end (data counter, DATACOUNT, is zero) interrupt 598 * @arg SDMMC_IT_DHOLD: Data transfer Hold interrupt 599 * @arg SDMMC_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt 600 * @arg SDMMC_IT_DABORT: Data transfer aborted by CMD12 interrupt 601 * @arg SDMMC_IT_BUSYD0END: End of SDMMC_D0 Busy following a CMD response detected interrupt 602 * @arg SDMMC_IT_SDIOIT: SDIO interrupt received interrupt 603 * @arg SDMMC_IT_ACKFAIL: Boot Acknowledgment received interrupt 604 * @arg SDMMC_IT_ACKTIMEOUT: Boot Acknowledgment timeout interrupt 605 * @arg SDMMC_IT_VSWEND: Voltage switch critical timing section completion interrupt 606 * @arg SDMMC_IT_CKSTOP: SDMMC_CK stopped in Voltage switch procedure interrupt 607 * @arg SDMMC_IT_IDMATE: IDMA transfer error interrupt 608 * @arg SDMMC_IT_IDMABTC: IDMA buffer transfer complete interrupt 609 * @retval None 610 */ 611 #define __HAL_SD_CLEAR_IT(__HANDLE__, __INTERRUPT__) __SDMMC_CLEAR_IT((__HANDLE__)->Instance, (__INTERRUPT__)) 612 613 /** 614 * @} 615 */ 616 617 /* Include SD HAL Extension module */ 618 #include "stm32mp1xx_hal_sd_ex.h" 619 620 /* Exported functions --------------------------------------------------------*/ 621 /** @defgroup SD_Exported_Functions SD Exported Functions 622 * @{ 623 */ 624 625 /** @defgroup SD_Exported_Functions_Group1 Initialization and de-initialization functions 626 * @{ 627 */ 628 HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd); 629 HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd); 630 HAL_StatusTypeDef HAL_SD_DeInit (SD_HandleTypeDef *hsd); 631 void HAL_SD_MspInit(SD_HandleTypeDef *hsd); 632 void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd); 633 /** 634 * @} 635 */ 636 637 /** @defgroup SD_Exported_Functions_Group2 Input and Output operation functions 638 * @{ 639 */ 640 /* Blocking mode: Polling */ 641 HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout); 642 HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout); 643 HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd); 644 /* Non-Blocking mode: IT */ 645 HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); 646 HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); 647 /* Non-Blocking mode: DMA */ 648 HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); 649 HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks); 650 651 void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd); 652 653 /* Callback in non blocking modes (DMA) */ 654 void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd); 655 void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd); 656 void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd); 657 void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd); 658 659 #if (USE_SD_TRANSCEIVER != 0U) 660 /* Callback to switch in 1.8V mode */ 661 void HAL_SD_DriveTransceiver_1_8V_Callback(FlagStatus status); 662 #endif 663 664 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U) 665 /* SD callback registering/unregistering */ 666 HAL_StatusTypeDef HAL_SD_RegisterCallback (SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID, pSD_CallbackTypeDef pCallback); 667 HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID); 668 669 #if (USE_SD_TRANSCEIVER != 0U) 670 HAL_StatusTypeDef HAL_SD_RegisterTransceiverCallback (SD_HandleTypeDef *hsd, pSD_TransceiverCallbackTypeDef pCallback); 671 HAL_StatusTypeDef HAL_SD_UnRegisterTransceiverCallback(SD_HandleTypeDef *hsd); 672 #endif 673 #endif 674 675 /** 676 * @} 677 */ 678 679 /** @defgroup SD_Exported_Functions_Group3 Peripheral Control functions 680 * @{ 681 */ 682 HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode); 683 /** 684 * @} 685 */ 686 687 /** @defgroup SD_Exported_Functions_Group4 SD card related functions 688 * @{ 689 */ 690 HAL_StatusTypeDef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus); 691 HAL_SD_CardStateTypedef HAL_SD_GetCardState(SD_HandleTypeDef *hsd); 692 HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypedef *pCID); 693 HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypedef *pCSD); 694 HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pStatus); 695 HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo); 696 /** 697 * @} 698 */ 699 700 /** @defgroup SD_Exported_Functions_Group5 Peripheral State and Errors functions 701 * @{ 702 */ 703 HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd); 704 uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd); 705 /** 706 * @} 707 */ 708 709 /** @defgroup SD_Exported_Functions_Group6 Perioheral Abort management 710 * @{ 711 */ 712 HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd); 713 HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd); 714 /** 715 * @} 716 */ 717 718 /* Private types -------------------------------------------------------------*/ 719 /** @defgroup SD_Private_Types SD Private Types 720 * @{ 721 */ 722 723 /** 724 * @} 725 */ 726 727 /* Private defines -----------------------------------------------------------*/ 728 /** @defgroup SD_Private_Defines SD Private Defines 729 * @{ 730 */ 731 732 /** 733 * @} 734 */ 735 736 /* Private variables ---------------------------------------------------------*/ 737 /** @defgroup SD_Private_Variables SD Private Variables 738 * @{ 739 */ 740 741 /** 742 * @} 743 */ 744 745 /* Private constants ---------------------------------------------------------*/ 746 /** @defgroup SD_Private_Constants SD Private Constants 747 * @{ 748 */ 749 750 /** 751 * @} 752 */ 753 754 /* Private macros ------------------------------------------------------------*/ 755 /** @defgroup SD_Private_Macros SD Private Macros 756 * @{ 757 */ 758 759 /** 760 * @} 761 */ 762 763 /* Private functions prototypes ----------------------------------------------*/ 764 /** @defgroup SD_Private_Functions_Prototypes SD Private Functions Prototypes 765 * @{ 766 */ 767 768 /** 769 * @} 770 */ 771 772 /* Private functions ---------------------------------------------------------*/ 773 /** @defgroup SD_Private_Functions SD Private Functions 774 * @{ 775 */ 776 777 /** 778 * @} 779 */ 780 781 782 /** 783 * @} 784 */ 785 786 /** 787 * @} 788 */ 789 790 /** 791 * @} 792 */ 793 794 #ifdef __cplusplus 795 } 796 #endif 797 798 799 #endif /* STM32MP1xx_HAL_SD_H */ 800