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