1 /**
2   ******************************************************************************
3   * @file    stm32f1xx_hal_sd.c
4   * @author  MCD Application Team
5   * @brief   SD card HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the Secure Digital (SD) peripheral:
8   *           + Initialization and de-initialization functions
9   *           + IO operation functions
10   *           + Peripheral Control functions
11   *           + Peripheral State functions
12   *
13   ******************************************************************************
14   * @attention
15   *
16   * Copyright (c) 2016 STMicroelectronics.
17   * All rights reserved.
18   *
19   * This software is licensed under terms that can be found in the LICENSE file
20   * in the root directory of this software component.
21   * If no LICENSE file comes with this software, it is provided AS-IS.
22   *
23   ******************************************************************************
24   @verbatim
25   ==============================================================================
26                         ##### How to use this driver #####
27   ==============================================================================
28   [..]
29     This driver implements a high level communication layer for read and write from/to
30     this memory. The needed STM32 hardware resources (SDIO and GPIO) are performed by
31     the user in HAL_SD_MspInit() function (MSP layer).
32     Basically, the MSP layer configuration should be the same as we provide in the
33     examples.
34     You can easily tailor this configuration according to hardware resources.
35 
36   [..]
37     This driver is a generic layered driver for SDIO memories which uses the HAL
38     SDIO driver functions to interface with SD and uSD cards devices.
39     It is used as follows:
40 
41     (#)Initialize the SDIO low level resources by implementing the HAL_SD_MspInit() API:
42         (##) Enable the SDIO interface clock using __HAL_RCC_SDIO_CLK_ENABLE();
43         (##) SDIO pins configuration for SD card
44             (+++) Enable the clock for the SDIO GPIOs using the functions __HAL_RCC_GPIOx_CLK_ENABLE();
45             (+++) Configure these SDIO pins as alternate function pull-up using HAL_GPIO_Init()
46                   and according to your pin assignment;
47         (##) DMA configuration if you need to use DMA process (HAL_SD_ReadBlocks_DMA()
48              and HAL_SD_WriteBlocks_DMA() APIs).
49             (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE();
50             (+++) Configure the DMA using the function HAL_DMA_Init() with predeclared and filled.
51         (##) NVIC configuration if you need to use interrupt process when using DMA transfer.
52             (+++) Configure the SDIO and DMA interrupt priorities using functions
53                   HAL_NVIC_SetPriority(); DMA priority is superior to SDIO's priority
54             (+++) Enable the NVIC DMA and SDIO IRQs using function HAL_NVIC_EnableIRQ()
55             (+++) SDIO interrupts are managed using the macros __HAL_SD_ENABLE_IT()
56                   and __HAL_SD_DISABLE_IT() inside the communication process.
57             (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_GET_IT()
58                   and __HAL_SD_CLEAR_IT()
59         (##) NVIC configuration if you need to use interrupt process (HAL_SD_ReadBlocks_IT()
60              and HAL_SD_WriteBlocks_IT() APIs).
61             (+++) Configure the SDIO interrupt priorities using function HAL_NVIC_SetPriority();
62             (+++) Enable the NVIC SDIO IRQs using function HAL_NVIC_EnableIRQ()
63             (+++) SDIO interrupts are managed using the macros __HAL_SD_ENABLE_IT()
64                   and __HAL_SD_DISABLE_IT() inside the communication process.
65             (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_GET_IT()
66                   and __HAL_SD_CLEAR_IT()
67     (#) At this stage, you can perform SD read/write/erase operations after SD card initialization
68 
69 
70   *** SD Card Initialization and configuration ***
71   ================================================
72   [..]
73     To initialize the SD Card, use the HAL_SD_Init() function. It Initializes
74     SDIO Peripheral(STM32 side) and the SD Card, and put it into StandBy State (Ready for data transfer).
75     This function provide the following operations:
76 
77     (#) Apply the SD Card initialization process at 400KHz and check the SD Card
78         type (Standard Capacity or High Capacity). You can change or adapt this
79         frequency by adjusting the "ClockDiv" field.
80         The SD Card frequency (SDIO_CK) is computed as follows:
81 
82            SDIO_CK = SDIOCLK / (ClockDiv + 2)
83 
84         In initialization mode and according to the SD Card standard,
85         make sure that the SDIO_CK frequency doesn't exceed 400KHz.
86 
87         This phase of initialization is done through SDIO_Init() and
88         SDIO_PowerState_ON() SDIO low level APIs.
89 
90     (#) Initialize the SD card. The API used is HAL_SD_InitCard().
91         This phase allows the card initialization and identification
92         and check the SD Card type (Standard Capacity or High Capacity)
93         The initialization flow is compatible with SD standard.
94 
95         This API (HAL_SD_InitCard()) could be used also to reinitialize the card in case
96         of plug-off plug-in.
97 
98     (#) Configure the SD Card Data transfer frequency. You can change or adapt this
99         frequency by adjusting the "ClockDiv" field.
100         In transfer mode and according to the SD Card standard, make sure that the
101         SDIO_CK frequency doesn't exceed 25MHz and 50MHz in High-speed mode switch.
102         To be able to use a frequency higher than 24MHz, you should use the SDIO
103         peripheral in bypass mode. Refer to the corresponding reference manual
104         for more details.
105 
106     (#) Select the corresponding SD Card according to the address read with the step 2.
107 
108     (#) Configure the SD Card in wide bus mode: 4-bits data.
109 
110   *** SD Card Read operation ***
111   ==============================
112   [..]
113     (+) You can read from SD card in polling mode by using function HAL_SD_ReadBlocks().
114         This function support only 512-bytes block length (the block size should be
115         chosen as 512 bytes).
116         You can choose either one block read operation or multiple block read operation
117         by adjusting the "NumberOfBlocks" parameter.
118         After this, you have to ensure that the transfer is done correctly. The check is done
119         through HAL_SD_GetCardState() function for SD card state.
120 
121     (+) You can read from SD card in DMA mode by using function HAL_SD_ReadBlocks_DMA().
122         This function support only 512-bytes block length (the block size should be
123         chosen as 512 bytes).
124         You can choose either one block read operation or multiple block read operation
125         by adjusting the "NumberOfBlocks" parameter.
126         After this, you have to ensure that the transfer is done correctly. The check is done
127         through HAL_SD_GetCardState() function for SD card state.
128         You could also check the DMA transfer process through the SD Rx interrupt event.
129 
130     (+) You can read from SD card in Interrupt mode by using function HAL_SD_ReadBlocks_IT().
131         This function support only 512-bytes block length (the block size should be
132         chosen as 512 bytes).
133         You can choose either one block read operation or multiple block read operation
134         by adjusting the "NumberOfBlocks" parameter.
135         After this, you have to ensure that the transfer is done correctly. The check is done
136         through HAL_SD_GetCardState() function for SD card state.
137         You could also check the IT transfer process through the SD Rx interrupt event.
138 
139   *** SD Card Write operation ***
140   ===============================
141   [..]
142     (+) You can write to SD card in polling mode by using function HAL_SD_WriteBlocks().
143         This function support only 512-bytes block length (the block size should be
144         chosen as 512 bytes).
145         You can choose either one block read operation or multiple block read operation
146         by adjusting the "NumberOfBlocks" parameter.
147         After this, you have to ensure that the transfer is done correctly. The check is done
148         through HAL_SD_GetCardState() function for SD card state.
149 
150     (+) You can write to SD card in DMA mode by using function HAL_SD_WriteBlocks_DMA().
151         This function support only 512-bytes block length (the block size should be
152         chosen as 512 bytes).
153         You can choose either one block read operation or multiple block read operation
154         by adjusting the "NumberOfBlocks" parameter.
155         After this, you have to ensure that the transfer is done correctly. The check is done
156         through HAL_SD_GetCardState() function for SD card state.
157         You could also check the DMA transfer process through the SD Tx interrupt event.
158 
159     (+) You can write to SD card in Interrupt mode by using function HAL_SD_WriteBlocks_IT().
160         This function support only 512-bytes block length (the block size should be
161         chosen as 512 bytes).
162         You can choose either one block read operation or multiple block read operation
163         by adjusting the "NumberOfBlocks" parameter.
164         After this, you have to ensure that the transfer is done correctly. The check is done
165         through HAL_SD_GetCardState() function for SD card state.
166         You could also check the IT transfer process through the SD Tx interrupt event.
167 
168   *** SD card status ***
169   ======================
170   [..]
171     (+) The SD Status contains status bits that are related to the SD Memory
172         Card proprietary features. To get SD card status use the HAL_SD_GetCardStatus().
173 
174   *** SD card information ***
175   ===========================
176   [..]
177     (+) To get SD card information, you can use the function HAL_SD_GetCardInfo().
178         It returns useful information about the SD card such as block size, card type,
179         block number ...
180 
181   *** SD card CSD register ***
182   ============================
183     (+) The HAL_SD_GetCardCSD() API allows to get the parameters of the CSD register.
184         Some of the CSD parameters are useful for card initialization and identification.
185 
186   *** SD card CID register ***
187   ============================
188     (+) The HAL_SD_GetCardCID() API allows to get the parameters of the CID register.
189         Some of the CSD parameters are useful for card initialization and identification.
190 
191   *** SD HAL driver macros list ***
192   ==================================
193   [..]
194     Below the list of most used macros in SD HAL driver.
195 
196     (+) __HAL_SD_ENABLE : Enable the SD device
197     (+) __HAL_SD_DISABLE : Disable the SD device
198     (+) __HAL_SD_DMA_ENABLE: Enable the SDIO DMA transfer
199     (+) __HAL_SD_DMA_DISABLE: Disable the SDIO DMA transfer
200     (+) __HAL_SD_ENABLE_IT: Enable the SD device interrupt
201     (+) __HAL_SD_DISABLE_IT: Disable the SD device interrupt
202     (+) __HAL_SD_GET_FLAG:Check whether the specified SD flag is set or not
203     (+) __HAL_SD_CLEAR_FLAG: Clear the SD's pending flags
204 
205     (@) You can refer to the SD HAL driver header file for more useful macros
206 
207   *** Callback registration ***
208   =============================================
209   [..]
210     The compilation define USE_HAL_SD_REGISTER_CALLBACKS when set to 1
211     allows the user to configure dynamically the driver callbacks.
212 
213     Use Functions HAL_SD_RegisterCallback() to register a user callback,
214     it allows to register following callbacks:
215       (+) TxCpltCallback : callback when a transmission transfer is completed.
216       (+) RxCpltCallback : callback when a reception transfer is completed.
217       (+) ErrorCallback : callback when error occurs.
218       (+) AbortCpltCallback : callback when abort is completed.
219       (+) MspInitCallback    : SD MspInit.
220       (+) MspDeInitCallback  : SD MspDeInit.
221     This function takes as parameters the HAL peripheral handle, the Callback ID
222     and a pointer to the user callback function.
223 
224     Use function HAL_SD_UnRegisterCallback() to reset a callback to the default
225     weak (surcharged) function. It allows to reset following callbacks:
226       (+) TxCpltCallback : callback when a transmission transfer is completed.
227       (+) RxCpltCallback : callback when a reception transfer is completed.
228       (+) ErrorCallback : callback when error occurs.
229       (+) AbortCpltCallback : callback when abort is completed.
230       (+) MspInitCallback    : SD MspInit.
231       (+) MspDeInitCallback  : SD MspDeInit.
232     This function) takes as parameters the HAL peripheral handle and the Callback ID.
233 
234     By default, after the HAL_SD_Init and if the state is HAL_SD_STATE_RESET
235     all callbacks are reset to the corresponding legacy weak (surcharged) functions.
236     Exception done for MspInit and MspDeInit callbacks that are respectively
237     reset to the legacy weak (surcharged) functions in the HAL_SD_Init
238     and  HAL_SD_DeInit only when these callbacks are null (not registered beforehand).
239     If not, MspInit or MspDeInit are not null, the HAL_SD_Init and HAL_SD_DeInit
240     keep and use the user MspInit/MspDeInit callbacks (registered beforehand)
241 
242     Callbacks can be registered/unregistered in READY state only.
243     Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered
244     in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used
245     during the Init/DeInit.
246     In that case first register the MspInit/MspDeInit user callbacks
247     using HAL_SD_RegisterCallback before calling HAL_SD_DeInit
248     or HAL_SD_Init function.
249 
250     When The compilation define USE_HAL_SD_REGISTER_CALLBACKS is set to 0 or
251     not defined, the callback registering feature is not available
252     and weak (surcharged) callbacks are used.
253 
254   @endverbatim
255   ******************************************************************************
256   */
257 
258 /* Includes ------------------------------------------------------------------*/
259 #include "stm32f1xx_hal.h"
260 
261 #if defined(SDIO)
262 
263 /** @addtogroup STM32F1xx_HAL_Driver
264   * @{
265   */
266 
267 /** @addtogroup SD
268   * @{
269   */
270 
271 #ifdef HAL_SD_MODULE_ENABLED
272 
273 /* Private typedef -----------------------------------------------------------*/
274 /* Private define ------------------------------------------------------------*/
275 /** @addtogroup SD_Private_Defines
276   * @{
277   */
278 
279 /**
280   * @}
281   */
282 
283 /* Private macro -------------------------------------------------------------*/
284 /* Private variables ---------------------------------------------------------*/
285 /* Private function prototypes -----------------------------------------------*/
286 /* Private functions ---------------------------------------------------------*/
287 /** @defgroup SD_Private_Functions SD Private Functions
288   * @{
289   */
290 static uint32_t SD_InitCard(SD_HandleTypeDef *hsd);
291 static uint32_t SD_PowerON(SD_HandleTypeDef *hsd);
292 static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus);
293 static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
294 static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd);
295 static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd);
296 static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);
297 static void SD_PowerOFF(SD_HandleTypeDef *hsd);
298 static void SD_Write_IT(SD_HandleTypeDef *hsd);
299 static void SD_Read_IT(SD_HandleTypeDef *hsd);
300 static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
301 static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
302 static void SD_DMAError(DMA_HandleTypeDef *hdma);
303 static void SD_DMATxAbort(DMA_HandleTypeDef *hdma);
304 static void SD_DMARxAbort(DMA_HandleTypeDef *hdma);
305 /**
306   * @}
307   */
308 
309 /* Exported functions --------------------------------------------------------*/
310 /** @addtogroup SD_Exported_Functions
311   * @{
312   */
313 
314 /** @addtogroup SD_Exported_Functions_Group1
315  *  @brief   Initialization and de-initialization functions
316  *
317 @verbatim
318   ==============================================================================
319           ##### Initialization and de-initialization functions #####
320   ==============================================================================
321   [..]
322     This section provides functions allowing to initialize/de-initialize the SD
323     card device to be ready for use.
324 
325 @endverbatim
326   * @{
327   */
328 
329 /**
330   * @brief  Initializes the SD according to the specified parameters in the
331             SD_HandleTypeDef and create the associated handle.
332   * @param  hsd: Pointer to the SD handle
333   * @retval HAL status
334   */
HAL_SD_Init(SD_HandleTypeDef * hsd)335 HAL_StatusTypeDef HAL_SD_Init(SD_HandleTypeDef *hsd)
336 {
337   /* Check the SD handle allocation */
338   if(hsd == NULL)
339   {
340     return HAL_ERROR;
341   }
342 
343   /* Check the parameters */
344   assert_param(IS_SDIO_ALL_INSTANCE(hsd->Instance));
345   assert_param(IS_SDIO_CLOCK_EDGE(hsd->Init.ClockEdge));
346   assert_param(IS_SDIO_CLOCK_BYPASS(hsd->Init.ClockBypass));
347   assert_param(IS_SDIO_CLOCK_POWER_SAVE(hsd->Init.ClockPowerSave));
348   assert_param(IS_SDIO_BUS_WIDE(hsd->Init.BusWide));
349   assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(hsd->Init.HardwareFlowControl));
350   assert_param(IS_SDIO_CLKDIV(hsd->Init.ClockDiv));
351 
352   if(hsd->State == HAL_SD_STATE_RESET)
353   {
354     /* Allocate lock resource and initialize it */
355     hsd->Lock = HAL_UNLOCKED;
356 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
357     /* Reset Callback pointers in HAL_SD_STATE_RESET only */
358     hsd->TxCpltCallback    = HAL_SD_TxCpltCallback;
359     hsd->RxCpltCallback    = HAL_SD_RxCpltCallback;
360     hsd->ErrorCallback     = HAL_SD_ErrorCallback;
361     hsd->AbortCpltCallback = HAL_SD_AbortCallback;
362 
363     if(hsd->MspInitCallback == NULL)
364     {
365       hsd->MspInitCallback = HAL_SD_MspInit;
366     }
367 
368     /* Init the low level hardware */
369     hsd->MspInitCallback(hsd);
370 #else
371     /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
372     HAL_SD_MspInit(hsd);
373 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
374   }
375 
376   hsd->State = HAL_SD_STATE_BUSY;
377 
378   /* Initialize the Card parameters */
379   if (HAL_SD_InitCard(hsd) != HAL_OK)
380   {
381     return HAL_ERROR;
382   }
383 
384   /* Initialize the error code */
385   hsd->ErrorCode = HAL_SD_ERROR_NONE;
386 
387   /* Initialize the SD operation */
388   hsd->Context = SD_CONTEXT_NONE;
389 
390   /* Initialize the SD state */
391   hsd->State = HAL_SD_STATE_READY;
392 
393   return HAL_OK;
394 }
395 
396 /**
397   * @brief  Initializes the SD Card.
398   * @param  hsd: Pointer to SD handle
399   * @note   This function initializes the SD card. It could be used when a card
400             re-initialization is needed.
401   * @retval HAL status
402   */
HAL_SD_InitCard(SD_HandleTypeDef * hsd)403 HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
404 {
405   uint32_t errorstate;
406   SD_InitTypeDef Init;
407 
408   /* Default SDIO peripheral configuration for SD card initialization */
409   Init.ClockEdge           = SDIO_CLOCK_EDGE_RISING;
410   Init.ClockBypass         = SDIO_CLOCK_BYPASS_DISABLE;
411   Init.ClockPowerSave      = SDIO_CLOCK_POWER_SAVE_DISABLE;
412   Init.BusWide             = SDIO_BUS_WIDE_1B;
413   Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
414   Init.ClockDiv            = SDIO_INIT_CLK_DIV;
415 
416   /* Initialize SDIO peripheral interface with default configuration */
417   SDIO_Init(hsd->Instance, Init);
418 
419   /* Disable SDIO Clock */
420   __HAL_SD_DISABLE(hsd);
421 
422   /* Set Power State to ON */
423   (void)SDIO_PowerState_ON(hsd->Instance);
424 
425   /* Enable SDIO Clock */
426   __HAL_SD_ENABLE(hsd);
427 
428   /* Required power up waiting time before starting the SD initialization  sequence */
429   HAL_Delay(2);
430 
431   /* Identify card operating voltage */
432   errorstate = SD_PowerON(hsd);
433   if(errorstate != HAL_SD_ERROR_NONE)
434   {
435     hsd->State = HAL_SD_STATE_READY;
436     hsd->ErrorCode |= errorstate;
437     return HAL_ERROR;
438   }
439 
440   /* Card initialization */
441   errorstate = SD_InitCard(hsd);
442   if(errorstate != HAL_SD_ERROR_NONE)
443   {
444     hsd->State = HAL_SD_STATE_READY;
445     hsd->ErrorCode |= errorstate;
446     return HAL_ERROR;
447   }
448 
449   /* Set Block Size for Card */
450   errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
451   if(errorstate != HAL_SD_ERROR_NONE)
452   {
453     /* Clear all the static flags */
454     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
455     hsd->ErrorCode |= errorstate;
456     hsd->State = HAL_SD_STATE_READY;
457     return HAL_ERROR;
458   }
459 
460   return HAL_OK;
461 }
462 
463 /**
464   * @brief  De-Initializes the SD card.
465   * @param  hsd: Pointer to SD handle
466   * @retval HAL status
467   */
HAL_SD_DeInit(SD_HandleTypeDef * hsd)468 HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
469 {
470   /* Check the SD handle allocation */
471   if(hsd == NULL)
472   {
473     return HAL_ERROR;
474   }
475 
476   /* Check the parameters */
477   assert_param(IS_SDIO_ALL_INSTANCE(hsd->Instance));
478 
479   hsd->State = HAL_SD_STATE_BUSY;
480 
481   /* Set SD power state to off */
482   SD_PowerOFF(hsd);
483 
484 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
485   if(hsd->MspDeInitCallback == NULL)
486   {
487     hsd->MspDeInitCallback = HAL_SD_MspDeInit;
488   }
489 
490   /* DeInit the low level hardware */
491   hsd->MspDeInitCallback(hsd);
492 #else
493   /* De-Initialize the MSP layer */
494   HAL_SD_MspDeInit(hsd);
495 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
496 
497   hsd->ErrorCode = HAL_SD_ERROR_NONE;
498   hsd->State = HAL_SD_STATE_RESET;
499 
500   return HAL_OK;
501 }
502 
503 
504 /**
505   * @brief  Initializes the SD MSP.
506   * @param  hsd: Pointer to SD handle
507   * @retval None
508   */
HAL_SD_MspInit(SD_HandleTypeDef * hsd)509 __weak void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
510 {
511   /* Prevent unused argument(s) compilation warning */
512   UNUSED(hsd);
513 
514   /* NOTE : This function should not be modified, when the callback is needed,
515             the HAL_SD_MspInit could be implemented in the user file
516    */
517 }
518 
519 /**
520   * @brief  De-Initialize SD MSP.
521   * @param  hsd: Pointer to SD handle
522   * @retval None
523   */
HAL_SD_MspDeInit(SD_HandleTypeDef * hsd)524 __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
525 {
526   /* Prevent unused argument(s) compilation warning */
527   UNUSED(hsd);
528 
529   /* NOTE : This function should not be modified, when the callback is needed,
530             the HAL_SD_MspDeInit could be implemented in the user file
531    */
532 }
533 
534 /**
535   * @}
536   */
537 
538 /** @addtogroup SD_Exported_Functions_Group2
539  *  @brief   Data transfer functions
540  *
541 @verbatim
542   ==============================================================================
543                         ##### IO operation functions #####
544   ==============================================================================
545   [..]
546     This subsection provides a set of functions allowing to manage the data
547     transfer from/to SD card.
548 
549 @endverbatim
550   * @{
551   */
552 
553 /**
554   * @brief  Reads block(s) from a specified address in a card. The Data transfer
555   *         is managed by polling mode.
556   * @note   This API should be followed by a check on the card state through
557   *         HAL_SD_GetCardState().
558   * @param  hsd: Pointer to SD handle
559   * @param  pData: pointer to the buffer that will contain the received data
560   * @param  BlockAdd: Block Address from where data is to be read
561   * @param  NumberOfBlocks: Number of SD blocks to read
562   * @param  Timeout: Specify timeout value
563   * @retval HAL status
564   */
HAL_SD_ReadBlocks(SD_HandleTypeDef * hsd,uint8_t * pData,uint32_t BlockAdd,uint32_t NumberOfBlocks,uint32_t Timeout)565 HAL_StatusTypeDef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
566 {
567   SDIO_DataInitTypeDef config;
568   uint32_t errorstate;
569   uint32_t tickstart = HAL_GetTick();
570   uint32_t count, data, dataremaining;
571   uint32_t add = BlockAdd;
572   uint8_t *tempbuff = pData;
573 
574   if(NULL == pData)
575   {
576     hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
577     return HAL_ERROR;
578   }
579 
580   if(hsd->State == HAL_SD_STATE_READY)
581   {
582     hsd->ErrorCode = HAL_SD_ERROR_NONE;
583 
584     if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
585     {
586       hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
587       return HAL_ERROR;
588     }
589 
590     hsd->State = HAL_SD_STATE_BUSY;
591 
592     /* Initialize data control register */
593     hsd->Instance->DCTRL = 0U;
594 
595     if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
596     {
597       add *= 512U;
598     }
599 
600     /* Configure the SD DPSM (Data Path State Machine) */
601     config.DataTimeOut   = SDMMC_DATATIMEOUT;
602     config.DataLength    = NumberOfBlocks * BLOCKSIZE;
603     config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
604     config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
605     config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
606     config.DPSM          = SDIO_DPSM_ENABLE;
607     (void)SDIO_ConfigData(hsd->Instance, &config);
608 
609     /* Read block(s) in polling mode */
610     if(NumberOfBlocks > 1U)
611     {
612       hsd->Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;
613 
614       /* Read Multi Block command */
615       errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
616     }
617     else
618     {
619       hsd->Context = SD_CONTEXT_READ_SINGLE_BLOCK;
620 
621       /* Read Single Block command */
622       errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
623     }
624     if(errorstate != HAL_SD_ERROR_NONE)
625     {
626       /* Clear all the static flags */
627       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
628       hsd->ErrorCode |= errorstate;
629       hsd->State = HAL_SD_STATE_READY;
630       hsd->Context = SD_CONTEXT_NONE;
631       return HAL_ERROR;
632     }
633 
634     /* Poll on SDIO flags */
635     dataremaining = config.DataLength;
636     while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
637     {
638       if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF) && (dataremaining > 0U))
639       {
640         /* Read data from SDIO Rx FIFO */
641         for(count = 0U; count < 8U; count++)
642         {
643           data = SDIO_ReadFIFO(hsd->Instance);
644           *tempbuff = (uint8_t)(data & 0xFFU);
645           tempbuff++;
646           dataremaining--;
647           *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
648           tempbuff++;
649           dataremaining--;
650           *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
651           tempbuff++;
652           dataremaining--;
653           *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
654           tempbuff++;
655           dataremaining--;
656         }
657       }
658 
659       if(((HAL_GetTick()-tickstart) >=  Timeout) || (Timeout == 0U))
660       {
661         /* Clear all the static flags */
662         __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
663         hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
664         hsd->State= HAL_SD_STATE_READY;
665         hsd->Context = SD_CONTEXT_NONE;
666         return HAL_TIMEOUT;
667       }
668     }
669 
670     /* Send stop transmission command in case of multiblock read */
671     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
672     {
673       if(hsd->SdCard.CardType != CARD_SECURED)
674       {
675         /* Send stop transmission command */
676         errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
677         if(errorstate != HAL_SD_ERROR_NONE)
678         {
679           /* Clear all the static flags */
680           __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
681           hsd->ErrorCode |= errorstate;
682           hsd->State = HAL_SD_STATE_READY;
683           hsd->Context = SD_CONTEXT_NONE;
684           return HAL_ERROR;
685         }
686       }
687     }
688 
689     /* Get error state */
690     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
691     {
692       /* Clear all the static flags */
693       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
694       hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
695       hsd->State = HAL_SD_STATE_READY;
696       hsd->Context = SD_CONTEXT_NONE;
697       return HAL_ERROR;
698     }
699     else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
700     {
701       /* Clear all the static flags */
702       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
703       hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
704       hsd->State = HAL_SD_STATE_READY;
705       hsd->Context = SD_CONTEXT_NONE;
706       return HAL_ERROR;
707     }
708     else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
709     {
710       /* Clear all the static flags */
711       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
712       hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
713       hsd->State = HAL_SD_STATE_READY;
714       hsd->Context = SD_CONTEXT_NONE;
715       return HAL_ERROR;
716     }
717     else
718     {
719       /* Nothing to do */
720     }
721 
722     /* Empty FIFO if there is still any data */
723     while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (dataremaining > 0U))
724     {
725       data = SDIO_ReadFIFO(hsd->Instance);
726       *tempbuff = (uint8_t)(data & 0xFFU);
727       tempbuff++;
728       dataremaining--;
729       *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
730       tempbuff++;
731       dataremaining--;
732       *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
733       tempbuff++;
734       dataremaining--;
735       *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
736       tempbuff++;
737       dataremaining--;
738 
739       if(((HAL_GetTick()-tickstart) >=  Timeout) || (Timeout == 0U))
740       {
741         /* Clear all the static flags */
742         __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
743         hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
744         hsd->State= HAL_SD_STATE_READY;
745         hsd->Context = SD_CONTEXT_NONE;
746         return HAL_ERROR;
747       }
748     }
749 
750     /* Clear all the static flags */
751     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
752 
753     hsd->State = HAL_SD_STATE_READY;
754 
755     return HAL_OK;
756   }
757   else
758   {
759     hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
760     return HAL_ERROR;
761   }
762 }
763 
764 /**
765   * @brief  Allows to write block(s) to a specified address in a card. The Data
766   *         transfer is managed by polling mode.
767   * @note   This API should be followed by a check on the card state through
768   *         HAL_SD_GetCardState().
769   * @param  hsd: Pointer to SD handle
770   * @param  pData: pointer to the buffer that will contain the data to transmit
771   * @param  BlockAdd: Block Address where data will be written
772   * @param  NumberOfBlocks: Number of SD blocks to write
773   * @param  Timeout: Specify timeout value
774   * @retval HAL status
775   */
HAL_SD_WriteBlocks(SD_HandleTypeDef * hsd,uint8_t * pData,uint32_t BlockAdd,uint32_t NumberOfBlocks,uint32_t Timeout)776 HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)
777 {
778   SDIO_DataInitTypeDef config;
779   uint32_t errorstate;
780   uint32_t tickstart = HAL_GetTick();
781   uint32_t count, data, dataremaining;
782   uint32_t add = BlockAdd;
783   uint8_t *tempbuff = pData;
784 
785   if(NULL == pData)
786   {
787     hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
788     return HAL_ERROR;
789   }
790 
791   if(hsd->State == HAL_SD_STATE_READY)
792   {
793     hsd->ErrorCode = HAL_SD_ERROR_NONE;
794 
795     if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
796     {
797       hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
798       return HAL_ERROR;
799     }
800 
801     hsd->State = HAL_SD_STATE_BUSY;
802 
803     /* Initialize data control register */
804     hsd->Instance->DCTRL = 0U;
805 
806     if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
807     {
808       add *= 512U;
809     }
810 
811     /* Configure the SD DPSM (Data Path State Machine) */
812     config.DataTimeOut   = SDMMC_DATATIMEOUT;
813     config.DataLength    = NumberOfBlocks * BLOCKSIZE;
814     config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
815     config.TransferDir   = SDIO_TRANSFER_DIR_TO_CARD;
816     config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
817     config.DPSM          = SDIO_DPSM_ENABLE;
818     (void)SDIO_ConfigData(hsd->Instance, &config);
819 
820     /* Write Blocks in Polling mode */
821     if(NumberOfBlocks > 1U)
822     {
823       hsd->Context = SD_CONTEXT_WRITE_MULTIPLE_BLOCK;
824 
825       /* Write Multi Block command */
826       errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
827     }
828     else
829     {
830       hsd->Context = SD_CONTEXT_WRITE_SINGLE_BLOCK;
831 
832       /* Write Single Block command */
833       errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
834     }
835     if(errorstate != HAL_SD_ERROR_NONE)
836     {
837       /* Clear all the static flags */
838       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
839       hsd->ErrorCode |= errorstate;
840       hsd->State = HAL_SD_STATE_READY;
841       hsd->Context = SD_CONTEXT_NONE;
842       return HAL_ERROR;
843     }
844 
845     /* Write block(s) in polling mode */
846     dataremaining = config.DataLength;
847     while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
848     {
849       if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE) && (dataremaining > 0U))
850       {
851         /* Write data to SDIO Tx FIFO */
852         for(count = 0U; count < 8U; count++)
853         {
854           data = (uint32_t)(*tempbuff);
855           tempbuff++;
856           dataremaining--;
857           data |= ((uint32_t)(*tempbuff) << 8U);
858           tempbuff++;
859           dataremaining--;
860           data |= ((uint32_t)(*tempbuff) << 16U);
861           tempbuff++;
862           dataremaining--;
863           data |= ((uint32_t)(*tempbuff) << 24U);
864           tempbuff++;
865           dataremaining--;
866           (void)SDIO_WriteFIFO(hsd->Instance, &data);
867         }
868       }
869 
870       if(((HAL_GetTick()-tickstart) >=  Timeout) || (Timeout == 0U))
871       {
872         /* Clear all the static flags */
873         __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
874         hsd->ErrorCode |= errorstate;
875         hsd->State = HAL_SD_STATE_READY;
876         hsd->Context = SD_CONTEXT_NONE;
877         return HAL_TIMEOUT;
878       }
879     }
880 
881     /* Send stop transmission command in case of multiblock write */
882     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1U))
883     {
884       if(hsd->SdCard.CardType != CARD_SECURED)
885       {
886         /* Send stop transmission command */
887         errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
888         if(errorstate != HAL_SD_ERROR_NONE)
889         {
890           /* Clear all the static flags */
891           __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
892           hsd->ErrorCode |= errorstate;
893           hsd->State = HAL_SD_STATE_READY;
894           hsd->Context = SD_CONTEXT_NONE;
895           return HAL_ERROR;
896         }
897       }
898     }
899 
900     /* Get error state */
901     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
902     {
903       /* Clear all the static flags */
904       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
905       hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
906       hsd->State = HAL_SD_STATE_READY;
907       hsd->Context = SD_CONTEXT_NONE;
908       return HAL_ERROR;
909     }
910     else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
911     {
912       /* Clear all the static flags */
913       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
914       hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
915       hsd->State = HAL_SD_STATE_READY;
916       hsd->Context = SD_CONTEXT_NONE;
917       return HAL_ERROR;
918     }
919     else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR))
920     {
921       /* Clear all the static flags */
922       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
923       hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
924       hsd->State = HAL_SD_STATE_READY;
925       hsd->Context = SD_CONTEXT_NONE;
926       return HAL_ERROR;
927     }
928     else
929     {
930       /* Nothing to do */
931     }
932 
933     /* Clear all the static flags */
934     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
935 
936     hsd->State = HAL_SD_STATE_READY;
937 
938     return HAL_OK;
939   }
940   else
941   {
942     hsd->ErrorCode |= HAL_SD_ERROR_BUSY;
943     return HAL_ERROR;
944   }
945 }
946 
947 /**
948   * @brief  Reads block(s) from a specified address in a card. The Data transfer
949   *         is managed in interrupt mode.
950   * @note   This API should be followed by a check on the card state through
951   *         HAL_SD_GetCardState().
952   * @note   You could also check the IT transfer process through the SD Rx
953   *         interrupt event.
954   * @param  hsd: Pointer to SD handle
955   * @param  pData: Pointer to the buffer that will contain the received data
956   * @param  BlockAdd: Block Address from where data is to be read
957   * @param  NumberOfBlocks: Number of blocks to read.
958   * @retval HAL status
959   */
HAL_SD_ReadBlocks_IT(SD_HandleTypeDef * hsd,uint8_t * pData,uint32_t BlockAdd,uint32_t NumberOfBlocks)960 HAL_StatusTypeDef HAL_SD_ReadBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
961 {
962   SDIO_DataInitTypeDef config;
963   uint32_t errorstate;
964   uint32_t add = BlockAdd;
965 
966   if(NULL == pData)
967   {
968     hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
969     return HAL_ERROR;
970   }
971 
972   if(hsd->State == HAL_SD_STATE_READY)
973   {
974     hsd->ErrorCode = HAL_SD_ERROR_NONE;
975 
976     if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
977     {
978       hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
979       return HAL_ERROR;
980     }
981 
982     hsd->State = HAL_SD_STATE_BUSY;
983 
984     /* Initialize data control register */
985     hsd->Instance->DCTRL = 0U;
986 
987     hsd->pRxBuffPtr = pData;
988     hsd->RxXferSize = BLOCKSIZE * NumberOfBlocks;
989 
990     __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND | SDIO_FLAG_RXFIFOHF));
991 
992     if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
993     {
994       add *= 512U;
995     }
996 
997     /* Configure the SD DPSM (Data Path State Machine) */
998     config.DataTimeOut   = SDMMC_DATATIMEOUT;
999     config.DataLength    = BLOCKSIZE * NumberOfBlocks;
1000     config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1001     config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
1002     config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
1003     config.DPSM          = SDIO_DPSM_ENABLE;
1004     (void)SDIO_ConfigData(hsd->Instance, &config);
1005 
1006     /* Read Blocks in IT mode */
1007     if(NumberOfBlocks > 1U)
1008     {
1009       hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_IT);
1010 
1011       /* Read Multi Block command */
1012       errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1013     }
1014     else
1015     {
1016       hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_IT);
1017 
1018       /* Read Single Block command */
1019       errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1020     }
1021     if(errorstate != HAL_SD_ERROR_NONE)
1022     {
1023       /* Clear all the static flags */
1024       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1025       hsd->ErrorCode |= errorstate;
1026       hsd->State = HAL_SD_STATE_READY;
1027       hsd->Context = SD_CONTEXT_NONE;
1028       return HAL_ERROR;
1029     }
1030 
1031     return HAL_OK;
1032   }
1033   else
1034   {
1035     return HAL_BUSY;
1036   }
1037 }
1038 
1039 /**
1040   * @brief  Writes block(s) to a specified address in a card. The Data transfer
1041   *         is managed in interrupt mode.
1042   * @note   This API should be followed by a check on the card state through
1043   *         HAL_SD_GetCardState().
1044   * @note   You could also check the IT transfer process through the SD Tx
1045   *         interrupt event.
1046   * @param  hsd: Pointer to SD handle
1047   * @param  pData: Pointer to the buffer that will contain the data to transmit
1048   * @param  BlockAdd: Block Address where data will be written
1049   * @param  NumberOfBlocks: Number of blocks to write
1050   * @retval HAL status
1051   */
HAL_SD_WriteBlocks_IT(SD_HandleTypeDef * hsd,uint8_t * pData,uint32_t BlockAdd,uint32_t NumberOfBlocks)1052 HAL_StatusTypeDef HAL_SD_WriteBlocks_IT(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1053 {
1054   SDIO_DataInitTypeDef config;
1055   uint32_t errorstate;
1056   uint32_t add = BlockAdd;
1057 
1058   if(NULL == pData)
1059   {
1060     hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1061     return HAL_ERROR;
1062   }
1063 
1064   if(hsd->State == HAL_SD_STATE_READY)
1065   {
1066     hsd->ErrorCode = HAL_SD_ERROR_NONE;
1067 
1068     if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1069     {
1070       hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1071       return HAL_ERROR;
1072     }
1073 
1074     hsd->State = HAL_SD_STATE_BUSY;
1075 
1076     /* Initialize data control register */
1077     hsd->Instance->DCTRL = 0U;
1078 
1079     hsd->pTxBuffPtr = pData;
1080     hsd->TxXferSize = BLOCKSIZE * NumberOfBlocks;
1081 
1082     /* Enable transfer interrupts */
1083     __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE));
1084 
1085     if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1086     {
1087       add *= 512U;
1088     }
1089 
1090     /* Write Blocks in Polling mode */
1091     if(NumberOfBlocks > 1U)
1092     {
1093       hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK| SD_CONTEXT_IT);
1094 
1095       /* Write Multi Block command */
1096       errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1097     }
1098     else
1099     {
1100       hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_IT);
1101 
1102       /* Write Single Block command */
1103       errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1104     }
1105     if(errorstate != HAL_SD_ERROR_NONE)
1106     {
1107       /* Clear all the static flags */
1108       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1109       hsd->ErrorCode |= errorstate;
1110       hsd->State = HAL_SD_STATE_READY;
1111       hsd->Context = SD_CONTEXT_NONE;
1112       return HAL_ERROR;
1113     }
1114 
1115     /* Configure the SD DPSM (Data Path State Machine) */
1116     config.DataTimeOut   = SDMMC_DATATIMEOUT;
1117     config.DataLength    = BLOCKSIZE * NumberOfBlocks;
1118     config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1119     config.TransferDir   = SDIO_TRANSFER_DIR_TO_CARD;
1120     config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
1121     config.DPSM          = SDIO_DPSM_ENABLE;
1122     (void)SDIO_ConfigData(hsd->Instance, &config);
1123 
1124     return HAL_OK;
1125   }
1126   else
1127   {
1128     return HAL_BUSY;
1129   }
1130 }
1131 
1132 /**
1133   * @brief  Reads block(s) from a specified address in a card. The Data transfer
1134   *         is managed by DMA mode.
1135   * @note   This API should be followed by a check on the card state through
1136   *         HAL_SD_GetCardState().
1137   * @note   You could also check the DMA transfer process through the SD Rx
1138   *         interrupt event.
1139   * @param  hsd: Pointer SD handle
1140   * @param  pData: Pointer to the buffer that will contain the received data
1141   * @param  BlockAdd: Block Address from where data is to be read
1142   * @param  NumberOfBlocks: Number of blocks to read.
1143   * @retval HAL status
1144   */
HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef * hsd,uint8_t * pData,uint32_t BlockAdd,uint32_t NumberOfBlocks)1145 HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1146 {
1147   SDIO_DataInitTypeDef config;
1148   uint32_t errorstate;
1149   uint32_t add = BlockAdd;
1150 
1151   if(NULL == pData)
1152   {
1153     hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1154     return HAL_ERROR;
1155   }
1156 
1157   if(hsd->State == HAL_SD_STATE_READY)
1158   {
1159     hsd->ErrorCode = HAL_SD_ERROR_NONE;
1160 
1161     if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1162     {
1163       hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1164       return HAL_ERROR;
1165     }
1166 
1167     hsd->State = HAL_SD_STATE_BUSY;
1168 
1169     /* Initialize data control register */
1170     hsd->Instance->DCTRL = 0U;
1171 
1172     __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1173 
1174     /* Set the DMA transfer complete callback */
1175     hsd->hdmarx->XferCpltCallback = SD_DMAReceiveCplt;
1176 
1177     /* Set the DMA error callback */
1178     hsd->hdmarx->XferErrorCallback = SD_DMAError;
1179 
1180     /* Set the DMA Abort callback */
1181     hsd->hdmarx->XferAbortCallback = NULL;
1182 
1183     /* Force DMA Direction */
1184     hsd->hdmarx->Init.Direction = DMA_PERIPH_TO_MEMORY;
1185     MODIFY_REG(hsd->hdmarx->Instance->CCR, DMA_CCR_DIR, hsd->hdmarx->Init.Direction);
1186 
1187     /* Enable the DMA Channel */
1188     if(HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) != HAL_OK)
1189     {
1190       __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_RXOVERR | SDIO_IT_DATAEND));
1191       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1192       hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1193       hsd->State = HAL_SD_STATE_READY;
1194       return HAL_ERROR;
1195     }
1196     else
1197     {
1198       /* Enable SD DMA transfer */
1199       __HAL_SD_DMA_ENABLE(hsd);
1200 
1201       if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1202       {
1203         add *= 512U;
1204       }
1205 
1206       /* Configure the SD DPSM (Data Path State Machine) */
1207       config.DataTimeOut   = SDMMC_DATATIMEOUT;
1208       config.DataLength    = BLOCKSIZE * NumberOfBlocks;
1209       config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1210       config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
1211       config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
1212       config.DPSM          = SDIO_DPSM_ENABLE;
1213       (void)SDIO_ConfigData(hsd->Instance, &config);
1214 
1215       /* Read Blocks in DMA mode */
1216       if(NumberOfBlocks > 1U)
1217       {
1218         hsd->Context = (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1219 
1220         /* Read Multi Block command */
1221         errorstate = SDMMC_CmdReadMultiBlock(hsd->Instance, add);
1222       }
1223       else
1224       {
1225         hsd->Context = (SD_CONTEXT_READ_SINGLE_BLOCK | SD_CONTEXT_DMA);
1226 
1227         /* Read Single Block command */
1228         errorstate = SDMMC_CmdReadSingleBlock(hsd->Instance, add);
1229       }
1230       if(errorstate != HAL_SD_ERROR_NONE)
1231       {
1232         /* Clear all the static flags */
1233         __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1234         hsd->ErrorCode |= errorstate;
1235         hsd->State = HAL_SD_STATE_READY;
1236         hsd->Context = SD_CONTEXT_NONE;
1237         return HAL_ERROR;
1238       }
1239 
1240       return HAL_OK;
1241     }
1242   }
1243   else
1244   {
1245     return HAL_BUSY;
1246   }
1247 }
1248 
1249 /**
1250   * @brief  Writes block(s) to a specified address in a card. The Data transfer
1251   *         is managed by DMA mode.
1252   * @note   This API should be followed by a check on the card state through
1253   *         HAL_SD_GetCardState().
1254   * @note   You could also check the DMA transfer process through the SD Tx
1255   *         interrupt event.
1256   * @param  hsd: Pointer to SD handle
1257   * @param  pData: Pointer to the buffer that will contain the data to transmit
1258   * @param  BlockAdd: Block Address where data will be written
1259   * @param  NumberOfBlocks: Number of blocks to write
1260   * @retval HAL status
1261   */
HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef * hsd,uint8_t * pData,uint32_t BlockAdd,uint32_t NumberOfBlocks)1262 HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
1263 {
1264   SDIO_DataInitTypeDef config;
1265   uint32_t errorstate;
1266   uint32_t add = BlockAdd;
1267 
1268   if(NULL == pData)
1269   {
1270     hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1271     return HAL_ERROR;
1272   }
1273 
1274   if(hsd->State == HAL_SD_STATE_READY)
1275   {
1276     hsd->ErrorCode = HAL_SD_ERROR_NONE;
1277 
1278     if((add + NumberOfBlocks) > (hsd->SdCard.LogBlockNbr))
1279     {
1280       hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1281       return HAL_ERROR;
1282     }
1283 
1284     hsd->State = HAL_SD_STATE_BUSY;
1285 
1286     /* Initialize data control register */
1287     hsd->Instance->DCTRL = 0U;
1288 
1289     /* Enable SD Error interrupts */
1290     __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1291 
1292     /* Set the DMA transfer complete callback */
1293     hsd->hdmatx->XferCpltCallback = SD_DMATransmitCplt;
1294 
1295     /* Set the DMA error callback */
1296     hsd->hdmatx->XferErrorCallback = SD_DMAError;
1297 
1298     /* Set the DMA Abort callback */
1299     hsd->hdmatx->XferAbortCallback = NULL;
1300 
1301     if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1302     {
1303       add *= 512U;
1304     }
1305 
1306     /* Write Blocks in Polling mode */
1307     if(NumberOfBlocks > 1U)
1308     {
1309       hsd->Context = (SD_CONTEXT_WRITE_MULTIPLE_BLOCK | SD_CONTEXT_DMA);
1310 
1311       /* Write Multi Block command */
1312       errorstate = SDMMC_CmdWriteMultiBlock(hsd->Instance, add);
1313     }
1314     else
1315     {
1316       hsd->Context = (SD_CONTEXT_WRITE_SINGLE_BLOCK | SD_CONTEXT_DMA);
1317 
1318       /* Write Single Block command */
1319       errorstate = SDMMC_CmdWriteSingleBlock(hsd->Instance, add);
1320     }
1321     if(errorstate != HAL_SD_ERROR_NONE)
1322     {
1323       /* Clear all the static flags */
1324       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1325       hsd->ErrorCode |= errorstate;
1326       hsd->State = HAL_SD_STATE_READY;
1327       hsd->Context = SD_CONTEXT_NONE;
1328       return HAL_ERROR;
1329     }
1330 
1331     /* Enable SDIO DMA transfer */
1332     __HAL_SD_DMA_ENABLE(hsd);
1333 
1334     /* Force DMA Direction */
1335     hsd->hdmatx->Init.Direction = DMA_MEMORY_TO_PERIPH;
1336     MODIFY_REG(hsd->hdmatx->Instance->CCR, DMA_CCR_DIR, hsd->hdmatx->Init.Direction);
1337 
1338     /* Enable the DMA Channel */
1339     if(HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pData, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4U) != HAL_OK)
1340     {
1341       __HAL_SD_DISABLE_IT(hsd, (SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_TXUNDERR));
1342       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1343       hsd->ErrorCode |= HAL_SD_ERROR_DMA;
1344       hsd->State = HAL_SD_STATE_READY;
1345       hsd->Context = SD_CONTEXT_NONE;
1346       return HAL_ERROR;
1347     }
1348     else
1349     {
1350       /* Configure the SD DPSM (Data Path State Machine) */
1351       config.DataTimeOut   = SDMMC_DATATIMEOUT;
1352       config.DataLength    = BLOCKSIZE * NumberOfBlocks;
1353       config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1354       config.TransferDir   = SDIO_TRANSFER_DIR_TO_CARD;
1355       config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
1356       config.DPSM          = SDIO_DPSM_ENABLE;
1357       (void)SDIO_ConfigData(hsd->Instance, &config);
1358 
1359       return HAL_OK;
1360     }
1361   }
1362   else
1363   {
1364     return HAL_BUSY;
1365   }
1366 }
1367 
1368 /**
1369   * @brief  Erases the specified memory area of the given SD card.
1370   * @note   This API should be followed by a check on the card state through
1371   *         HAL_SD_GetCardState().
1372   * @param  hsd: Pointer to SD handle
1373   * @param  BlockStartAdd: Start Block address
1374   * @param  BlockEndAdd: End Block address
1375   * @retval HAL status
1376   */
HAL_SD_Erase(SD_HandleTypeDef * hsd,uint32_t BlockStartAdd,uint32_t BlockEndAdd)1377 HAL_StatusTypeDef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint32_t BlockStartAdd, uint32_t BlockEndAdd)
1378 {
1379   uint32_t errorstate;
1380   uint32_t start_add = BlockStartAdd;
1381   uint32_t end_add = BlockEndAdd;
1382 
1383   if(hsd->State == HAL_SD_STATE_READY)
1384   {
1385     hsd->ErrorCode = HAL_SD_ERROR_NONE;
1386 
1387     if(end_add < start_add)
1388     {
1389       hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
1390       return HAL_ERROR;
1391     }
1392 
1393     if(end_add > (hsd->SdCard.LogBlockNbr))
1394     {
1395       hsd->ErrorCode |= HAL_SD_ERROR_ADDR_OUT_OF_RANGE;
1396       return HAL_ERROR;
1397     }
1398 
1399     hsd->State = HAL_SD_STATE_BUSY;
1400 
1401     /* Check if the card command class supports erase command */
1402     if(((hsd->SdCard.Class) & SDIO_CCCC_ERASE) == 0U)
1403     {
1404       /* Clear all the static flags */
1405       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1406       hsd->ErrorCode |= HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
1407       hsd->State = HAL_SD_STATE_READY;
1408       return HAL_ERROR;
1409     }
1410 
1411     if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
1412     {
1413       /* Clear all the static flags */
1414       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1415       hsd->ErrorCode |= HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
1416       hsd->State = HAL_SD_STATE_READY;
1417       return HAL_ERROR;
1418     }
1419 
1420     /* Get start and end block for high capacity cards */
1421     if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
1422     {
1423       start_add *= 512U;
1424       end_add   *= 512U;
1425     }
1426 
1427     /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
1428     if(hsd->SdCard.CardType != CARD_SECURED)
1429     {
1430       /* Send CMD32 SD_ERASE_GRP_START with argument as addr  */
1431       errorstate = SDMMC_CmdSDEraseStartAdd(hsd->Instance, start_add);
1432       if(errorstate != HAL_SD_ERROR_NONE)
1433       {
1434         /* Clear all the static flags */
1435         __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1436         hsd->ErrorCode |= errorstate;
1437         hsd->State = HAL_SD_STATE_READY;
1438         return HAL_ERROR;
1439       }
1440 
1441       /* Send CMD33 SD_ERASE_GRP_END with argument as addr  */
1442       errorstate = SDMMC_CmdSDEraseEndAdd(hsd->Instance, end_add);
1443       if(errorstate != HAL_SD_ERROR_NONE)
1444       {
1445         /* Clear all the static flags */
1446         __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1447         hsd->ErrorCode |= errorstate;
1448         hsd->State = HAL_SD_STATE_READY;
1449         return HAL_ERROR;
1450       }
1451     }
1452 
1453     /* Send CMD38 ERASE */
1454     errorstate = SDMMC_CmdErase(hsd->Instance);
1455     if(errorstate != HAL_SD_ERROR_NONE)
1456     {
1457       /* Clear all the static flags */
1458       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1459       hsd->ErrorCode |= errorstate;
1460       hsd->State = HAL_SD_STATE_READY;
1461       return HAL_ERROR;
1462     }
1463 
1464     hsd->State = HAL_SD_STATE_READY;
1465 
1466     return HAL_OK;
1467   }
1468   else
1469   {
1470     return HAL_BUSY;
1471   }
1472 }
1473 
1474 /**
1475   * @brief  This function handles SD card interrupt request.
1476   * @param  hsd: Pointer to SD handle
1477   * @retval None
1478   */
HAL_SD_IRQHandler(SD_HandleTypeDef * hsd)1479 void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
1480 {
1481   uint32_t errorstate;
1482   uint32_t context = hsd->Context;
1483 
1484   /* Check for SDIO interrupt flags */
1485   if((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1486   {
1487     SD_Read_IT(hsd);
1488   }
1489 
1490   else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DATAEND) != RESET)
1491   {
1492     __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DATAEND);
1493 
1494     __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND  | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1495                              SDIO_IT_TXUNDERR | SDIO_IT_RXOVERR  | SDIO_IT_TXFIFOHE |\
1496                              SDIO_IT_RXFIFOHF);
1497 
1498     hsd->Instance->DCTRL &= ~(SDIO_DCTRL_DTEN);
1499 
1500     if((context & SD_CONTEXT_IT) != 0U)
1501     {
1502       if(((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1503       {
1504         errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1505         if(errorstate != HAL_SD_ERROR_NONE)
1506         {
1507           hsd->ErrorCode |= errorstate;
1508 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1509           hsd->ErrorCallback(hsd);
1510 #else
1511           HAL_SD_ErrorCallback(hsd);
1512 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1513         }
1514       }
1515 
1516       /* Clear all the static flags */
1517       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
1518 
1519       hsd->State = HAL_SD_STATE_READY;
1520       hsd->Context = SD_CONTEXT_NONE;
1521       if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1522       {
1523 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1524         hsd->RxCpltCallback(hsd);
1525 #else
1526         HAL_SD_RxCpltCallback(hsd);
1527 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1528       }
1529       else
1530       {
1531 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1532         hsd->TxCpltCallback(hsd);
1533 #else
1534         HAL_SD_TxCpltCallback(hsd);
1535 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1536       }
1537     }
1538     else if((context & SD_CONTEXT_DMA) != 0U)
1539     {
1540       if((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U)
1541       {
1542         errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
1543         if(errorstate != HAL_SD_ERROR_NONE)
1544         {
1545           hsd->ErrorCode |= errorstate;
1546 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1547           hsd->ErrorCallback(hsd);
1548 #else
1549           HAL_SD_ErrorCallback(hsd);
1550 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1551         }
1552       }
1553       if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) == 0U) && ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) == 0U))
1554       {
1555         /* Disable the DMA transfer for transmit request by setting the DMAEN bit
1556         in the SD DCTRL register */
1557         hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
1558 
1559         hsd->State = HAL_SD_STATE_READY;
1560 
1561 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1562         hsd->TxCpltCallback(hsd);
1563 #else
1564         HAL_SD_TxCpltCallback(hsd);
1565 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1566       }
1567     }
1568     else
1569     {
1570       /* Nothing to do */
1571     }
1572   }
1573 
1574   else if((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE) != RESET) && ((context & SD_CONTEXT_IT) != 0U))
1575   {
1576     SD_Write_IT(hsd);
1577   }
1578 
1579   else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_RXOVERR | SDIO_FLAG_TXUNDERR) != RESET)
1580   {
1581     /* Set Error code */
1582     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL) != RESET)
1583     {
1584       hsd->ErrorCode |= HAL_SD_ERROR_DATA_CRC_FAIL;
1585     }
1586     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) != RESET)
1587     {
1588       hsd->ErrorCode |= HAL_SD_ERROR_DATA_TIMEOUT;
1589     }
1590     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR) != RESET)
1591     {
1592       hsd->ErrorCode |= HAL_SD_ERROR_RX_OVERRUN;
1593     }
1594     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR) != RESET)
1595     {
1596       hsd->ErrorCode |= HAL_SD_ERROR_TX_UNDERRUN;
1597     }
1598 
1599     /* Clear All flags */
1600     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS | SDIO_FLAG_STBITERR);
1601 
1602     /* Disable all interrupts */
1603     __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
1604                              SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR | SDIO_IT_STBITERR);
1605 
1606     hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
1607 
1608     if((context & SD_CONTEXT_IT) != 0U)
1609     {
1610       /* Set the SD state to ready to be able to start again the process */
1611       hsd->State = HAL_SD_STATE_READY;
1612       hsd->Context = SD_CONTEXT_NONE;
1613 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1614       hsd->ErrorCallback(hsd);
1615 #else
1616       HAL_SD_ErrorCallback(hsd);
1617 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1618     }
1619     else if((context & SD_CONTEXT_DMA) != 0U)
1620     {
1621       /* Abort the SD DMA channel */
1622       if(((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
1623       {
1624         /* Set the DMA Tx abort callback */
1625         hsd->hdmatx->XferAbortCallback = SD_DMATxAbort;
1626         /* Abort DMA in IT mode */
1627         if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK)
1628         {
1629           SD_DMATxAbort(hsd->hdmatx);
1630         }
1631       }
1632       else if(((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
1633       {
1634         /* Set the DMA Rx abort callback */
1635         hsd->hdmarx->XferAbortCallback = SD_DMARxAbort;
1636         /* Abort DMA in IT mode */
1637         if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)
1638         {
1639           SD_DMARxAbort(hsd->hdmarx);
1640         }
1641       }
1642       else
1643       {
1644         hsd->ErrorCode = HAL_SD_ERROR_NONE;
1645         hsd->State = HAL_SD_STATE_READY;
1646         hsd->Context = SD_CONTEXT_NONE;
1647 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1648         hsd->AbortCpltCallback(hsd);
1649 #else
1650         HAL_SD_AbortCallback(hsd);
1651 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1652       }
1653     }
1654     else
1655     {
1656       /* Nothing to do */
1657     }
1658   }
1659   else
1660   {
1661     /* Nothing to do */
1662   }
1663 }
1664 
1665 /**
1666   * @brief return the SD state
1667   * @param hsd: Pointer to sd handle
1668   * @retval HAL state
1669   */
HAL_SD_GetState(SD_HandleTypeDef * hsd)1670 HAL_SD_StateTypeDef HAL_SD_GetState(SD_HandleTypeDef *hsd)
1671 {
1672   return hsd->State;
1673 }
1674 
1675 /**
1676 * @brief  Return the SD error code
1677 * @param  hsd : Pointer to a SD_HandleTypeDef structure that contains
1678   *              the configuration information.
1679 * @retval SD Error Code
1680 */
HAL_SD_GetError(SD_HandleTypeDef * hsd)1681 uint32_t HAL_SD_GetError(SD_HandleTypeDef *hsd)
1682 {
1683   return hsd->ErrorCode;
1684 }
1685 
1686 /**
1687   * @brief Tx Transfer completed callbacks
1688   * @param hsd: Pointer to SD handle
1689   * @retval None
1690   */
HAL_SD_TxCpltCallback(SD_HandleTypeDef * hsd)1691 __weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
1692 {
1693   /* Prevent unused argument(s) compilation warning */
1694   UNUSED(hsd);
1695 
1696   /* NOTE : This function should not be modified, when the callback is needed,
1697             the HAL_SD_TxCpltCallback can be implemented in the user file
1698    */
1699 }
1700 
1701 /**
1702   * @brief Rx Transfer completed callbacks
1703   * @param hsd: Pointer SD handle
1704   * @retval None
1705   */
HAL_SD_RxCpltCallback(SD_HandleTypeDef * hsd)1706 __weak void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
1707 {
1708   /* Prevent unused argument(s) compilation warning */
1709   UNUSED(hsd);
1710 
1711   /* NOTE : This function should not be modified, when the callback is needed,
1712             the HAL_SD_RxCpltCallback can be implemented in the user file
1713    */
1714 }
1715 
1716 /**
1717   * @brief SD error callbacks
1718   * @param hsd: Pointer SD handle
1719   * @retval None
1720   */
HAL_SD_ErrorCallback(SD_HandleTypeDef * hsd)1721 __weak void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
1722 {
1723   /* Prevent unused argument(s) compilation warning */
1724   UNUSED(hsd);
1725 
1726   /* NOTE : This function should not be modified, when the callback is needed,
1727             the HAL_SD_ErrorCallback can be implemented in the user file
1728    */
1729 }
1730 
1731 /**
1732   * @brief SD Abort callbacks
1733   * @param hsd: Pointer SD handle
1734   * @retval None
1735   */
HAL_SD_AbortCallback(SD_HandleTypeDef * hsd)1736 __weak void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
1737 {
1738   /* Prevent unused argument(s) compilation warning */
1739   UNUSED(hsd);
1740 
1741   /* NOTE : This function should not be modified, when the callback is needed,
1742             the HAL_SD_AbortCallback can be implemented in the user file
1743    */
1744 }
1745 
1746 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
1747 /**
1748   * @brief  Register a User SD Callback
1749   *         To be used instead of the weak (surcharged) predefined callback
1750   * @param hsd : SD handle
1751   * @param CallbackID : ID of the callback to be registered
1752   *        This parameter can be one of the following values:
1753   *          @arg @ref HAL_SD_TX_CPLT_CB_ID    SD Tx Complete Callback ID
1754   *          @arg @ref HAL_SD_RX_CPLT_CB_ID    SD Rx Complete Callback ID
1755   *          @arg @ref HAL_SD_ERROR_CB_ID      SD Error Callback ID
1756   *          @arg @ref HAL_SD_ABORT_CB_ID      SD Abort Callback ID
1757   *          @arg @ref HAL_SD_MSP_INIT_CB_ID   SD MspInit Callback ID
1758   *          @arg @ref HAL_SD_MSP_DEINIT_CB_ID SD MspDeInit Callback ID
1759   * @param pCallback : pointer to the Callback function
1760   * @retval status
1761   */
HAL_SD_RegisterCallback(SD_HandleTypeDef * hsd,HAL_SD_CallbackIDTypeDef CallbackID,pSD_CallbackTypeDef pCallback)1762 HAL_StatusTypeDef HAL_SD_RegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID, pSD_CallbackTypeDef pCallback)
1763 {
1764   HAL_StatusTypeDef status = HAL_OK;
1765 
1766   if(pCallback == NULL)
1767   {
1768     /* Update the error code */
1769     hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1770     return HAL_ERROR;
1771   }
1772 
1773   /* Process locked */
1774   __HAL_LOCK(hsd);
1775 
1776   if(hsd->State == HAL_SD_STATE_READY)
1777   {
1778     switch (CallbackID)
1779     {
1780     case HAL_SD_TX_CPLT_CB_ID :
1781       hsd->TxCpltCallback = pCallback;
1782       break;
1783     case HAL_SD_RX_CPLT_CB_ID :
1784       hsd->RxCpltCallback = pCallback;
1785       break;
1786     case HAL_SD_ERROR_CB_ID :
1787       hsd->ErrorCallback = pCallback;
1788       break;
1789     case HAL_SD_ABORT_CB_ID :
1790       hsd->AbortCpltCallback = pCallback;
1791       break;
1792     case HAL_SD_MSP_INIT_CB_ID :
1793       hsd->MspInitCallback = pCallback;
1794       break;
1795     case HAL_SD_MSP_DEINIT_CB_ID :
1796       hsd->MspDeInitCallback = pCallback;
1797       break;
1798     default :
1799       /* Update the error code */
1800       hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1801       /* update return status */
1802       status =  HAL_ERROR;
1803       break;
1804     }
1805   }
1806   else if (hsd->State == HAL_SD_STATE_RESET)
1807   {
1808     switch (CallbackID)
1809     {
1810     case HAL_SD_MSP_INIT_CB_ID :
1811       hsd->MspInitCallback = pCallback;
1812       break;
1813     case HAL_SD_MSP_DEINIT_CB_ID :
1814       hsd->MspDeInitCallback = pCallback;
1815       break;
1816     default :
1817       /* Update the error code */
1818       hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1819       /* update return status */
1820       status =  HAL_ERROR;
1821       break;
1822     }
1823   }
1824   else
1825   {
1826     /* Update the error code */
1827     hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1828     /* update return status */
1829     status =  HAL_ERROR;
1830   }
1831 
1832   /* Release Lock */
1833   __HAL_UNLOCK(hsd);
1834   return status;
1835 }
1836 
1837 /**
1838   * @brief  Unregister a User SD Callback
1839   *         SD Callback is redirected to the weak (surcharged) predefined callback
1840   * @param hsd : SD handle
1841   * @param CallbackID : ID of the callback to be unregistered
1842   *        This parameter can be one of the following values:
1843   *          @arg @ref HAL_SD_TX_CPLT_CB_ID    SD Tx Complete Callback ID
1844   *          @arg @ref HAL_SD_RX_CPLT_CB_ID    SD Rx Complete Callback ID
1845   *          @arg @ref HAL_SD_ERROR_CB_ID      SD Error Callback ID
1846   *          @arg @ref HAL_SD_ABORT_CB_ID      SD Abort Callback ID
1847   *          @arg @ref HAL_SD_MSP_INIT_CB_ID   SD MspInit Callback ID
1848   *          @arg @ref HAL_SD_MSP_DEINIT_CB_ID SD MspDeInit Callback ID
1849   * @retval status
1850   */
HAL_SD_UnRegisterCallback(SD_HandleTypeDef * hsd,HAL_SD_CallbackIDTypeDef CallbackID)1851 HAL_StatusTypeDef HAL_SD_UnRegisterCallback(SD_HandleTypeDef *hsd, HAL_SD_CallbackIDTypeDef CallbackID)
1852 {
1853   HAL_StatusTypeDef status = HAL_OK;
1854 
1855   /* Process locked */
1856   __HAL_LOCK(hsd);
1857 
1858   if(hsd->State == HAL_SD_STATE_READY)
1859   {
1860     switch (CallbackID)
1861     {
1862     case HAL_SD_TX_CPLT_CB_ID :
1863       hsd->TxCpltCallback = HAL_SD_TxCpltCallback;
1864       break;
1865     case HAL_SD_RX_CPLT_CB_ID :
1866       hsd->RxCpltCallback = HAL_SD_RxCpltCallback;
1867       break;
1868     case HAL_SD_ERROR_CB_ID :
1869       hsd->ErrorCallback = HAL_SD_ErrorCallback;
1870       break;
1871     case HAL_SD_ABORT_CB_ID :
1872       hsd->AbortCpltCallback = HAL_SD_AbortCallback;
1873       break;
1874     case HAL_SD_MSP_INIT_CB_ID :
1875       hsd->MspInitCallback = HAL_SD_MspInit;
1876       break;
1877     case HAL_SD_MSP_DEINIT_CB_ID :
1878       hsd->MspDeInitCallback = HAL_SD_MspDeInit;
1879       break;
1880     default :
1881       /* Update the error code */
1882       hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1883       /* update return status */
1884       status =  HAL_ERROR;
1885       break;
1886     }
1887   }
1888   else if (hsd->State == HAL_SD_STATE_RESET)
1889   {
1890     switch (CallbackID)
1891     {
1892     case HAL_SD_MSP_INIT_CB_ID :
1893       hsd->MspInitCallback = HAL_SD_MspInit;
1894       break;
1895     case HAL_SD_MSP_DEINIT_CB_ID :
1896       hsd->MspDeInitCallback = HAL_SD_MspDeInit;
1897       break;
1898     default :
1899       /* Update the error code */
1900       hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1901       /* update return status */
1902       status =  HAL_ERROR;
1903       break;
1904     }
1905   }
1906   else
1907   {
1908     /* Update the error code */
1909     hsd->ErrorCode |= HAL_SD_ERROR_INVALID_CALLBACK;
1910     /* update return status */
1911     status =  HAL_ERROR;
1912   }
1913 
1914   /* Release Lock */
1915   __HAL_UNLOCK(hsd);
1916   return status;
1917 }
1918 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
1919 
1920 /**
1921   * @}
1922   */
1923 
1924 /** @addtogroup SD_Exported_Functions_Group3
1925  *  @brief   management functions
1926  *
1927 @verbatim
1928   ==============================================================================
1929                       ##### Peripheral Control functions #####
1930   ==============================================================================
1931   [..]
1932     This subsection provides a set of functions allowing to control the SD card
1933     operations and get the related information
1934 
1935 @endverbatim
1936   * @{
1937   */
1938 
1939 /**
1940   * @brief  Returns information the information of the card which are stored on
1941   *         the CID register.
1942   * @param  hsd: Pointer to SD handle
1943   * @param  pCID: Pointer to a HAL_SD_CardCIDTypeDef structure that
1944   *         contains all CID register parameters
1945   * @retval HAL status
1946   */
HAL_SD_GetCardCID(SD_HandleTypeDef * hsd,HAL_SD_CardCIDTypeDef * pCID)1947 HAL_StatusTypeDef HAL_SD_GetCardCID(SD_HandleTypeDef *hsd, HAL_SD_CardCIDTypeDef *pCID)
1948 {
1949   pCID->ManufacturerID = (uint8_t)((hsd->CID[0] & 0xFF000000U) >> 24U);
1950 
1951   pCID->OEM_AppliID = (uint16_t)((hsd->CID[0] & 0x00FFFF00U) >> 8U);
1952 
1953   pCID->ProdName1 = (((hsd->CID[0] & 0x000000FFU) << 24U) | ((hsd->CID[1] & 0xFFFFFF00U) >> 8U));
1954 
1955   pCID->ProdName2 = (uint8_t)(hsd->CID[1] & 0x000000FFU);
1956 
1957   pCID->ProdRev = (uint8_t)((hsd->CID[2] & 0xFF000000U) >> 24U);
1958 
1959   pCID->ProdSN = (((hsd->CID[2] & 0x00FFFFFFU) << 8U) | ((hsd->CID[3] & 0xFF000000U) >> 24U));
1960 
1961   pCID->Reserved1 = (uint8_t)((hsd->CID[3] & 0x00F00000U) >> 20U);
1962 
1963   pCID->ManufactDate = (uint16_t)((hsd->CID[3] & 0x000FFF00U) >> 8U);
1964 
1965   pCID->CID_CRC = (uint8_t)((hsd->CID[3] & 0x000000FEU) >> 1U);
1966 
1967   pCID->Reserved2 = 1U;
1968 
1969   return HAL_OK;
1970 }
1971 
1972 /**
1973   * @brief  Returns information the information of the card which are stored on
1974   *         the CSD register.
1975   * @param  hsd: Pointer to SD handle
1976   * @param  pCSD: Pointer to a HAL_SD_CardCSDTypeDef structure that
1977   *         contains all CSD register parameters
1978   * @retval HAL status
1979   */
HAL_SD_GetCardCSD(SD_HandleTypeDef * hsd,HAL_SD_CardCSDTypeDef * pCSD)1980 HAL_StatusTypeDef HAL_SD_GetCardCSD(SD_HandleTypeDef *hsd, HAL_SD_CardCSDTypeDef *pCSD)
1981 {
1982   pCSD->CSDStruct = (uint8_t)((hsd->CSD[0] & 0xC0000000U) >> 30U);
1983 
1984   pCSD->SysSpecVersion = (uint8_t)((hsd->CSD[0] & 0x3C000000U) >> 26U);
1985 
1986   pCSD->Reserved1 = (uint8_t)((hsd->CSD[0] & 0x03000000U) >> 24U);
1987 
1988   pCSD->TAAC = (uint8_t)((hsd->CSD[0] & 0x00FF0000U) >> 16U);
1989 
1990   pCSD->NSAC = (uint8_t)((hsd->CSD[0] & 0x0000FF00U) >> 8U);
1991 
1992   pCSD->MaxBusClkFrec = (uint8_t)(hsd->CSD[0] & 0x000000FFU);
1993 
1994   pCSD->CardComdClasses = (uint16_t)((hsd->CSD[1] & 0xFFF00000U) >> 20U);
1995 
1996   pCSD->RdBlockLen = (uint8_t)((hsd->CSD[1] & 0x000F0000U) >> 16U);
1997 
1998   pCSD->PartBlockRead   = (uint8_t)((hsd->CSD[1] & 0x00008000U) >> 15U);
1999 
2000   pCSD->WrBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00004000U) >> 14U);
2001 
2002   pCSD->RdBlockMisalign = (uint8_t)((hsd->CSD[1] & 0x00002000U) >> 13U);
2003 
2004   pCSD->DSRImpl = (uint8_t)((hsd->CSD[1] & 0x00001000U) >> 12U);
2005 
2006   pCSD->Reserved2 = 0U; /*!< Reserved */
2007 
2008   if(hsd->SdCard.CardType == CARD_SDSC)
2009   {
2010     pCSD->DeviceSize = (((hsd->CSD[1] & 0x000003FFU) << 2U) | ((hsd->CSD[2] & 0xC0000000U) >> 30U));
2011 
2012     pCSD->MaxRdCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x38000000U) >> 27U);
2013 
2014     pCSD->MaxRdCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x07000000U) >> 24U);
2015 
2016     pCSD->MaxWrCurrentVDDMin = (uint8_t)((hsd->CSD[2] & 0x00E00000U) >> 21U);
2017 
2018     pCSD->MaxWrCurrentVDDMax = (uint8_t)((hsd->CSD[2] & 0x001C0000U) >> 18U);
2019 
2020     pCSD->DeviceSizeMul = (uint8_t)((hsd->CSD[2] & 0x00038000U) >> 15U);
2021 
2022     hsd->SdCard.BlockNbr  = (pCSD->DeviceSize + 1U) ;
2023     hsd->SdCard.BlockNbr *= (1UL << ((pCSD->DeviceSizeMul & 0x07U) + 2U));
2024     hsd->SdCard.BlockSize = (1UL << (pCSD->RdBlockLen & 0x0FU));
2025 
2026     hsd->SdCard.LogBlockNbr =  (hsd->SdCard.BlockNbr) * ((hsd->SdCard.BlockSize) / 512U);
2027     hsd->SdCard.LogBlockSize = 512U;
2028   }
2029   else if(hsd->SdCard.CardType == CARD_SDHC_SDXC)
2030   {
2031     /* Byte 7 */
2032     pCSD->DeviceSize = (((hsd->CSD[1] & 0x0000003FU) << 16U) | ((hsd->CSD[2] & 0xFFFF0000U) >> 16U));
2033 
2034     hsd->SdCard.BlockNbr = ((pCSD->DeviceSize + 1U) * 1024U);
2035     hsd->SdCard.LogBlockNbr = hsd->SdCard.BlockNbr;
2036     hsd->SdCard.BlockSize = 512U;
2037     hsd->SdCard.LogBlockSize = hsd->SdCard.BlockSize;
2038   }
2039   else
2040   {
2041     /* Clear all the static flags */
2042     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2043     hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2044     hsd->State = HAL_SD_STATE_READY;
2045     return HAL_ERROR;
2046   }
2047 
2048   pCSD->EraseGrSize = (uint8_t)((hsd->CSD[2] & 0x00004000U) >> 14U);
2049 
2050   pCSD->EraseGrMul = (uint8_t)((hsd->CSD[2] & 0x00003F80U) >> 7U);
2051 
2052   pCSD->WrProtectGrSize = (uint8_t)(hsd->CSD[2] & 0x0000007FU);
2053 
2054   pCSD->WrProtectGrEnable = (uint8_t)((hsd->CSD[3] & 0x80000000U) >> 31U);
2055 
2056   pCSD->ManDeflECC = (uint8_t)((hsd->CSD[3] & 0x60000000U) >> 29U);
2057 
2058   pCSD->WrSpeedFact = (uint8_t)((hsd->CSD[3] & 0x1C000000U) >> 26U);
2059 
2060   pCSD->MaxWrBlockLen= (uint8_t)((hsd->CSD[3] & 0x03C00000U) >> 22U);
2061 
2062   pCSD->WriteBlockPaPartial = (uint8_t)((hsd->CSD[3] & 0x00200000U) >> 21U);
2063 
2064   pCSD->Reserved3 = 0;
2065 
2066   pCSD->ContentProtectAppli = (uint8_t)((hsd->CSD[3] & 0x00010000U) >> 16U);
2067 
2068   pCSD->FileFormatGroup = (uint8_t)((hsd->CSD[3] & 0x00008000U) >> 15U);
2069 
2070   pCSD->CopyFlag = (uint8_t)((hsd->CSD[3] & 0x00004000U) >> 14U);
2071 
2072   pCSD->PermWrProtect = (uint8_t)((hsd->CSD[3] & 0x00002000U) >> 13U);
2073 
2074   pCSD->TempWrProtect = (uint8_t)((hsd->CSD[3] & 0x00001000U) >> 12U);
2075 
2076   pCSD->FileFormat = (uint8_t)((hsd->CSD[3] & 0x00000C00U) >> 10U);
2077 
2078   pCSD->ECC= (uint8_t)((hsd->CSD[3] & 0x00000300U) >> 8U);
2079 
2080   pCSD->CSD_CRC = (uint8_t)((hsd->CSD[3] & 0x000000FEU) >> 1U);
2081 
2082   pCSD->Reserved4 = 1;
2083 
2084   return HAL_OK;
2085 }
2086 
2087 /**
2088   * @brief  Gets the SD status info.
2089   * @param  hsd: Pointer to SD handle
2090   * @param  pStatus: Pointer to the HAL_SD_CardStatusTypeDef structure that
2091   *         will contain the SD card status information
2092   * @retval HAL status
2093   */
HAL_SD_GetCardStatus(SD_HandleTypeDef * hsd,HAL_SD_CardStatusTypeDef * pStatus)2094 HAL_StatusTypeDef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypeDef *pStatus)
2095 {
2096   uint32_t sd_status[16];
2097   uint32_t errorstate;
2098   HAL_StatusTypeDef status = HAL_OK;
2099 
2100   errorstate = SD_SendSDStatus(hsd, sd_status);
2101   if(errorstate != HAL_SD_ERROR_NONE)
2102   {
2103     /* Clear all the static flags */
2104     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2105     hsd->ErrorCode |= errorstate;
2106     hsd->State = HAL_SD_STATE_READY;
2107     status = HAL_ERROR;
2108   }
2109   else
2110   {
2111     pStatus->DataBusWidth = (uint8_t)((sd_status[0] & 0xC0U) >> 6U);
2112 
2113     pStatus->SecuredMode = (uint8_t)((sd_status[0] & 0x20U) >> 5U);
2114 
2115     pStatus->CardType = (uint16_t)(((sd_status[0] & 0x00FF0000U) >> 8U) | ((sd_status[0] & 0xFF000000U) >> 24U));
2116 
2117     pStatus->ProtectedAreaSize = (((sd_status[1] & 0xFFU) << 24U)    | ((sd_status[1] & 0xFF00U) << 8U) |
2118                                   ((sd_status[1] & 0xFF0000U) >> 8U) | ((sd_status[1] & 0xFF000000U) >> 24U));
2119 
2120     pStatus->SpeedClass = (uint8_t)(sd_status[2] & 0xFFU);
2121 
2122     pStatus->PerformanceMove = (uint8_t)((sd_status[2] & 0xFF00U) >> 8U);
2123 
2124     pStatus->AllocationUnitSize = (uint8_t)((sd_status[2] & 0xF00000U) >> 20U);
2125 
2126     pStatus->EraseSize = (uint16_t)(((sd_status[2] & 0xFF000000U) >> 16U) | (sd_status[3] & 0xFFU));
2127 
2128     pStatus->EraseTimeout = (uint8_t)((sd_status[3] & 0xFC00U) >> 10U);
2129 
2130     pStatus->EraseOffset = (uint8_t)((sd_status[3] & 0x0300U) >> 8U);
2131   }
2132 
2133   /* Set Block Size for Card */
2134   errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2135   if(errorstate != HAL_SD_ERROR_NONE)
2136   {
2137     /* Clear all the static flags */
2138     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2139     hsd->ErrorCode = errorstate;
2140     hsd->State = HAL_SD_STATE_READY;
2141     status = HAL_ERROR;
2142   }
2143 
2144   return status;
2145 }
2146 
2147 /**
2148   * @brief  Gets the SD card info.
2149   * @param  hsd: Pointer to SD handle
2150   * @param  pCardInfo: Pointer to the HAL_SD_CardInfoTypeDef structure that
2151   *         will contain the SD card status information
2152   * @retval HAL status
2153   */
HAL_SD_GetCardInfo(SD_HandleTypeDef * hsd,HAL_SD_CardInfoTypeDef * pCardInfo)2154 HAL_StatusTypeDef HAL_SD_GetCardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypeDef *pCardInfo)
2155 {
2156   pCardInfo->CardType     = (uint32_t)(hsd->SdCard.CardType);
2157   pCardInfo->CardVersion  = (uint32_t)(hsd->SdCard.CardVersion);
2158   pCardInfo->Class        = (uint32_t)(hsd->SdCard.Class);
2159   pCardInfo->RelCardAdd   = (uint32_t)(hsd->SdCard.RelCardAdd);
2160   pCardInfo->BlockNbr     = (uint32_t)(hsd->SdCard.BlockNbr);
2161   pCardInfo->BlockSize    = (uint32_t)(hsd->SdCard.BlockSize);
2162   pCardInfo->LogBlockNbr  = (uint32_t)(hsd->SdCard.LogBlockNbr);
2163   pCardInfo->LogBlockSize = (uint32_t)(hsd->SdCard.LogBlockSize);
2164 
2165   return HAL_OK;
2166 }
2167 
2168 /**
2169   * @brief  Enables wide bus operation for the requested card if supported by
2170   *         card.
2171   * @param  hsd: Pointer to SD handle
2172   * @param  WideMode: Specifies the SD card wide bus mode
2173   *          This parameter can be one of the following values:
2174   *            @arg SDIO_BUS_WIDE_8B: 8-bit data transfer
2175   *            @arg SDIO_BUS_WIDE_4B: 4-bit data transfer
2176   *            @arg SDIO_BUS_WIDE_1B: 1-bit data transfer
2177   * @retval HAL status
2178   */
HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef * hsd,uint32_t WideMode)2179 HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
2180 {
2181   SDIO_InitTypeDef Init;
2182   uint32_t errorstate;
2183   HAL_StatusTypeDef status = HAL_OK;
2184 
2185   /* Check the parameters */
2186   assert_param(IS_SDIO_BUS_WIDE(WideMode));
2187 
2188   /* Change State */
2189   hsd->State = HAL_SD_STATE_BUSY;
2190 
2191   if(hsd->SdCard.CardType != CARD_SECURED)
2192   {
2193     if(WideMode == SDIO_BUS_WIDE_8B)
2194     {
2195       hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2196     }
2197     else if(WideMode == SDIO_BUS_WIDE_4B)
2198     {
2199       errorstate = SD_WideBus_Enable(hsd);
2200 
2201       hsd->ErrorCode |= errorstate;
2202     }
2203     else if(WideMode == SDIO_BUS_WIDE_1B)
2204     {
2205       errorstate = SD_WideBus_Disable(hsd);
2206 
2207       hsd->ErrorCode |= errorstate;
2208     }
2209     else
2210     {
2211       /* WideMode is not a valid argument*/
2212       hsd->ErrorCode |= HAL_SD_ERROR_PARAM;
2213     }
2214   }
2215   else
2216   {
2217     /* MMC Card does not support this feature */
2218     hsd->ErrorCode |= HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2219   }
2220 
2221   if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2222   {
2223     /* Clear all the static flags */
2224     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2225     hsd->State = HAL_SD_STATE_READY;
2226     status = HAL_ERROR;
2227   }
2228   else
2229   {
2230     /* Configure the SDIO peripheral */
2231     Init.ClockEdge           = hsd->Init.ClockEdge;
2232     Init.ClockBypass         = hsd->Init.ClockBypass;
2233     Init.ClockPowerSave      = hsd->Init.ClockPowerSave;
2234     Init.BusWide             = WideMode;
2235     Init.HardwareFlowControl = hsd->Init.HardwareFlowControl;
2236     Init.ClockDiv            = hsd->Init.ClockDiv;
2237     (void)SDIO_Init(hsd->Instance, Init);
2238   }
2239 
2240   /* Set Block Size for Card */
2241   errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
2242   if(errorstate != HAL_SD_ERROR_NONE)
2243   {
2244     /* Clear all the static flags */
2245     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2246     hsd->ErrorCode |= errorstate;
2247     status = HAL_ERROR;
2248   }
2249 
2250   /* Change State */
2251   hsd->State = HAL_SD_STATE_READY;
2252 
2253   return status;
2254 }
2255 
2256 /**
2257   * @brief  Gets the current sd card data state.
2258   * @param  hsd: pointer to SD handle
2259   * @retval Card state
2260   */
HAL_SD_GetCardState(SD_HandleTypeDef * hsd)2261 HAL_SD_CardStateTypeDef HAL_SD_GetCardState(SD_HandleTypeDef *hsd)
2262 {
2263   uint32_t cardstate;
2264   uint32_t errorstate;
2265   uint32_t resp1 = 0;
2266 
2267   errorstate = SD_SendStatus(hsd, &resp1);
2268   if(errorstate != HAL_SD_ERROR_NONE)
2269   {
2270     hsd->ErrorCode |= errorstate;
2271   }
2272 
2273   cardstate = ((resp1 >> 9U) & 0x0FU);
2274 
2275   return (HAL_SD_CardStateTypeDef)cardstate;
2276 }
2277 
2278 /**
2279   * @brief  Abort the current transfer and disable the SD.
2280   * @param  hsd: pointer to a SD_HandleTypeDef structure that contains
2281   *                the configuration information for SD module.
2282   * @retval HAL status
2283   */
HAL_SD_Abort(SD_HandleTypeDef * hsd)2284 HAL_StatusTypeDef HAL_SD_Abort(SD_HandleTypeDef *hsd)
2285 {
2286   HAL_SD_CardStateTypeDef CardState;
2287   uint32_t context = hsd->Context;
2288 
2289   /* DIsable All interrupts */
2290   __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2291                            SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2292 
2293   /* Clear All flags */
2294   __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2295 
2296   CLEAR_BIT(hsd->Instance->DCTRL, SDIO_DCTRL_DTEN);
2297 
2298   if ((context & SD_CONTEXT_DMA) != 0U)
2299   {
2300     /* Disable the SD DMA request */
2301     hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2302 
2303     /* Abort the SD DMA Tx channel */
2304     if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
2305     {
2306       if(HAL_DMA_Abort(hsd->hdmatx) != HAL_OK)
2307       {
2308         hsd->ErrorCode |= HAL_SD_ERROR_DMA;
2309       }
2310     }
2311     /* Abort the SD DMA Rx channel */
2312     else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
2313     {
2314       if(HAL_DMA_Abort(hsd->hdmarx) != HAL_OK)
2315       {
2316         hsd->ErrorCode |= HAL_SD_ERROR_DMA;
2317       }
2318     }
2319     else
2320     {
2321       /* Nothing to do */
2322     }
2323   }
2324 
2325   hsd->State = HAL_SD_STATE_READY;
2326 
2327   /* Initialize the SD operation */
2328   hsd->Context = SD_CONTEXT_NONE;
2329 
2330   CardState = HAL_SD_GetCardState(hsd);
2331   if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2332   {
2333     hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2334   }
2335   if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2336   {
2337     return HAL_ERROR;
2338   }
2339   return HAL_OK;
2340 }
2341 
2342 /**
2343   * @brief  Abort the current transfer and disable the SD (IT mode).
2344   * @param  hsd: pointer to a SD_HandleTypeDef structure that contains
2345   *                the configuration information for SD module.
2346   * @retval HAL status
2347   */
HAL_SD_Abort_IT(SD_HandleTypeDef * hsd)2348 HAL_StatusTypeDef HAL_SD_Abort_IT(SD_HandleTypeDef *hsd)
2349 {
2350   HAL_SD_CardStateTypeDef CardState;
2351   uint32_t context = hsd->Context;
2352 
2353   /* Disable All interrupts */
2354   __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2355                            SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2356 
2357   CLEAR_BIT(hsd->Instance->DCTRL, SDIO_DCTRL_DTEN);
2358 
2359   if ((context & SD_CONTEXT_DMA) != 0U)
2360   {
2361     /* Disable the SD DMA request */
2362     hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2363 
2364     /* Abort the SD DMA Tx channel */
2365     if (((context & SD_CONTEXT_WRITE_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_WRITE_MULTIPLE_BLOCK) != 0U))
2366     {
2367       hsd->hdmatx->XferAbortCallback = SD_DMATxAbort;
2368       if(HAL_DMA_Abort_IT(hsd->hdmatx) != HAL_OK)
2369       {
2370         hsd->hdmatx = NULL;
2371       }
2372     }
2373     /* Abort the SD DMA Rx channel */
2374     else if (((context & SD_CONTEXT_READ_SINGLE_BLOCK) != 0U) || ((context & SD_CONTEXT_READ_MULTIPLE_BLOCK) != 0U))
2375     {
2376       hsd->hdmarx->XferAbortCallback = SD_DMARxAbort;
2377       if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)
2378       {
2379         hsd->hdmarx = NULL;
2380       }
2381     }
2382     else
2383     {
2384       /* Nothing to do */
2385     }
2386   }
2387   /* No transfer ongoing on both DMA channels*/
2388   else
2389   {
2390     /* Clear All flags */
2391     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2392 
2393     CardState = HAL_SD_GetCardState(hsd);
2394     hsd->State = HAL_SD_STATE_READY;
2395     hsd->Context = SD_CONTEXT_NONE;
2396     if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2397     {
2398       hsd->ErrorCode = SDMMC_CmdStopTransfer(hsd->Instance);
2399     }
2400     if(hsd->ErrorCode != HAL_SD_ERROR_NONE)
2401     {
2402       return HAL_ERROR;
2403     }
2404     else
2405     {
2406 #if defined (USE_HAL_SD_REGISTER_CALLBACKS) && (USE_HAL_SD_REGISTER_CALLBACKS == 1U)
2407       hsd->AbortCpltCallback(hsd);
2408 #else
2409       HAL_SD_AbortCallback(hsd);
2410 #endif /* USE_HAL_SD_REGISTER_CALLBACKS */
2411     }
2412   }
2413 
2414   return HAL_OK;
2415 }
2416 
2417 /**
2418   * @}
2419   */
2420 
2421 /**
2422   * @}
2423   */
2424 
2425 /* Private function ----------------------------------------------------------*/
2426 /** @addtogroup SD_Private_Functions
2427   * @{
2428   */
2429 
2430 /**
2431   * @brief  DMA SD transmit process complete callback
2432   * @param  hdma: DMA handle
2433   * @retval None
2434   */
SD_DMATransmitCplt(DMA_HandleTypeDef * hdma)2435 static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
2436 {
2437   SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2438 
2439   /* Enable DATAEND Interrupt */
2440   __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DATAEND));
2441 }
2442 
2443 /**
2444   * @brief  DMA SD receive process complete callback
2445   * @param  hdma: DMA handle
2446   * @retval None
2447   */
SD_DMAReceiveCplt(DMA_HandleTypeDef * hdma)2448 static void SD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
2449 {
2450   SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2451   uint32_t errorstate;
2452 
2453   /* Send stop command in multiblock write */
2454   if(hsd->Context == (SD_CONTEXT_READ_MULTIPLE_BLOCK | SD_CONTEXT_DMA))
2455   {
2456     errorstate = SDMMC_CmdStopTransfer(hsd->Instance);
2457     if(errorstate != HAL_SD_ERROR_NONE)
2458     {
2459       hsd->ErrorCode |= errorstate;
2460 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2461       hsd->ErrorCallback(hsd);
2462 #else
2463       HAL_SD_ErrorCallback(hsd);
2464 #endif
2465     }
2466   }
2467 
2468   /* Disable the DMA transfer for transmit request by setting the DMAEN bit
2469   in the SD DCTRL register */
2470   hsd->Instance->DCTRL &= (uint32_t)~((uint32_t)SDIO_DCTRL_DMAEN);
2471 
2472   /* Clear all the static flags */
2473   __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2474 
2475   hsd->State = HAL_SD_STATE_READY;
2476   hsd->Context = SD_CONTEXT_NONE;
2477 
2478 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2479   hsd->RxCpltCallback(hsd);
2480 #else
2481   HAL_SD_RxCpltCallback(hsd);
2482 #endif
2483 }
2484 
2485 /**
2486   * @brief  DMA SD communication error callback
2487   * @param  hdma: DMA handle
2488   * @retval None
2489   */
SD_DMAError(DMA_HandleTypeDef * hdma)2490 static void SD_DMAError(DMA_HandleTypeDef *hdma)
2491 {
2492   SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2493   HAL_SD_CardStateTypeDef CardState;
2494   uint32_t RxErrorCode, TxErrorCode;
2495 
2496     RxErrorCode = hsd->hdmarx->ErrorCode;
2497     TxErrorCode = hsd->hdmatx->ErrorCode;
2498     if((RxErrorCode == HAL_DMA_ERROR_TE) || (TxErrorCode == HAL_DMA_ERROR_TE))
2499     {
2500       /* Clear All flags */
2501       __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2502 
2503       /* Disable All interrupts */
2504       __HAL_SD_DISABLE_IT(hsd, SDIO_IT_DATAEND | SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT|\
2505         SDIO_IT_TXUNDERR| SDIO_IT_RXOVERR);
2506 
2507       hsd->ErrorCode |= HAL_SD_ERROR_DMA;
2508       CardState = HAL_SD_GetCardState(hsd);
2509       if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2510       {
2511         hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2512       }
2513 
2514       hsd->State= HAL_SD_STATE_READY;
2515       hsd->Context = SD_CONTEXT_NONE;
2516     }
2517 
2518 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2519     hsd->ErrorCallback(hsd);
2520 #else
2521     HAL_SD_ErrorCallback(hsd);
2522 #endif
2523 }
2524 
2525 /**
2526   * @brief  DMA SD Tx Abort callback
2527   * @param  hdma: DMA handle
2528   * @retval None
2529   */
SD_DMATxAbort(DMA_HandleTypeDef * hdma)2530 static void SD_DMATxAbort(DMA_HandleTypeDef *hdma)
2531 {
2532   SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2533   HAL_SD_CardStateTypeDef CardState;
2534 
2535   /* Clear All flags */
2536   __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2537 
2538   CardState = HAL_SD_GetCardState(hsd);
2539   hsd->State = HAL_SD_STATE_READY;
2540   hsd->Context = SD_CONTEXT_NONE;
2541   if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2542   {
2543     hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2544   }
2545 
2546   if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
2547   {
2548 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2549     hsd->AbortCpltCallback(hsd);
2550 #else
2551     HAL_SD_AbortCallback(hsd);
2552 #endif
2553   }
2554   else
2555   {
2556 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2557     hsd->ErrorCallback(hsd);
2558 #else
2559     HAL_SD_ErrorCallback(hsd);
2560 #endif
2561   }
2562 }
2563 
2564 /**
2565   * @brief  DMA SD Rx Abort callback
2566   * @param  hdma: DMA handle
2567   * @retval None
2568   */
SD_DMARxAbort(DMA_HandleTypeDef * hdma)2569 static void SD_DMARxAbort(DMA_HandleTypeDef *hdma)
2570 {
2571   SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);
2572   HAL_SD_CardStateTypeDef CardState;
2573 
2574   /* Clear All flags */
2575   __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2576 
2577   CardState = HAL_SD_GetCardState(hsd);
2578   hsd->State = HAL_SD_STATE_READY;
2579   hsd->Context = SD_CONTEXT_NONE;
2580   if((CardState == HAL_SD_CARD_RECEIVING) || (CardState == HAL_SD_CARD_SENDING))
2581   {
2582     hsd->ErrorCode |= SDMMC_CmdStopTransfer(hsd->Instance);
2583   }
2584 
2585   if(hsd->ErrorCode == HAL_SD_ERROR_NONE)
2586   {
2587 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2588     hsd->AbortCpltCallback(hsd);
2589 #else
2590     HAL_SD_AbortCallback(hsd);
2591 #endif
2592   }
2593   else
2594   {
2595 #if (USE_HAL_SD_REGISTER_CALLBACKS == 1)
2596     hsd->ErrorCallback(hsd);
2597 #else
2598     HAL_SD_ErrorCallback(hsd);
2599 #endif
2600   }
2601 }
2602 
2603 /**
2604   * @brief  Initializes the sd card.
2605   * @param  hsd: Pointer to SD handle
2606   * @retval SD Card error state
2607   */
SD_InitCard(SD_HandleTypeDef * hsd)2608 static uint32_t SD_InitCard(SD_HandleTypeDef *hsd)
2609 {
2610   HAL_SD_CardCSDTypeDef CSD;
2611   uint32_t errorstate;
2612   uint16_t sd_rca = 1U;
2613 
2614   /* Check the power State */
2615   if(SDIO_GetPowerState(hsd->Instance) == 0U)
2616   {
2617     /* Power off */
2618     return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
2619   }
2620 
2621   if(hsd->SdCard.CardType != CARD_SECURED)
2622   {
2623     /* Send CMD2 ALL_SEND_CID */
2624     errorstate = SDMMC_CmdSendCID(hsd->Instance);
2625     if(errorstate != HAL_SD_ERROR_NONE)
2626     {
2627       return errorstate;
2628     }
2629     else
2630     {
2631       /* Get Card identification number data */
2632       hsd->CID[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2633       hsd->CID[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2634       hsd->CID[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2635       hsd->CID[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2636     }
2637   }
2638 
2639   if(hsd->SdCard.CardType != CARD_SECURED)
2640   {
2641     /* Send CMD3 SET_REL_ADDR with argument 0 */
2642     /* SD Card publishes its RCA. */
2643     errorstate = SDMMC_CmdSetRelAdd(hsd->Instance, &sd_rca);
2644     if(errorstate != HAL_SD_ERROR_NONE)
2645     {
2646       return errorstate;
2647     }
2648   }
2649   if(hsd->SdCard.CardType != CARD_SECURED)
2650   {
2651     /* Get the SD card RCA */
2652     hsd->SdCard.RelCardAdd = sd_rca;
2653 
2654     /* Send CMD9 SEND_CSD with argument as card's RCA */
2655     errorstate = SDMMC_CmdSendCSD(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2656     if(errorstate != HAL_SD_ERROR_NONE)
2657     {
2658       return errorstate;
2659     }
2660     else
2661     {
2662       /* Get Card Specific Data */
2663       hsd->CSD[0U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2664       hsd->CSD[1U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2665       hsd->CSD[2U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2666       hsd->CSD[3U] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2667     }
2668   }
2669 
2670   /* Get the Card Class */
2671   hsd->SdCard.Class = (SDIO_GetResponse(hsd->Instance, SDIO_RESP2) >> 20U);
2672 
2673   /* Get CSD parameters */
2674   if (HAL_SD_GetCardCSD(hsd, &CSD) != HAL_OK)
2675   {
2676     return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2677   }
2678 
2679   /* Select the Card */
2680   errorstate = SDMMC_CmdSelDesel(hsd->Instance, (uint32_t)(((uint32_t)hsd->SdCard.RelCardAdd) << 16U));
2681   if(errorstate != HAL_SD_ERROR_NONE)
2682   {
2683     return errorstate;
2684   }
2685 
2686   /* Configure SDIO peripheral interface */
2687   (void)SDIO_Init(hsd->Instance, hsd->Init);
2688 
2689   /* All cards are initialized */
2690   return HAL_SD_ERROR_NONE;
2691 }
2692 
2693 /**
2694   * @brief  Enquires cards about their operating voltage and configures clock
2695   *         controls and stores SD information that will be needed in future
2696   *         in the SD handle.
2697   * @param  hsd: Pointer to SD handle
2698   * @retval error state
2699   */
SD_PowerON(SD_HandleTypeDef * hsd)2700 static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
2701 {
2702   __IO uint32_t count = 0U;
2703   uint32_t response = 0U, validvoltage = 0U;
2704   uint32_t errorstate;
2705 
2706   /* CMD0: GO_IDLE_STATE */
2707   errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
2708   if(errorstate != HAL_SD_ERROR_NONE)
2709   {
2710     return errorstate;
2711   }
2712 
2713   /* CMD8: SEND_IF_COND: Command available only on V2.0 cards */
2714   errorstate = SDMMC_CmdOperCond(hsd->Instance);
2715   if(errorstate != HAL_SD_ERROR_NONE)
2716   {
2717     hsd->SdCard.CardVersion = CARD_V1_X;
2718     /* CMD0: GO_IDLE_STATE */
2719     errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
2720     if(errorstate != HAL_SD_ERROR_NONE)
2721     {
2722       return errorstate;
2723     }
2724 
2725   }
2726   else
2727   {
2728     hsd->SdCard.CardVersion = CARD_V2_X;
2729   }
2730 
2731   if( hsd->SdCard.CardVersion == CARD_V2_X)
2732   {
2733     /* SEND CMD55 APP_CMD with RCA as 0 */
2734     errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
2735     if(errorstate != HAL_SD_ERROR_NONE)
2736     {
2737       return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2738     }
2739   }
2740   /* SD CARD */
2741   /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
2742   while((count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
2743   {
2744     /* SEND CMD55 APP_CMD with RCA as 0 */
2745     errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
2746     if(errorstate != HAL_SD_ERROR_NONE)
2747     {
2748       return errorstate;
2749     }
2750 
2751     /* Send CMD41 */
2752     errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY | SD_SWITCH_1_8V_CAPACITY);
2753     if(errorstate != HAL_SD_ERROR_NONE)
2754     {
2755       return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
2756     }
2757 
2758     /* Get command response */
2759     response = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2760 
2761     /* Get operating voltage*/
2762     validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);
2763 
2764     count++;
2765   }
2766 
2767   if(count >= SDMMC_MAX_VOLT_TRIAL)
2768   {
2769     return HAL_SD_ERROR_INVALID_VOLTRANGE;
2770   }
2771 
2772   if((response & SDMMC_HIGH_CAPACITY) == SDMMC_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */
2773   {
2774     hsd->SdCard.CardType = CARD_SDHC_SDXC;
2775   }
2776   else
2777   {
2778     hsd->SdCard.CardType = CARD_SDSC;
2779   }
2780 
2781 
2782   return HAL_SD_ERROR_NONE;
2783 }
2784 
2785 /**
2786   * @brief  Turns the SDIO output signals off.
2787   * @param  hsd: Pointer to SD handle
2788   * @retval None
2789   */
SD_PowerOFF(SD_HandleTypeDef * hsd)2790 static void SD_PowerOFF(SD_HandleTypeDef *hsd)
2791 {
2792   /* Set Power State to OFF */
2793   (void)SDIO_PowerState_OFF(hsd->Instance);
2794 }
2795 
2796 /**
2797   * @brief  Send Status info command.
2798   * @param  hsd: pointer to SD handle
2799   * @param  pSDstatus: Pointer to the buffer that will contain the SD card status
2800   *         SD Status register)
2801   * @retval error state
2802   */
SD_SendSDStatus(SD_HandleTypeDef * hsd,uint32_t * pSDstatus)2803 static uint32_t SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
2804 {
2805   SDIO_DataInitTypeDef config;
2806   uint32_t errorstate;
2807   uint32_t tickstart = HAL_GetTick();
2808   uint32_t count;
2809   uint32_t *pData = pSDstatus;
2810 
2811   /* Check SD response */
2812   if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
2813   {
2814     return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
2815   }
2816 
2817   /* Set block size for card if it is not equal to current block size for card */
2818   errorstate = SDMMC_CmdBlockLength(hsd->Instance, 64U);
2819   if(errorstate != HAL_SD_ERROR_NONE)
2820   {
2821     hsd->ErrorCode |= HAL_SD_ERROR_NONE;
2822     return errorstate;
2823   }
2824 
2825   /* Send CMD55 */
2826   errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2827   if(errorstate != HAL_SD_ERROR_NONE)
2828   {
2829     hsd->ErrorCode |= HAL_SD_ERROR_NONE;
2830     return errorstate;
2831   }
2832 
2833   /* Configure the SD DPSM (Data Path State Machine) */
2834   config.DataTimeOut   = SDMMC_DATATIMEOUT;
2835   config.DataLength    = 64U;
2836   config.DataBlockSize = SDIO_DATABLOCK_SIZE_64B;
2837   config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
2838   config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
2839   config.DPSM          = SDIO_DPSM_ENABLE;
2840   (void)SDIO_ConfigData(hsd->Instance, &config);
2841 
2842   /* Send ACMD13 (SD_APP_STAUS)  with argument as card's RCA */
2843   errorstate = SDMMC_CmdStatusRegister(hsd->Instance);
2844   if(errorstate != HAL_SD_ERROR_NONE)
2845   {
2846     hsd->ErrorCode |= HAL_SD_ERROR_NONE;
2847     return errorstate;
2848   }
2849 
2850   /* Get status data */
2851   while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))
2852   {
2853     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
2854     {
2855       for(count = 0U; count < 8U; count++)
2856       {
2857         *pData = SDIO_ReadFIFO(hsd->Instance);
2858         pData++;
2859       }
2860     }
2861 
2862     if((HAL_GetTick() - tickstart) >=  SDMMC_SWDATATIMEOUT)
2863     {
2864       return HAL_SD_ERROR_TIMEOUT;
2865     }
2866   }
2867 
2868   if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
2869   {
2870     return HAL_SD_ERROR_DATA_TIMEOUT;
2871   }
2872   else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
2873   {
2874     return HAL_SD_ERROR_DATA_CRC_FAIL;
2875   }
2876   else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
2877   {
2878     return HAL_SD_ERROR_RX_OVERRUN;
2879   }
2880   else
2881   {
2882     /* Nothing to do */
2883   }
2884 
2885   while ((__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)))
2886   {
2887     *pData = SDIO_ReadFIFO(hsd->Instance);
2888     pData++;
2889 
2890     if((HAL_GetTick() - tickstart) >=  SDMMC_SWDATATIMEOUT)
2891     {
2892       return HAL_SD_ERROR_TIMEOUT;
2893     }
2894   }
2895 
2896   /* Clear all the static status flags*/
2897   __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
2898 
2899   return HAL_SD_ERROR_NONE;
2900 }
2901 
2902 /**
2903   * @brief  Returns the current card's status.
2904   * @param  hsd: Pointer to SD handle
2905   * @param  pCardStatus: pointer to the buffer that will contain the SD card
2906   *         status (Card Status register)
2907   * @retval error state
2908   */
SD_SendStatus(SD_HandleTypeDef * hsd,uint32_t * pCardStatus)2909 static uint32_t SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
2910 {
2911   uint32_t errorstate;
2912 
2913   if(pCardStatus == NULL)
2914   {
2915     return HAL_SD_ERROR_PARAM;
2916   }
2917 
2918   /* Send Status command */
2919   errorstate = SDMMC_CmdSendStatus(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2920   if(errorstate != HAL_SD_ERROR_NONE)
2921   {
2922     return errorstate;
2923   }
2924 
2925   /* Get SD card status */
2926   *pCardStatus = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2927 
2928   return HAL_SD_ERROR_NONE;
2929 }
2930 
2931 /**
2932   * @brief  Enables the SDIO wide bus mode.
2933   * @param  hsd: pointer to SD handle
2934   * @retval error state
2935   */
SD_WideBus_Enable(SD_HandleTypeDef * hsd)2936 static uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)
2937 {
2938   uint32_t scr[2U] = {0U, 0U};
2939   uint32_t errorstate;
2940 
2941   if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
2942   {
2943     return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
2944   }
2945 
2946   /* Get SCR Register */
2947   errorstate = SD_FindSCR(hsd, scr);
2948   if(errorstate != HAL_SD_ERROR_NONE)
2949   {
2950     return errorstate;
2951   }
2952 
2953   /* If requested card supports wide bus operation */
2954   if((scr[1U] & SDMMC_WIDE_BUS_SUPPORT) != SDMMC_ALLZERO)
2955   {
2956     /* Send CMD55 APP_CMD with argument as card's RCA.*/
2957     errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
2958     if(errorstate != HAL_SD_ERROR_NONE)
2959     {
2960       return errorstate;
2961     }
2962 
2963     /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
2964     errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U);
2965     if(errorstate != HAL_SD_ERROR_NONE)
2966     {
2967       return errorstate;
2968     }
2969 
2970     return HAL_SD_ERROR_NONE;
2971   }
2972   else
2973   {
2974     return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
2975   }
2976 }
2977 
2978 /**
2979   * @brief  Disables the SDIO wide bus mode.
2980   * @param  hsd: Pointer to SD handle
2981   * @retval error state
2982   */
SD_WideBus_Disable(SD_HandleTypeDef * hsd)2983 static uint32_t SD_WideBus_Disable(SD_HandleTypeDef *hsd)
2984 {
2985   uint32_t scr[2U] = {0U, 0U};
2986   uint32_t errorstate;
2987 
2988   if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)
2989   {
2990     return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;
2991   }
2992 
2993   /* Get SCR Register */
2994   errorstate = SD_FindSCR(hsd, scr);
2995   if(errorstate != HAL_SD_ERROR_NONE)
2996   {
2997     return errorstate;
2998   }
2999 
3000   /* If requested card supports 1 bit mode operation */
3001   if((scr[1U] & SDMMC_SINGLE_BUS_SUPPORT) != SDMMC_ALLZERO)
3002   {
3003     /* Send CMD55 APP_CMD with argument as card's RCA */
3004     errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));
3005     if(errorstate != HAL_SD_ERROR_NONE)
3006     {
3007       return errorstate;
3008     }
3009 
3010     /* Send ACMD6 APP_CMD with argument as 0 for single bus mode */
3011     errorstate = SDMMC_CmdBusWidth(hsd->Instance, 0U);
3012     if(errorstate != HAL_SD_ERROR_NONE)
3013     {
3014       return errorstate;
3015     }
3016 
3017     return HAL_SD_ERROR_NONE;
3018   }
3019   else
3020   {
3021     return HAL_SD_ERROR_REQUEST_NOT_APPLICABLE;
3022   }
3023 }
3024 
3025 
3026 /**
3027   * @brief  Finds the SD card SCR register value.
3028   * @param  hsd: Pointer to SD handle
3029   * @param  pSCR: pointer to the buffer that will contain the SCR value
3030   * @retval error state
3031   */
SD_FindSCR(SD_HandleTypeDef * hsd,uint32_t * pSCR)3032 static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
3033 {
3034   SDIO_DataInitTypeDef config;
3035   uint32_t errorstate;
3036   uint32_t tickstart = HAL_GetTick();
3037   uint32_t index = 0U;
3038   uint32_t tempscr[2U] = {0U, 0U};
3039   uint32_t *scr = pSCR;
3040 
3041   /* Set Block Size To 8 Bytes */
3042   errorstate = SDMMC_CmdBlockLength(hsd->Instance, 8U);
3043   if(errorstate != HAL_SD_ERROR_NONE)
3044   {
3045     return errorstate;
3046   }
3047 
3048   /* Send CMD55 APP_CMD with argument as card's RCA */
3049   errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U));
3050   if(errorstate != HAL_SD_ERROR_NONE)
3051   {
3052     return errorstate;
3053   }
3054 
3055   config.DataTimeOut   = SDMMC_DATATIMEOUT;
3056   config.DataLength    = 8U;
3057   config.DataBlockSize = SDIO_DATABLOCK_SIZE_8B;
3058   config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
3059   config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
3060   config.DPSM          = SDIO_DPSM_ENABLE;
3061   (void)SDIO_ConfigData(hsd->Instance, &config);
3062 
3063   /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
3064   errorstate = SDMMC_CmdSendSCR(hsd->Instance);
3065   if(errorstate != HAL_SD_ERROR_NONE)
3066   {
3067     return errorstate;
3068   }
3069 
3070   while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT))
3071   {
3072     if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))
3073     {
3074       *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance);
3075       index++;
3076     }
3077     else if(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXACT))
3078     {
3079       break;
3080     }
3081 
3082     if((HAL_GetTick() - tickstart) >=  SDMMC_SWDATATIMEOUT)
3083     {
3084       return HAL_SD_ERROR_TIMEOUT;
3085     }
3086   }
3087 
3088   if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT) || (__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_STBITERR)))
3089   {
3090     __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
3091 
3092     return HAL_SD_ERROR_DATA_TIMEOUT;
3093   }
3094   else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
3095   {
3096     __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
3097 
3098     return HAL_SD_ERROR_DATA_CRC_FAIL;
3099   }
3100   else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
3101   {
3102     __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
3103 
3104     return HAL_SD_ERROR_RX_OVERRUN;
3105   }
3106   else
3107   {
3108     /* No error flag set */
3109     /* Clear all the static flags */
3110     __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);
3111 
3112     *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24)  | ((tempscr[1] & SDMMC_8TO15BITS) << 8) |\
3113             ((tempscr[1] & SDMMC_16TO23BITS) >> 8) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24));
3114     scr++;
3115     *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24)  | ((tempscr[0] & SDMMC_8TO15BITS) << 8) |\
3116             ((tempscr[0] & SDMMC_16TO23BITS) >> 8) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24));
3117 
3118   }
3119 
3120   return HAL_SD_ERROR_NONE;
3121 }
3122 
3123 /**
3124   * @brief  Wrap up reading in non-blocking mode.
3125   * @param  hsd: pointer to a SD_HandleTypeDef structure that contains
3126   *              the configuration information.
3127   * @retval None
3128   */
SD_Read_IT(SD_HandleTypeDef * hsd)3129 static void SD_Read_IT(SD_HandleTypeDef *hsd)
3130 {
3131   uint32_t count, data, dataremaining;
3132   uint8_t* tmp;
3133 
3134   tmp = hsd->pRxBuffPtr;
3135   dataremaining = hsd->RxXferSize;
3136 
3137   if (dataremaining > 0U)
3138   {
3139     /* Read data from SDIO Rx FIFO */
3140     for(count = 0U; count < 8U; count++)
3141     {
3142       data = SDIO_ReadFIFO(hsd->Instance);
3143       *tmp = (uint8_t)(data & 0xFFU);
3144       tmp++;
3145       dataremaining--;
3146       *tmp = (uint8_t)((data >> 8U) & 0xFFU);
3147       tmp++;
3148       dataremaining--;
3149       *tmp = (uint8_t)((data >> 16U) & 0xFFU);
3150       tmp++;
3151       dataremaining--;
3152       *tmp = (uint8_t)((data >> 24U) & 0xFFU);
3153       tmp++;
3154       dataremaining--;
3155     }
3156 
3157     hsd->pRxBuffPtr = tmp;
3158     hsd->RxXferSize = dataremaining;
3159   }
3160 }
3161 
3162 /**
3163   * @brief  Wrap up writing in non-blocking mode.
3164   * @param  hsd: pointer to a SD_HandleTypeDef structure that contains
3165   *              the configuration information.
3166   * @retval None
3167   */
SD_Write_IT(SD_HandleTypeDef * hsd)3168 static void SD_Write_IT(SD_HandleTypeDef *hsd)
3169 {
3170   uint32_t count, data, dataremaining;
3171   uint8_t* tmp;
3172 
3173   tmp = hsd->pTxBuffPtr;
3174   dataremaining = hsd->TxXferSize;
3175 
3176   if (dataremaining > 0U)
3177   {
3178     /* Write data to SDIO Tx FIFO */
3179     for(count = 0U; count < 8U; count++)
3180     {
3181       data = (uint32_t)(*tmp);
3182       tmp++;
3183       dataremaining--;
3184       data |= ((uint32_t)(*tmp) << 8U);
3185       tmp++;
3186       dataremaining--;
3187       data |= ((uint32_t)(*tmp) << 16U);
3188       tmp++;
3189       dataremaining--;
3190       data |= ((uint32_t)(*tmp) << 24U);
3191       tmp++;
3192       dataremaining--;
3193       (void)SDIO_WriteFIFO(hsd->Instance, &data);
3194     }
3195 
3196     hsd->pTxBuffPtr = tmp;
3197     hsd->TxXferSize = dataremaining;
3198   }
3199 }
3200 
3201 /**
3202   * @}
3203   */
3204 
3205 #endif /* HAL_SD_MODULE_ENABLED */
3206 
3207 /**
3208   * @}
3209   */
3210 
3211 /**
3212   * @}
3213   */
3214 
3215 #endif /* SDIO */
3216