Subversion Repositories DashDisplay

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32f1xx_hal_sd.c
4
  * @author  MCD Application Team
5
  * @version V1.0.1
6
  * @date    31-July-2015
7
  * @brief   SD card HAL module driver.
8
  *          This file provides firmware functions to manage the following
9
  *          functionalities of the Secure Digital (SD) peripheral:
10
  *           + Initialization and de-initialization functions
11
  *           + IO operation functions
12
  *           + Peripheral Control functions
13
  *           + Peripheral State functions
14
  *        
15
  @verbatim
16
  ==============================================================================
17
                        ##### How to use this driver #####
18
  ==============================================================================
19
  [..]
20
    This driver implements a high level communication layer for read and write from/to
21
    this memory. The needed STM32 hardware resources (SDIO and GPIO) are performed by
22
    the user in HAL_SD_MspInit() function (MSP layer).                            
23
    Basically, the MSP layer configuration should be the same as we provide in the
24
    examples.
25
    You can easily tailor this configuration according to hardware resources.
26
 
27
  [..]
28
    This driver is a generic layered driver for SDIO memories which uses the HAL
29
    SDIO driver functions to interface with SD and uSD cards devices.
30
    It is used as follows:
31
 
32
    (#)Initialize the SDIO low level resources by implement the HAL_SD_MspInit() API:
33
        (##) Enable the SDIO interface clock using __HAL_RCC_SDIO_CLK_ENABLE();
34
        (##) SDIO pins configuration for SD card
35
            (+++) Enable the clock for the SDIO GPIOs using the functions __HAL_RCC_GPIOx_CLK_ENABLE();  
36
            (+++) Configure these SDIO pins as alternate function pull-up using HAL_GPIO_Init()
37
                  and according to your pin assignment;
38
        (##) DMA Configuration if you need to use DMA process (HAL_SD_ReadBlocks_DMA()
39
             and HAL_SD_WriteBlocks_DMA() APIs).
40
            (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE();
41
            (+++) Configure the DMA using the function HAL_DMA_Init() with predeclared and filled.
42
        (##) NVIC configuration if you need to use interrupt process when using DMA transfer.
43
            (+++) Configure the SDIO and DMA interrupt priorities using functions
44
                  HAL_NVIC_SetPriority(); DMA priority is superior to SDIO's priority
45
            (+++) Enable the NVIC DMA and SDIO IRQs using function HAL_NVIC_EnableIRQ()
46
            (+++) SDIO interrupts are managed using the macros __HAL_SD_SDIO_ENABLE_IT()
47
                  and __HAL_SD_SDIO_DISABLE_IT() inside the communication process.
48
            (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_SDIO_GET_IT()
49
                  and __HAL_SD_SDIO_CLEAR_IT()
50
    (#) At this stage, you can perform SD read/write/erase operations after SD card initialization  
51
 
52
 
53
  *** SD Card Initialization and configuration ***
54
  ================================================    
55
  [..]
56
    To initialize the SD Card, use the HAL_SD_Init() function.  It Initializes
57
    the SD Card and put it into StandBy State (Ready for data transfer).
58
    This function provide the following operations:
59
 
60
    (#) Apply the SD Card initialization process at 400KHz and check the SD Card
61
        type (Standard Capacity or High Capacity). You can change or adapt this
62
        frequency by adjusting the "ClockDiv" field.
63
        The SD Card frequency (SDIO_CK) is computed as follows:
64
 
65
           SDIO_CK = SDIOCLK / (ClockDiv + 2)
66
 
67
        In initialization mode and according to the SD Card standard,
68
        make sure that the SDIO_CK frequency doesn't exceed 400KHz.
69
 
70
    (#) Get the SD CID and CSD data. All these information are managed by the SDCardInfo
71
        structure. This structure provide also ready computed SD Card capacity
72
        and Block size.
73
 
74
        -@- These information are stored in SD handle structure in case of future use.  
75
 
76
    (#) Configure the SD Card Data transfer frequency. The card transfer
77
        frequency is set to SDIOCLK / (SDIO_TRANSFER_CLK_DIV + 2). You can change or adapt this frequency by adjusting
78
        the "ClockDiv" field.
79
        The SD Card frequency (SDIO_CK) is computed as follows:
80
 
81
           SDIO_CK = SDIOCLK / (ClockDiv + 2)
82
 
83
        In transfer mode and according to the SD Card standard, make sure that the
84
        SDIO_CK frequency doesn't exceed 25MHz and 50MHz in High-speed mode switch.
85
 
86
    (#) Select the corresponding SD Card according to the address read with the step 2.
87
 
88
    (#) Configure the SD Card in wide bus mode: 4-bits data.
89
 
90
  *** SD Card Read operation ***
91
  ==============================
92
  [..]
93
    (+) You can read from SD card in polling mode by using function HAL_SD_ReadBlocks().
94
        This function support only 512-bytes block length (the block size should be
95
        chosen as 512 bytes).
96
        You can choose either one block read operation or multiple block read operation
97
        by adjusting the "NumberOfBlocks" parameter.
98
 
99
    (+) You can read from SD card in DMA mode by using function HAL_SD_ReadBlocks_DMA().
100
        This function support only 512-bytes block length (the block size should be
101
        chosen as 512 bytes).
102
        You can choose either one block read operation or multiple block read operation
103
        by adjusting the "NumberOfBlocks" parameter.
104
        After this, you have to call the function HAL_SD_CheckReadOperation(), to insure
105
        that the read transfer is done correctly in both DMA and SD sides.
106
 
107
  *** SD Card Write operation ***
108
  ===============================
109
  [..]
110
    (+) You can write to SD card in polling mode by using function HAL_SD_WriteBlocks().
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
 
116
    (+) You can write to SD card in DMA mode by using function HAL_SD_WriteBlocks_DMA().
117
        This function support only 512-bytes block length (the block size should be
118
        chosen as 512 byte).
119
        You can choose either one block read operation or multiple block read operation
120
        by adjusting the "NumberOfBlocks" parameter.
121
        After this, you have to call the function HAL_SD_CheckWriteOperation(), to insure
122
        that the write transfer is done correctly in both DMA and SD sides.  
123
 
124
  *** SD card status ***
125
  ======================
126
  [..]
127
    (+) At any time, you can check the SD Card status and get the SD card state
128
        by using the HAL_SD_GetStatus() function. This function checks first if the
129
        SD card is still connected and then get the internal SD Card transfer state.    
130
    (+) You can also get the SD card SD Status register by using the HAL_SD_SendSDStatus()
131
        function.    
132
 
133
  *** SD HAL driver macros list ***
134
  ==================================
135
  [..]
136
    Below the list of most used macros in SD HAL driver.
137
    (+) __HAL_SD_SDIO_ENABLE : Enable the SD device
138
    (+) __HAL_SD_SDIO_DISABLE : Disable the SD device
139
    (+) __HAL_SD_SDIO_DMA_ENABLE: Enable the SDIO DMA transfer
140
    (+) __HAL_SD_SDIO_DMA_DISABLE: Disable the SDIO DMA transfer
141
    (+) __HAL_SD_SDIO_ENABLE_IT: Enable the SD device interrupt
142
    (+) __HAL_SD_SDIO_DISABLE_IT: Disable the SD device interrupt
143
    (+) __HAL_SD_SDIO_GET_FLAG:Check whether the specified SD flag is set or not
144
    (+) __HAL_SD_SDIO_CLEAR_FLAG: Clear the SD's pending flags
145
 
146
    -@- You can refer to the SD HAL driver header file for more useful macros
147
 
148
  @endverbatim
149
  ******************************************************************************
150
  * @attention
151
  *
152
  * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
153
  *
154
  * Redistribution and use in source and binary forms, with or without modification,
155
  * are permitted provided that the following conditions are met:
156
  *   1. Redistributions of source code must retain the above copyright notice,
157
  *      this list of conditions and the following disclaimer.
158
  *   2. Redistributions in binary form must reproduce the above copyright notice,
159
  *      this list of conditions and the following disclaimer in the documentation
160
  *      and/or other materials provided with the distribution.
161
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
162
  *      may be used to endorse or promote products derived from this software
163
  *      without specific prior written permission.
164
  *
165
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
166
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
167
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
168
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
169
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
170
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
171
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
172
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
173
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
174
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
175
  *
176
  ******************************************************************************
177
  */
178
 
179
/* Includes ------------------------------------------------------------------*/
180
#include "stm32f1xx_hal.h"
181
 
182
#ifdef HAL_SD_MODULE_ENABLED
183
 
184
#if defined(STM32F103xE) || defined(STM32F103xG)
185
 
186
/** @addtogroup STM32F1xx_HAL_Driver
187
  * @{
188
  */
189
 
190
/** @defgroup SD SD
191
  * @brief SD HAL module driver
192
  * @{
193
  */
194
 
195
/* Private typedef -----------------------------------------------------------*/
196
/* Private define ------------------------------------------------------------*/
197
 
198
/** @defgroup SD_Private_Define SD Private Constant
199
  * @{
200
  */
201
/**
202
  * @brief  SDIO Data block size
203
  */
204
#define DATA_BLOCK_SIZE                  ((uint32_t)(9 << 4))
205
/**
206
  * @brief  SDIO Static flags, TimeOut, FIFO Address  
207
  */
208
#define SDIO_STATIC_FLAGS               ((uint32_t)(SDIO_FLAG_CCRCFAIL | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_CTIMEOUT |\
209
                                                    SDIO_FLAG_DTIMEOUT | SDIO_FLAG_TXUNDERR | SDIO_FLAG_RXOVERR  |\
210
                                                    SDIO_FLAG_CMDREND  | SDIO_FLAG_CMDSENT  | SDIO_FLAG_DATAEND  |\
211
                                                    SDIO_FLAG_DBCKEND))  
212
 
213
#define SDIO_CMD0TIMEOUT                ((uint32_t)0x00010000)
214
 
215
/**
216
  * @brief  Mask for errors Card Status R1 (OCR Register)
217
  */
218
#define SD_OCR_ADDR_OUT_OF_RANGE        ((uint32_t)0x80000000)
219
#define SD_OCR_ADDR_MISALIGNED          ((uint32_t)0x40000000)
220
#define SD_OCR_BLOCK_LEN_ERR            ((uint32_t)0x20000000)
221
#define SD_OCR_ERASE_SEQ_ERR            ((uint32_t)0x10000000)
222
#define SD_OCR_BAD_ERASE_PARAM          ((uint32_t)0x08000000)
223
#define SD_OCR_WRITE_PROT_VIOLATION     ((uint32_t)0x04000000)
224
#define SD_OCR_LOCK_UNLOCK_FAILED       ((uint32_t)0x01000000)
225
#define SD_OCR_COM_CRC_FAILED           ((uint32_t)0x00800000)
226
#define SD_OCR_ILLEGAL_CMD              ((uint32_t)0x00400000)
227
#define SD_OCR_CARD_ECC_FAILED          ((uint32_t)0x00200000)
228
#define SD_OCR_CC_ERROR                 ((uint32_t)0x00100000)
229
#define SD_OCR_GENERAL_UNKNOWN_ERROR    ((uint32_t)0x00080000)
230
#define SD_OCR_STREAM_READ_UNDERRUN     ((uint32_t)0x00040000)
231
#define SD_OCR_STREAM_WRITE_OVERRUN     ((uint32_t)0x00020000)
232
#define SD_OCR_CID_CSD_OVERWRITE       ((uint32_t)0x00010000)
233
#define SD_OCR_WP_ERASE_SKIP            ((uint32_t)0x00008000)
234
#define SD_OCR_CARD_ECC_DISABLED        ((uint32_t)0x00004000)
235
#define SD_OCR_ERASE_RESET              ((uint32_t)0x00002000)
236
#define SD_OCR_AKE_SEQ_ERROR            ((uint32_t)0x00000008)
237
#define SD_OCR_ERRORBITS                ((uint32_t)0xFDFFE008)
238
 
239
/**
240
  * @brief  Masks for R6 Response
241
  */
242
#define SD_R6_GENERAL_UNKNOWN_ERROR     ((uint32_t)0x00002000)
243
#define SD_R6_ILLEGAL_CMD               ((uint32_t)0x00004000)
244
#define SD_R6_COM_CRC_FAILED            ((uint32_t)0x00008000)
245
 
246
#define SD_VOLTAGE_WINDOW_SD            ((uint32_t)0x80100000)
247
#define SD_HIGH_CAPACITY                ((uint32_t)0x40000000)
248
#define SD_STD_CAPACITY                 ((uint32_t)0x00000000)
249
#define SD_CHECK_PATTERN                ((uint32_t)0x000001AA)
250
 
251
#define SD_MAX_VOLT_TRIAL               ((uint32_t)0x0000FFFF)
252
#define SD_ALLZERO                      ((uint32_t)0x00000000)
253
 
254
#define SD_WIDE_BUS_SUPPORT             ((uint32_t)0x00040000)
255
#define SD_SINGLE_BUS_SUPPORT           ((uint32_t)0x00010000)
256
#define SD_CARD_LOCKED                  ((uint32_t)0x02000000)
257
 
258
#define SD_DATATIMEOUT                  ((uint32_t)0xFFFFFFFF)
259
#define SD_0TO7BITS                     ((uint32_t)0x000000FF)
260
#define SD_8TO15BITS                    ((uint32_t)0x0000FF00)
261
#define SD_16TO23BITS                   ((uint32_t)0x00FF0000)
262
#define SD_24TO31BITS                   ((uint32_t)0xFF000000)
263
#define SD_MAX_DATA_LENGTH              ((uint32_t)0x01FFFFFF)
264
 
265
#define SD_HALFFIFO                     ((uint32_t)0x00000008)
266
#define SD_HALFFIFOBYTES                ((uint32_t)0x00000020)
267
 
268
/**
269
  * @brief  Command Class Supported
270
  */
271
#define SD_CCCC_LOCK_UNLOCK             ((uint32_t)0x00000080)
272
#define SD_CCCC_WRITE_PROT              ((uint32_t)0x00000040)
273
#define SD_CCCC_ERASE                   ((uint32_t)0x00000020)
274
 
275
/**
276
  * @brief  Following commands are SD Card Specific commands.
277
  *         SDIO_APP_CMD should be sent before sending these commands.
278
  */
279
#define SD_SDIO_SEND_IF_COND            ((uint32_t)SD_CMD_HS_SEND_EXT_CSD)
280
 
281
/**
282
  * @}
283
  */
284
 
285
/* Private macro -------------------------------------------------------------*/
286
/* Private variables ---------------------------------------------------------*/
287
/* Private function prototypes -----------------------------------------------*/
288
/* Private functions ---------------------------------------------------------*/
289
 
290
/** @defgroup SD_Private_Functions SD Private Functions
291
  * @{
292
  */
293
 
294
static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd);
295
static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t Addr);
296
static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd);
297
static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd);
298
static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus);
299
static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd);
300
static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus);
301
static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd);
302
static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD);
303
static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd);
304
static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd);
305
static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd);
306
static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA);
307
static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd);
308
static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd);
309
static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR);  
310
static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma);
311
static void SD_DMA_RxError(DMA_HandleTypeDef *hdma);
312
static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma);
313
static void SD_DMA_TxError(DMA_HandleTypeDef *hdma);
314
 
315
/**
316
  * @}
317
  */
318
 
319
/** @defgroup SD_Exported_Functions SD Exported Functions
320
  * @{
321
  */
322
 
323
/** @defgroup SD_Exported_Functions_Group1 Initialization and de-initialization functions
324
 *  @brief    Initialization and Configuration functions
325
 *
326
@verbatim    
327
 ===============================================================================
328
              ##### Initialization and de-initialization functions #####
329
 ===============================================================================
330
  [..]  
331
    This section provides functions allowing to initialize/de-initialize the SD
332
    card device to be ready for use.
333
 
334
 
335
@endverbatim
336
  * @{
337
  */
338
 
339
/**
340
  * @brief  Initializes the SD card according to the specified parameters in the
341
            SD_HandleTypeDef and create the associated handle.
342
  * @param  hsd: SD handle
343
  * @param  SDCardInfo: HAL_SD_CardInfoTypedef structure for SD card information  
344
  * @retval HAL SD error state
345
  */
346
HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *SDCardInfo)
347
{
348
  __IO HAL_SD_ErrorTypedef errorstate = SD_OK;
349
  SD_InitTypeDef tmpinit = {0};
350
 
351
  /* Initialize the low level hardware (MSP) */
352
  HAL_SD_MspInit(hsd);
353
 
354
  /* Default SDIO peripheral configuration for SD card initialization */
355
  tmpinit.ClockEdge           = SDIO_CLOCK_EDGE_RISING;
356
  tmpinit.ClockBypass         = SDIO_CLOCK_BYPASS_DISABLE;
357
  tmpinit.ClockPowerSave      = SDIO_CLOCK_POWER_SAVE_DISABLE;
358
  tmpinit.BusWide             = SDIO_BUS_WIDE_1B;
359
  tmpinit.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
360
  tmpinit.ClockDiv            = SDIO_INIT_CLK_DIV;
361
 
362
  /* Initialize SDIO peripheral interface with default configuration */
363
  SDIO_Init(hsd->Instance, tmpinit);
364
 
365
  /* Identify card operating voltage */
366
  errorstate = SD_PowerON(hsd);
367
 
368
  if(errorstate != SD_OK)    
369
  {
370
    return errorstate;
371
  }
372
 
373
  /* Initialize the present SDIO card(s) and put them in idle state */
374
  errorstate = SD_Initialize_Cards(hsd);
375
 
376
  if (errorstate != SD_OK)
377
  {
378
    return errorstate;
379
  }
380
 
381
  /* Read CSD/CID MSD registers */
382
  errorstate = HAL_SD_Get_CardInfo(hsd, SDCardInfo);
383
 
384
  if (errorstate == SD_OK)
385
  {
386
    /* Select the Card */
387
    errorstate = SD_Select_Deselect(hsd, (uint32_t)(((uint32_t)SDCardInfo->RCA) << 16));
388
  }
389
 
390
  /* Configure SDIO peripheral interface */
391
  SDIO_Init(hsd->Instance, hsd->Init);  
392
 
393
  return errorstate;
394
}
395
 
396
/**
397
  * @brief  De-Initializes the SD card.
398
  * @param  hsd: SD handle
399
  * @retval HAL status
400
  */
401
HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd)
402
{
403
 
404
  /* Set SD power state to off */
405
  SD_PowerOFF(hsd);
406
 
407
  /* De-Initialize the MSP layer */
408
  HAL_SD_MspDeInit(hsd);
409
 
410
  return HAL_OK;
411
}
412
 
413
 
414
/**
415
  * @brief  Initializes the SD MSP.
416
  * @param  hsd: SD handle
417
  * @retval None
418
  */
419
__weak void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
420
{
421
  /* NOTE : This function Should not be modified, when the callback is needed,
422
            the HAL_SD_MspInit could be implemented in the user file
423
   */
424
}
425
 
426
/**
427
  * @brief  De-Initialize SD MSP.
428
  * @param  hsd: SD handle
429
  * @retval None
430
  */
431
__weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
432
{
433
  /* NOTE : This function Should not be modified, when the callback is needed,
434
            the HAL_SD_MspDeInit could be implemented in the user file
435
   */
436
}
437
 
438
/**
439
  * @}
440
  */
441
 
442
/** @defgroup SD_Exported_Functions_Group2 IO operation functions
443
 *  @brief   Data transfer functions
444
 *
445
@verbatim  
446
 ===============================================================================
447
                      ##### IO operation functions #####
448
 ===============================================================================
449
  [..]
450
    This subsection provides a set of functions allowing to manage the data
451
    transfer from/to SD card.
452
 
453
@endverbatim
454
  * @{
455
  */
456
 
457
/**
458
  * @brief  Reads block(s) from a specified address in a card. The Data transfer
459
  *         is managed by polling mode.  
460
  * @param  hsd: SD handle
461
  * @param  pReadBuffer: pointer to the buffer that will contain the received data
462
  * @param  ReadAddr: Address from where data is to be read  
463
  * @param  BlockSize: SD card Data block size (in bytes)
464
  *          This parameter should be 512
465
  * @param  NumberOfBlocks: Number of SD blocks to read  
466
  * @retval SD Card error state
467
  */
468
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
469
{
470
  SDIO_CmdInitTypeDef  sdio_cmdinitstructure = {0};
471
  SDIO_DataInitTypeDef sdio_datainitstructure = {0};
472
  HAL_SD_ErrorTypedef errorstate = SD_OK;
473
  uint32_t count = 0, *tempbuff = (uint32_t *)pReadBuffer;
474
 
475
  /* Initialize data control register */
476
  hsd->Instance->DCTRL = 0;
477
 
478
  if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
479
  {
480
    BlockSize = 512;
481
    ReadAddr /= 512;
482
  }
483
 
484
  /* Set Block Size for Card */
485
  sdio_cmdinitstructure.Argument         = (uint32_t) BlockSize;
486
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
487
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
488
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
489
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
490
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
491
 
492
  /* Check for error conditions */
493
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
494
 
495
  if (errorstate != SD_OK)
496
  {
497
    return errorstate;
498
  }
499
 
500
  /* Configure the SD DPSM (Data Path State Machine) */
501
  sdio_datainitstructure.DataTimeOut   = SD_DATATIMEOUT;
502
  sdio_datainitstructure.DataLength    = NumberOfBlocks * BlockSize;
503
  sdio_datainitstructure.DataBlockSize = DATA_BLOCK_SIZE;
504
  sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
505
  sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
506
  sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
507
  SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
508
 
509
  if(NumberOfBlocks > 1)
510
  {
511
    /* Send CMD18 READ_MULT_BLOCK with argument data address */
512
    sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK;
513
  }
514
  else
515
  {
516
    /* Send CMD17 READ_SINGLE_BLOCK */
517
    sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;    
518
  }
519
 
520
  sdio_cmdinitstructure.Argument         = (uint32_t)ReadAddr;
521
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
522
 
523
  /* Read block(s) in polling mode */
524
  if(NumberOfBlocks > 1)
525
  {
526
    /* Check for error conditions */
527
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK);
528
 
529
    if (errorstate != SD_OK)
530
    {
531
      return errorstate;
532
    }
533
 
534
    /* Poll on SDIO flags */
535
    while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
536
    {
537
      if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
538
      {
539
        /* Read data from SDIO Rx FIFO */
540
        for (count = 0; count < 8; count++)
541
        {
542
          *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
543
        }
544
 
545
        tempbuff += 8;
546
      }
547
    }      
548
  }
549
  else
550
  {
551
    /* Check for error conditions */
552
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
553
 
554
    if (errorstate != SD_OK)
555
    {
556
      return errorstate;
557
    }    
558
 
559
    /* In case of single block transfer, no need of stop transfer at all */
560
    while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
561
    {
562
      if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
563
      {
564
        /* Read data from SDIO Rx FIFO */
565
        for (count = 0; count < 8; count++)
566
        {
567
          *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
568
        }
569
 
570
        tempbuff += 8;
571
      }
572
    }
573
  }
574
 
575
  /* Send stop transmission command in case of multiblock read */
576
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1))
577
  {    
578
    if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) ||\
579
      (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
580
        (hsd->CardType == HIGH_CAPACITY_SD_CARD))
581
    {
582
      /* Send stop transmission command */
583
      errorstate = HAL_SD_StopTransfer(hsd);
584
    }
585
  }
586
 
587
  /* Get error state */
588
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
589
  {
590
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
591
 
592
    errorstate = SD_DATA_TIMEOUT;
593
 
594
    return errorstate;
595
  }
596
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
597
  {
598
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
599
 
600
    errorstate = SD_DATA_CRC_FAIL;
601
 
602
    return errorstate;
603
  }
604
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
605
  {
606
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
607
 
608
    errorstate = SD_RX_OVERRUN;
609
 
610
    return errorstate;
611
  }
612
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
613
  {
614
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
615
 
616
    errorstate = SD_START_BIT_ERR;
617
 
618
    return errorstate;
619
  }
620
  else
621
  {
622
    /* No error flag set */
623
  }
624
 
625
  count = SD_DATATIMEOUT;
626
 
627
  /* Empty FIFO if there is still any data */
628
  while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0))
629
  {
630
    *tempbuff = SDIO_ReadFIFO(hsd->Instance);
631
    tempbuff++;
632
    count--;
633
  }
634
 
635
  /* Clear all the static flags */
636
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
637
 
638
  return errorstate;
639
}
640
 
641
/**
642
  * @brief  Allows to write block(s) to a specified address in a card. The Data
643
  *         transfer is managed by polling mode.  
644
  * @param  hsd: SD handle
645
  * @param  pWriteBuffer: pointer to the buffer that will contain the data to transmit
646
  * @param  WriteAddr: Address from where data is to be written
647
  * @param  BlockSize: SD card Data block size (in bytes)
648
  *          This parameter should be 512.
649
  * @param  NumberOfBlocks: Number of SD blocks to write
650
  * @retval SD Card error state
651
  */
652
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
653
{
654
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
655
  SDIO_DataInitTypeDef sdio_datainitstructure = {0};
656
  HAL_SD_ErrorTypedef errorstate = SD_OK;
657
  uint32_t totalnumberofbytes = 0, bytestransferred = 0, count = 0, restwords = 0;
658
  uint32_t *tempbuff = (uint32_t *)pWriteBuffer;
659
  uint8_t cardstate  = 0;
660
 
661
  /* Initialize data control register */
662
  hsd->Instance->DCTRL = 0;
663
 
664
  if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
665
  {
666
    BlockSize = 512;
667
    WriteAddr /= 512;
668
  }
669
 
670
  /* Set Block Size for Card */
671
  sdio_cmdinitstructure.Argument         = (uint32_t)BlockSize;
672
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
673
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
674
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
675
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
676
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
677
 
678
  /* Check for error conditions */
679
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
680
 
681
  if (errorstate != SD_OK)
682
  {
683
    return errorstate;
684
  }
685
 
686
  if(NumberOfBlocks > 1)
687
  {
688
    /* Send CMD25 WRITE_MULT_BLOCK with argument data address */
689
    sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
690
  }
691
  else
692
  {
693
    /* Send CMD24 WRITE_SINGLE_BLOCK */
694
    sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
695
  }
696
 
697
  sdio_cmdinitstructure.Argument         = (uint32_t)WriteAddr;
698
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
699
 
700
  /* Check for error conditions */
701
  if(NumberOfBlocks > 1)
702
  {
703
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK);
704
  }
705
  else
706
  {
707
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK);
708
  }  
709
 
710
  if (errorstate != SD_OK)
711
  {
712
    return errorstate;
713
  }
714
 
715
  /* Set total number of bytes to write */
716
  totalnumberofbytes = NumberOfBlocks * BlockSize;
717
 
718
  /* Configure the SD DPSM (Data Path State Machine) */
719
  sdio_datainitstructure.DataTimeOut   = SD_DATATIMEOUT;
720
  sdio_datainitstructure.DataLength    = NumberOfBlocks * BlockSize;
721
  sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
722
  sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_CARD;
723
  sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
724
  sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
725
  SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
726
 
727
  /* Write block(s) in polling mode */
728
  if(NumberOfBlocks > 1)
729
  {
730
    while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
731
    {
732
      if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE))
733
      {
734
        if ((totalnumberofbytes - bytestransferred) < 32)
735
        {
736
          restwords = ((totalnumberofbytes - bytestransferred) % 4 == 0) ? ((totalnumberofbytes - bytestransferred) / 4) : (( totalnumberofbytes -  bytestransferred) / 4 + 1);
737
 
738
          /* Write data to SDIO Tx FIFO */
739
          for (count = 0; count < restwords; count++)
740
          {
741
            SDIO_WriteFIFO(hsd->Instance, tempbuff);
742
            tempbuff++;
743
            bytestransferred += 4;
744
          }
745
        }
746
        else
747
        {
748
          /* Write data to SDIO Tx FIFO */
749
          for (count = 0; count < 8; count++)
750
          {
751
            SDIO_WriteFIFO(hsd->Instance, (tempbuff + count));
752
          }
753
 
754
          tempbuff += 8;
755
          bytestransferred += 32;
756
        }
757
      }
758
    }  
759
  }
760
  else
761
  {
762
    /* In case of single data block transfer no need of stop command at all */
763
    while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
764
    {
765
      if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE))
766
      {
767
        if ((totalnumberofbytes - bytestransferred) < 32)
768
        {
769
          restwords = ((totalnumberofbytes - bytestransferred) % 4 == 0) ? ((totalnumberofbytes - bytestransferred) / 4) : (( totalnumberofbytes -  bytestransferred) / 4 + 1);
770
 
771
          /* Write data to SDIO Tx FIFO */
772
          for (count = 0; count < restwords; count++)
773
          {
774
            SDIO_WriteFIFO(hsd->Instance, tempbuff);
775
            tempbuff++;
776
            bytestransferred += 4;
777
          }
778
        }
779
        else
780
        {
781
          /* Write data to SDIO Tx FIFO */
782
          for (count = 0; count < 8; count++)
783
          {
784
            SDIO_WriteFIFO(hsd->Instance, (tempbuff + count));
785
          }
786
 
787
          tempbuff += 8;
788
          bytestransferred += 32;
789
        }
790
      }
791
    }  
792
  }
793
 
794
  /* Send stop transmission command in case of multiblock write */
795
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1))
796
  {    
797
    if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
798
      (hsd->CardType == HIGH_CAPACITY_SD_CARD))
799
    {
800
      /* Send stop transmission command */
801
      errorstate = HAL_SD_StopTransfer(hsd);
802
    }
803
  }
804
 
805
  /* Get error state */
806
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
807
  {
808
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
809
 
810
    errorstate = SD_DATA_TIMEOUT;
811
 
812
    return errorstate;
813
  }
814
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
815
  {
816
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
817
 
818
    errorstate = SD_DATA_CRC_FAIL;
819
 
820
    return errorstate;
821
  }
822
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR))
823
  {
824
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR);
825
 
826
    errorstate = SD_TX_UNDERRUN;
827
 
828
    return errorstate;
829
  }
830
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
831
  {
832
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
833
 
834
    errorstate = SD_START_BIT_ERR;
835
 
836
    return errorstate;
837
  }
838
  else
839
  {
840
    /* No error flag set */
841
  }
842
 
843
  /* Clear all the static flags */
844
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
845
 
846
  /* Wait till the card is in programming state */
847
  errorstate = SD_IsCardProgramming(hsd, &cardstate);
848
 
849
  while ((errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING)))
850
  {
851
    errorstate = SD_IsCardProgramming(hsd, &cardstate);
852
  }
853
 
854
  return errorstate;
855
}
856
 
857
/**
858
  * @brief  Reads block(s) from a specified address in a card. The Data transfer
859
  *         is managed by DMA mode.
860
  * @note   This API should be followed by the function HAL_SD_CheckReadOperation()
861
  *         to check the completion of the read process  
862
  * @param  hsd: SD handle                
863
  * @param  pReadBuffer: Pointer to the buffer that will contain the received data
864
  * @param  ReadAddr: Address from where data is to be read  
865
  * @param  BlockSize: SD card Data block size
866
  * @note   BlockSize must be 512 bytes.
867
  * @param  NumberOfBlocks: Number of blocks to read.
868
  * @retval SD Card error state
869
  */
870
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
871
{
872
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
873
  SDIO_DataInitTypeDef sdio_datainitstructure = {0};
874
  HAL_SD_ErrorTypedef errorstate = SD_OK;
875
 
876
  /* Initialize data control register */
877
  hsd->Instance->DCTRL = 0;
878
 
879
  /* Initialize handle flags */
880
  hsd->SdTransferCplt  = 0;
881
  hsd->DmaTransferCplt = 0;
882
  hsd->SdTransferErr   = SD_OK;
883
 
884
  /* Initialize SD Read operation */
885
  if(NumberOfBlocks > 1)
886
  {
887
    hsd->SdOperation = SD_READ_MULTIPLE_BLOCK;
888
  }
889
  else
890
  {
891
    hsd->SdOperation = SD_READ_SINGLE_BLOCK;
892
  }
893
 
894
  /* Enable transfer interrupts */
895
  __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\
896
                                SDIO_IT_DTIMEOUT |\
897
                                SDIO_IT_DATAEND  |\
898
                                SDIO_IT_RXOVERR  |\
899
                                SDIO_IT_STBITERR));
900
 
901
  /* Enable SDIO DMA transfer */
902
  __HAL_SD_SDIO_DMA_ENABLE(hsd);
903
 
904
  /* Configure DMA user callbacks */
905
  hsd->hdmarx->XferCpltCallback  = SD_DMA_RxCplt;
906
  hsd->hdmarx->XferErrorCallback = SD_DMA_RxError;
907
 
908
  /* Enable the DMA Channel */
909
  HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4);
910
 
911
  if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
912
  {
913
    BlockSize = 512;
914
    ReadAddr /= 512;
915
  }
916
 
917
  /* Set Block Size for Card */
918
  sdio_cmdinitstructure.Argument         = (uint32_t)BlockSize;
919
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
920
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
921
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
922
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
923
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
924
 
925
  /* Check for error conditions */
926
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
927
 
928
  if (errorstate != SD_OK)
929
  {
930
    return errorstate;
931
  }
932
 
933
  /* Configure the SD DPSM (Data Path State Machine) */
934
  sdio_datainitstructure.DataTimeOut   = SD_DATATIMEOUT;
935
  sdio_datainitstructure.DataLength    = BlockSize * NumberOfBlocks;
936
  sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
937
  sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
938
  sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
939
  sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
940
  SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
941
 
942
  /* Check number of blocks command */
943
  if(NumberOfBlocks > 1)
944
  {
945
    /* Send CMD18 READ_MULT_BLOCK with argument data address */
946
    sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK;
947
  }
948
  else
949
  {
950
    /* Send CMD17 READ_SINGLE_BLOCK */
951
    sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
952
  }
953
 
954
  sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr;
955
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
956
 
957
  /* Check for error conditions */
958
  if(NumberOfBlocks > 1)
959
  {
960
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK);
961
  }
962
  else
963
  {
964
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
965
  }
966
 
967
  /* Update the SD transfer error in SD handle */
968
  hsd->SdTransferErr = errorstate;
969
 
970
  return errorstate;
971
}
972
 
973
 
974
/**
975
  * @brief  Writes block(s) to a specified address in a card. The Data transfer
976
  *         is managed by DMA mode.
977
  * @note   This API should be followed by the function HAL_SD_CheckWriteOperation()
978
  *         to check the completion of the write process (by SD current status polling).  
979
  * @param  hsd: SD handle
980
  * @param  pWriteBuffer: pointer to the buffer that will contain the data to transmit
981
  * @param  WriteAddr: Address from where data is to be read  
982
  * @param  BlockSize: the SD card Data block size
983
  * @note   BlockSize must be 512 bytes.
984
  * @param  NumberOfBlocks: Number of blocks to write
985
  * @retval SD Card error state
986
  */
987
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
988
{
989
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
990
  SDIO_DataInitTypeDef sdio_datainitstructure = {0};
991
  HAL_SD_ErrorTypedef errorstate = SD_OK;
992
 
993
  /* Initialize data control register */
994
  hsd->Instance->DCTRL = 0;
995
 
996
  /* Initialize handle flags */
997
  hsd->SdTransferCplt  = 0;
998
  hsd->DmaTransferCplt = 0;
999
  hsd->SdTransferErr   = SD_OK;
1000
 
1001
  /* Initialize SD Write operation */
1002
  if(NumberOfBlocks > 1)
1003
  {
1004
    hsd->SdOperation = SD_WRITE_MULTIPLE_BLOCK;
1005
  }
1006
  else
1007
  {
1008
    hsd->SdOperation = SD_WRITE_SINGLE_BLOCK;
1009
  }  
1010
 
1011
  /* Enable transfer interrupts */
1012
  __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\
1013
                                SDIO_IT_DTIMEOUT |\
1014
                                SDIO_IT_DATAEND  |\
1015
                                SDIO_IT_TXUNDERR |\
1016
                                SDIO_IT_STBITERR));
1017
 
1018
  /* Configure DMA user callbacks */
1019
  hsd->hdmatx->XferCpltCallback  = SD_DMA_TxCplt;
1020
  hsd->hdmatx->XferErrorCallback = SD_DMA_TxError;
1021
 
1022
  /* Enable the DMA Channel */
1023
  HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pWriteBuffer, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BlockSize * NumberOfBlocks)/4);
1024
 
1025
  /* Enable SDIO DMA transfer */
1026
  __HAL_SD_SDIO_DMA_ENABLE(hsd);
1027
 
1028
  if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
1029
  {
1030
    BlockSize = 512;
1031
    WriteAddr /= 512;
1032
  }
1033
 
1034
  /* Set Block Size for Card */
1035
  sdio_cmdinitstructure.Argument         = (uint32_t)BlockSize;
1036
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
1037
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
1038
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
1039
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
1040
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1041
 
1042
  /* Check for error conditions */
1043
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
1044
 
1045
  if (errorstate != SD_OK)
1046
  {
1047
    return errorstate;
1048
  }
1049
 
1050
  /* Check number of blocks command */
1051
  if(NumberOfBlocks <= 1)
1052
  {
1053
    /* Send CMD24 WRITE_SINGLE_BLOCK */
1054
    sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
1055
  }
1056
  else
1057
  {
1058
    /* Send CMD25 WRITE_MULT_BLOCK with argument data address */
1059
    sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
1060
  }
1061
 
1062
  sdio_cmdinitstructure.Argument         = (uint32_t)WriteAddr;
1063
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1064
 
1065
  /* Check for error conditions */
1066
  if(NumberOfBlocks > 1)
1067
  {
1068
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK);
1069
  }
1070
  else
1071
  {
1072
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK);
1073
  }
1074
 
1075
  if (errorstate != SD_OK)
1076
  {
1077
    return errorstate;
1078
  }
1079
 
1080
  /* Configure the SD DPSM (Data Path State Machine) */
1081
  sdio_datainitstructure.DataTimeOut   = SD_DATATIMEOUT;
1082
  sdio_datainitstructure.DataLength    = BlockSize * NumberOfBlocks;
1083
  sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;
1084
  sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_CARD;
1085
  sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
1086
  sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
1087
  SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
1088
 
1089
  hsd->SdTransferErr = errorstate;
1090
 
1091
  return errorstate;
1092
}
1093
 
1094
/**
1095
  * @brief  This function waits until the SD DMA data read transfer is finished.
1096
  *         This API should be called after HAL_SD_ReadBlocks_DMA() function
1097
  *         to insure that all data sent by the card is already transferred by the
1098
  *         DMA controller.
1099
  * @param  hsd: SD handle
1100
  * @param  Timeout: Timeout duration  
1101
  * @retval SD Card error state
1102
  */
1103
HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout)
1104
{
1105
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1106
  uint32_t timeout = Timeout;
1107
  uint32_t tmp1, tmp2;
1108
  HAL_SD_ErrorTypedef tmp3;
1109
 
1110
  /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */
1111
  tmp1 = hsd->DmaTransferCplt;
1112
  tmp2 = hsd->SdTransferCplt;
1113
  tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;
1114
 
1115
  while (((tmp1 & tmp2) == 0) && (tmp3 == SD_OK) && (timeout > 0))
1116
  {
1117
    tmp1 = hsd->DmaTransferCplt;
1118
    tmp2 = hsd->SdTransferCplt;
1119
    tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;    
1120
    timeout--;
1121
  }
1122
 
1123
  timeout = Timeout;
1124
 
1125
  /* Wait until the Rx transfer is no longer active */
1126
  while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXACT)) && (timeout > 0))
1127
  {
1128
    timeout--;  
1129
  }
1130
 
1131
  /* Send stop command in multiblock read */
1132
  if (hsd->SdOperation == SD_READ_MULTIPLE_BLOCK)
1133
  {
1134
    errorstate = HAL_SD_StopTransfer(hsd);
1135
  }
1136
 
1137
  if ((timeout == 0) && (errorstate == SD_OK))
1138
  {
1139
    errorstate = SD_DATA_TIMEOUT;
1140
  }
1141
 
1142
  /* Clear all the static flags */
1143
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1144
 
1145
  /* Return error state */
1146
  if (hsd->SdTransferErr != SD_OK)
1147
  {
1148
    return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr);
1149
  }
1150
 
1151
  return errorstate;
1152
}
1153
 
1154
/**
1155
  * @brief  This function waits until the SD DMA data write transfer is finished.
1156
  *         This API should be called after HAL_SD_WriteBlocks_DMA() function
1157
  *         to insure that all data sent by the card is already transferred by the
1158
  *         DMA controller.
1159
  * @param  hsd: SD handle
1160
  * @param  Timeout: Timeout duration  
1161
  * @retval SD Card error state
1162
  */
1163
HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout)
1164
{
1165
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1166
  uint32_t timeout = Timeout;
1167
  uint32_t tmp1, tmp2;
1168
  HAL_SD_ErrorTypedef tmp3;
1169
 
1170
  /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */
1171
  tmp1 = hsd->DmaTransferCplt;
1172
  tmp2 = hsd->SdTransferCplt;
1173
  tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;
1174
 
1175
  while (((tmp1 & tmp2) == 0) && (tmp3 == SD_OK) && (timeout > 0))
1176
  {
1177
    tmp1 = hsd->DmaTransferCplt;
1178
    tmp2 = hsd->SdTransferCplt;
1179
    tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr;
1180
    timeout--;
1181
  }
1182
 
1183
  timeout = Timeout;
1184
 
1185
  /* Wait until the Tx transfer is no longer active */
1186
  while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXACT))  && (timeout > 0))
1187
  {
1188
    timeout--;  
1189
  }
1190
 
1191
  /* Send stop command in multiblock write */
1192
  if (hsd->SdOperation == SD_WRITE_MULTIPLE_BLOCK)
1193
  {
1194
    errorstate = HAL_SD_StopTransfer(hsd);
1195
  }
1196
 
1197
  if ((timeout == 0) && (errorstate == SD_OK))
1198
  {
1199
    errorstate = SD_DATA_TIMEOUT;
1200
  }
1201
 
1202
  /* Clear all the static flags */
1203
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1204
 
1205
  /* Return error state */
1206
  if (hsd->SdTransferErr != SD_OK)
1207
  {
1208
    return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr);
1209
  }
1210
 
1211
  /* Wait until write is complete */
1212
  while(HAL_SD_GetStatus(hsd) != SD_TRANSFER_OK)
1213
  {    
1214
  }
1215
 
1216
  return errorstate;
1217
}
1218
 
1219
/**
1220
  * @brief  Erases the specified memory area of the given SD card.
1221
  * @param  hsd: SD handle
1222
  * @param  Startaddr: Start byte address
1223
  * @param  Endaddr: End byte address
1224
  * @retval SD Card error state
1225
  */
1226
HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t Startaddr, uint64_t Endaddr)
1227
{
1228
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1229
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
1230
 
1231
  uint32_t delay         = 0;
1232
  __IO uint32_t maxdelay = 0;
1233
  uint8_t cardstate      = 0;
1234
 
1235
  /* Check if the card command class supports erase command */
1236
  if (((hsd->CSD[1] >> 20) & SD_CCCC_ERASE) == 0)
1237
  {
1238
    errorstate = SD_REQUEST_NOT_APPLICABLE;
1239
 
1240
    return errorstate;
1241
  }
1242
 
1243
  /* Get max delay value */
1244
  maxdelay = 120000 / (((hsd->Instance->CLKCR) & 0xFF) + 2);
1245
 
1246
  if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
1247
  {
1248
    errorstate = SD_LOCK_UNLOCK_FAILED;
1249
 
1250
    return errorstate;
1251
  }
1252
 
1253
  /* Get start and end block for high capacity cards */
1254
  if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
1255
  {
1256
    Startaddr /= 512;
1257
    Endaddr   /= 512;
1258
  }
1259
 
1260
  /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
1261
  if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
1262
    (hsd->CardType == HIGH_CAPACITY_SD_CARD))
1263
  {
1264
    /* Send CMD32 SD_ERASE_GRP_START with argument as addr  */
1265
    sdio_cmdinitstructure.Argument         =(uint32_t)Startaddr;
1266
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SD_ERASE_GRP_START;
1267
    sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
1268
    sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
1269
    sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
1270
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1271
 
1272
    /* Check for error conditions */
1273
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_START);
1274
 
1275
    if (errorstate != SD_OK)
1276
    {
1277
      return errorstate;
1278
    }
1279
 
1280
    /* Send CMD33 SD_ERASE_GRP_END with argument as addr  */
1281
    sdio_cmdinitstructure.Argument         = (uint32_t)Endaddr;
1282
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SD_ERASE_GRP_END;
1283
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1284
 
1285
    /* Check for error conditions */
1286
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_END);
1287
 
1288
    if (errorstate != SD_OK)
1289
    {
1290
      return errorstate;
1291
    }
1292
  }
1293
 
1294
  /* Send CMD38 ERASE */
1295
  sdio_cmdinitstructure.Argument         = 0;
1296
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_ERASE;
1297
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1298
 
1299
  /* Check for error conditions */
1300
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_ERASE);
1301
 
1302
  if (errorstate != SD_OK)
1303
  {
1304
    return errorstate;
1305
  }
1306
 
1307
  for (; delay < maxdelay; delay++)
1308
  {
1309
  }
1310
 
1311
  /* Wait untill the card is in programming state */
1312
  errorstate = SD_IsCardProgramming(hsd, &cardstate);
1313
 
1314
  delay = SD_DATATIMEOUT;
1315
 
1316
  while ((delay > 0) && (errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING)))
1317
  {
1318
    errorstate = SD_IsCardProgramming(hsd, &cardstate);
1319
    delay--;
1320
  }
1321
 
1322
  return errorstate;
1323
}
1324
 
1325
/**
1326
  * @brief  This function handles SD card interrupt request.
1327
  * @param  hsd: SD handle
1328
  * @retval None
1329
  */
1330
void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd)
1331
{  
1332
  /* Check for SDIO interrupt flags */
1333
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DATAEND))
1334
  {
1335
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_IT_DATAEND);  
1336
 
1337
    /* SD transfer is complete */
1338
    hsd->SdTransferCplt = 1;
1339
 
1340
    /* No transfer error */
1341
    hsd->SdTransferErr  = SD_OK;
1342
 
1343
    HAL_SD_XferCpltCallback(hsd);  
1344
  }  
1345
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DCRCFAIL))
1346
  {
1347
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
1348
 
1349
    hsd->SdTransferErr = SD_DATA_CRC_FAIL;
1350
 
1351
    HAL_SD_XferErrorCallback(hsd);
1352
 
1353
  }
1354
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DTIMEOUT))
1355
  {
1356
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
1357
 
1358
    hsd->SdTransferErr = SD_DATA_TIMEOUT;
1359
 
1360
    HAL_SD_XferErrorCallback(hsd);
1361
  }
1362
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_RXOVERR))
1363
  {
1364
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
1365
 
1366
    hsd->SdTransferErr = SD_RX_OVERRUN;
1367
 
1368
    HAL_SD_XferErrorCallback(hsd);
1369
  }
1370
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_TXUNDERR))
1371
  {
1372
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR);
1373
 
1374
    hsd->SdTransferErr = SD_TX_UNDERRUN;
1375
 
1376
    HAL_SD_XferErrorCallback(hsd);
1377
  }
1378
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_STBITERR))
1379
  {
1380
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
1381
 
1382
    hsd->SdTransferErr = SD_START_BIT_ERR;
1383
 
1384
    HAL_SD_XferErrorCallback(hsd);
1385
  }
1386
  else
1387
  {
1388
    /* No error flag set */
1389
  }
1390
 
1391
  /* Disable all SDIO peripheral interrupt sources */
1392
  __HAL_SD_SDIO_DISABLE_IT(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND  |\
1393
                                SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |\
1394
                                SDIO_IT_RXOVERR  | SDIO_IT_STBITERR);                              
1395
}
1396
 
1397
 
1398
/**
1399
  * @brief  SD end of transfer callback.
1400
  * @param  hsd: SD handle
1401
  * @retval None
1402
  */
1403
__weak void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd)
1404
{
1405
  /* NOTE : This function Should not be modified, when the callback is needed,
1406
            the HAL_SD_XferCpltCallback could be implemented in the user file
1407
   */
1408
}
1409
 
1410
/**
1411
  * @brief  SD Transfer Error callback.
1412
  * @param  hsd: SD handle
1413
  * @retval None
1414
  */
1415
__weak void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd)
1416
{
1417
  /* NOTE : This function Should not be modified, when the callback is needed,
1418
            the HAL_SD_XferErrorCallback could be implemented in the user file
1419
   */
1420
}
1421
 
1422
/**
1423
  * @brief  SD Transfer complete Rx callback in non blocking mode.
1424
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
1425
  *                the configuration information for the specified DMA module.
1426
  * @retval None
1427
  */
1428
__weak void HAL_SD_DMA_RxCpltCallback(DMA_HandleTypeDef *hdma)
1429
{
1430
  /* NOTE : This function Should not be modified, when the callback is needed,
1431
            the HAL_SD_DMA_RxCpltCallback could be implemented in the user file
1432
   */
1433
}  
1434
 
1435
/**
1436
  * @brief  SD DMA transfer complete Rx error callback.
1437
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
1438
  *                the configuration information for the specified DMA module.
1439
  * @retval None
1440
  */
1441
__weak void HAL_SD_DMA_RxErrorCallback(DMA_HandleTypeDef *hdma)
1442
{
1443
  /* NOTE : This function Should not be modified, when the callback is needed,
1444
            the HAL_SD_DMA_RxErrorCallback could be implemented in the user file
1445
   */
1446
}
1447
 
1448
/**
1449
  * @brief  SD Transfer complete Tx callback in non blocking mode.
1450
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
1451
  *                the configuration information for the specified DMA module.
1452
  * @retval None
1453
  */
1454
__weak void HAL_SD_DMA_TxCpltCallback(DMA_HandleTypeDef *hdma)
1455
{
1456
  /* NOTE : This function Should not be modified, when the callback is needed,
1457
            the HAL_SD_DMA_TxCpltCallback could be implemented in the user file
1458
   */
1459
}  
1460
 
1461
/**
1462
  * @brief  SD DMA transfer complete error Tx callback.
1463
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
1464
  *                the configuration information for the specified DMA module.
1465
  * @retval None
1466
  */
1467
__weak void HAL_SD_DMA_TxErrorCallback(DMA_HandleTypeDef *hdma)
1468
{
1469
  /* NOTE : This function Should not be modified, when the callback is needed,
1470
            the HAL_SD_DMA_TxErrorCallback could be implemented in the user file
1471
   */
1472
}
1473
 
1474
/**
1475
  * @}
1476
  */
1477
 
1478
/** @defgroup SD_Exported_Functions_Group3 Peripheral Control functions
1479
 *  @brief   management functions
1480
 *
1481
@verbatim  
1482
  ==============================================================================
1483
                      ##### Peripheral Control functions #####
1484
  ==============================================================================  
1485
  [..]
1486
    This subsection provides a set of functions allowing to control the SD card
1487
    operations.
1488
 
1489
@endverbatim
1490
  * @{
1491
  */
1492
 
1493
/**
1494
  * @brief  Returns information about specific card.
1495
  * @param  hsd: SD handle
1496
  * @param  pCardInfo: Pointer to a HAL_SD_CardInfoTypedef structure that  
1497
  *         contains all SD cardinformation  
1498
  * @retval SD Card error state
1499
  */
1500
HAL_SD_ErrorTypedef HAL_SD_Get_CardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *pCardInfo)
1501
{
1502
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1503
  uint32_t tmp = 0;
1504
 
1505
  pCardInfo->CardType = (uint8_t)(hsd->CardType);
1506
  pCardInfo->RCA      = (uint16_t)(hsd->RCA);
1507
 
1508
  /* Byte 0 */
1509
  tmp = (hsd->CSD[0] & 0xFF000000) >> 24;
1510
  pCardInfo->SD_csd.CSDStruct      = (uint8_t)((tmp & 0xC0) >> 6);
1511
  pCardInfo->SD_csd.SysSpecVersion = (uint8_t)((tmp & 0x3C) >> 2);
1512
  pCardInfo->SD_csd.Reserved1      = tmp & 0x03;
1513
 
1514
  /* Byte 1 */
1515
  tmp = (hsd->CSD[0] & 0x00FF0000) >> 16;
1516
  pCardInfo->SD_csd.TAAC = (uint8_t)tmp;
1517
 
1518
  /* Byte 2 */
1519
  tmp = (hsd->CSD[0] & 0x0000FF00) >> 8;
1520
  pCardInfo->SD_csd.NSAC = (uint8_t)tmp;
1521
 
1522
  /* Byte 3 */
1523
  tmp = hsd->CSD[0] & 0x000000FF;
1524
  pCardInfo->SD_csd.MaxBusClkFrec = (uint8_t)tmp;
1525
 
1526
  /* Byte 4 */
1527
  tmp = (hsd->CSD[1] & 0xFF000000) >> 24;
1528
  pCardInfo->SD_csd.CardComdClasses = (uint16_t)(tmp << 4);
1529
 
1530
  /* Byte 5 */
1531
  tmp = (hsd->CSD[1] & 0x00FF0000) >> 16;
1532
  pCardInfo->SD_csd.CardComdClasses |= (uint16_t)((tmp & 0xF0) >> 4);
1533
  pCardInfo->SD_csd.RdBlockLen       = (uint8_t)(tmp & 0x0F);
1534
 
1535
  /* Byte 6 */
1536
  tmp = (hsd->CSD[1] & 0x0000FF00) >> 8;
1537
  pCardInfo->SD_csd.PartBlockRead   = (uint8_t)((tmp & 0x80) >> 7);
1538
  pCardInfo->SD_csd.WrBlockMisalign = (uint8_t)((tmp & 0x40) >> 6);
1539
  pCardInfo->SD_csd.RdBlockMisalign = (uint8_t)((tmp & 0x20) >> 5);
1540
  pCardInfo->SD_csd.DSRImpl         = (uint8_t)((tmp & 0x10) >> 4);
1541
  pCardInfo->SD_csd.Reserved2       = 0; /*!< Reserved */
1542
 
1543
  if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0))
1544
  {
1545
    pCardInfo->SD_csd.DeviceSize = (tmp & 0x03) << 10;
1546
 
1547
    /* Byte 7 */
1548
    tmp = (uint8_t)(hsd->CSD[1] & 0x000000FF);
1549
    pCardInfo->SD_csd.DeviceSize |= (tmp) << 2;
1550
 
1551
    /* Byte 8 */
1552
    tmp = (uint8_t)((hsd->CSD[2] & 0xFF000000) >> 24);
1553
    pCardInfo->SD_csd.DeviceSize |= (tmp & 0xC0) >> 6;
1554
 
1555
    pCardInfo->SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38) >> 3;
1556
    pCardInfo->SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07);
1557
 
1558
    /* Byte 9 */
1559
    tmp = (uint8_t)((hsd->CSD[2] & 0x00FF0000) >> 16);
1560
    pCardInfo->SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0) >> 5;
1561
    pCardInfo->SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1C) >> 2;
1562
    pCardInfo->SD_csd.DeviceSizeMul      = (tmp & 0x03) << 1;
1563
    /* Byte 10 */
1564
    tmp = (uint8_t)((hsd->CSD[2] & 0x0000FF00) >> 8);
1565
    pCardInfo->SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
1566
 
1567
    pCardInfo->CardCapacity  = (pCardInfo->SD_csd.DeviceSize + 1) ;
1568
    pCardInfo->CardCapacity *= (1 << (pCardInfo->SD_csd.DeviceSizeMul + 2));
1569
    pCardInfo->CardBlockSize = 1 << (pCardInfo->SD_csd.RdBlockLen);
1570
    pCardInfo->CardCapacity *= pCardInfo->CardBlockSize;
1571
  }
1572
  else if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
1573
  {
1574
    /* Byte 7 */
1575
    tmp = (uint8_t)(hsd->CSD[1] & 0x000000FF);
1576
    pCardInfo->SD_csd.DeviceSize = (tmp & 0x3F) << 16;
1577
 
1578
    /* Byte 8 */
1579
    tmp = (uint8_t)((hsd->CSD[2] & 0xFF000000) >> 24);
1580
 
1581
    pCardInfo->SD_csd.DeviceSize |= (tmp << 8);
1582
 
1583
    /* Byte 9 */
1584
    tmp = (uint8_t)((hsd->CSD[2] & 0x00FF0000) >> 16);
1585
 
1586
    pCardInfo->SD_csd.DeviceSize |= (tmp);
1587
 
1588
    /* Byte 10 */
1589
    tmp = (uint8_t)((hsd->CSD[2] & 0x0000FF00) >> 8);
1590
 
1591
    pCardInfo->CardCapacity  = ((pCardInfo->SD_csd.DeviceSize + 1)) * 512 * 1024;
1592
    pCardInfo->CardBlockSize = 512;    
1593
  }
1594
  else
1595
  {
1596
    /* Not supported card type */
1597
    errorstate = SD_ERROR;
1598
  }
1599
 
1600
  pCardInfo->SD_csd.EraseGrSize = (tmp & 0x40) >> 6;
1601
  pCardInfo->SD_csd.EraseGrMul  = (tmp & 0x3F) << 1;
1602
 
1603
  /* Byte 11 */
1604
  tmp = (uint8_t)(hsd->CSD[2] & 0x000000FF);
1605
  pCardInfo->SD_csd.EraseGrMul     |= (tmp & 0x80) >> 7;
1606
  pCardInfo->SD_csd.WrProtectGrSize = (tmp & 0x7F);
1607
 
1608
  /* Byte 12 */
1609
  tmp = (uint8_t)((hsd->CSD[3] & 0xFF000000) >> 24);
1610
  pCardInfo->SD_csd.WrProtectGrEnable = (tmp & 0x80) >> 7;
1611
  pCardInfo->SD_csd.ManDeflECC        = (tmp & 0x60) >> 5;
1612
  pCardInfo->SD_csd.WrSpeedFact       = (tmp & 0x1C) >> 2;
1613
  pCardInfo->SD_csd.MaxWrBlockLen     = (tmp & 0x03) << 2;
1614
 
1615
  /* Byte 13 */
1616
  tmp = (uint8_t)((hsd->CSD[3] & 0x00FF0000) >> 16);
1617
  pCardInfo->SD_csd.MaxWrBlockLen      |= (tmp & 0xC0) >> 6;
1618
  pCardInfo->SD_csd.WriteBlockPaPartial = (tmp & 0x20) >> 5;
1619
  pCardInfo->SD_csd.Reserved3           = 0;
1620
  pCardInfo->SD_csd.ContentProtectAppli = (tmp & 0x01);
1621
 
1622
  /* Byte 14 */
1623
  tmp = (uint8_t)((hsd->CSD[3] & 0x0000FF00) >> 8);
1624
  pCardInfo->SD_csd.FileFormatGrouop = (tmp & 0x80) >> 7;
1625
  pCardInfo->SD_csd.CopyFlag         = (tmp & 0x40) >> 6;
1626
  pCardInfo->SD_csd.PermWrProtect    = (tmp & 0x20) >> 5;
1627
  pCardInfo->SD_csd.TempWrProtect    = (tmp & 0x10) >> 4;
1628
  pCardInfo->SD_csd.FileFormat       = (tmp & 0x0C) >> 2;
1629
  pCardInfo->SD_csd.ECC              = (tmp & 0x03);
1630
 
1631
  /* Byte 15 */
1632
  tmp = (uint8_t)(hsd->CSD[3] & 0x000000FF);
1633
  pCardInfo->SD_csd.CSD_CRC   = (tmp & 0xFE) >> 1;
1634
  pCardInfo->SD_csd.Reserved4 = 1;
1635
 
1636
  /* Byte 0 */
1637
  tmp = (uint8_t)((hsd->CID[0] & 0xFF000000) >> 24);
1638
  pCardInfo->SD_cid.ManufacturerID = tmp;
1639
 
1640
  /* Byte 1 */
1641
  tmp = (uint8_t)((hsd->CID[0] & 0x00FF0000) >> 16);
1642
  pCardInfo->SD_cid.OEM_AppliID = tmp << 8;
1643
 
1644
  /* Byte 2 */
1645
  tmp = (uint8_t)((hsd->CID[0] & 0x000000FF00) >> 8);
1646
  pCardInfo->SD_cid.OEM_AppliID |= tmp;
1647
 
1648
  /* Byte 3 */
1649
  tmp = (uint8_t)(hsd->CID[0] & 0x000000FF);
1650
  pCardInfo->SD_cid.ProdName1 = tmp << 24;
1651
 
1652
  /* Byte 4 */
1653
  tmp = (uint8_t)((hsd->CID[1] & 0xFF000000) >> 24);
1654
  pCardInfo->SD_cid.ProdName1 |= tmp << 16;
1655
 
1656
  /* Byte 5 */
1657
  tmp = (uint8_t)((hsd->CID[1] & 0x00FF0000) >> 16);
1658
  pCardInfo->SD_cid.ProdName1 |= tmp << 8;
1659
 
1660
  /* Byte 6 */
1661
  tmp = (uint8_t)((hsd->CID[1] & 0x0000FF00) >> 8);
1662
  pCardInfo->SD_cid.ProdName1 |= tmp;
1663
 
1664
  /* Byte 7 */
1665
  tmp = (uint8_t)(hsd->CID[1] & 0x000000FF);
1666
  pCardInfo->SD_cid.ProdName2 = tmp;
1667
 
1668
  /* Byte 8 */
1669
  tmp = (uint8_t)((hsd->CID[2] & 0xFF000000) >> 24);
1670
  pCardInfo->SD_cid.ProdRev = tmp;
1671
 
1672
  /* Byte 9 */
1673
  tmp = (uint8_t)((hsd->CID[2] & 0x00FF0000) >> 16);
1674
  pCardInfo->SD_cid.ProdSN = tmp << 24;
1675
 
1676
  /* Byte 10 */
1677
  tmp = (uint8_t)((hsd->CID[2] & 0x0000FF00) >> 8);
1678
  pCardInfo->SD_cid.ProdSN |= tmp << 16;
1679
 
1680
  /* Byte 11 */
1681
  tmp = (uint8_t)(hsd->CID[2] & 0x000000FF);
1682
  pCardInfo->SD_cid.ProdSN |= tmp << 8;
1683
 
1684
  /* Byte 12 */
1685
  tmp = (uint8_t)((hsd->CID[3] & 0xFF000000) >> 24);
1686
  pCardInfo->SD_cid.ProdSN |= tmp;
1687
 
1688
  /* Byte 13 */
1689
  tmp = (uint8_t)((hsd->CID[3] & 0x00FF0000) >> 16);
1690
  pCardInfo->SD_cid.Reserved1   |= (tmp & 0xF0) >> 4;
1691
  pCardInfo->SD_cid.ManufactDate = (tmp & 0x0F) << 8;
1692
 
1693
  /* Byte 14 */
1694
  tmp = (uint8_t)((hsd->CID[3] & 0x0000FF00) >> 8);
1695
  pCardInfo->SD_cid.ManufactDate |= tmp;
1696
 
1697
  /* Byte 15 */
1698
  tmp = (uint8_t)(hsd->CID[3] & 0x000000FF);
1699
  pCardInfo->SD_cid.CID_CRC   = (tmp & 0xFE) >> 1;
1700
  pCardInfo->SD_cid.Reserved2 = 1;
1701
 
1702
  return errorstate;
1703
}
1704
 
1705
/**
1706
  * @brief  Enables wide bus operation for the requested card if supported by
1707
  *         card.
1708
  * @param  hsd: SD handle      
1709
  * @param  WideMode: Specifies the SD card wide bus mode
1710
  *          This parameter can be one of the following values:
1711
  *            @arg SDIO_BUS_WIDE_8B: 8-bit data transfer (Only for MMC)
1712
  *            @arg SDIO_BUS_WIDE_4B: 4-bit data transfer
1713
  *            @arg SDIO_BUS_WIDE_1B: 1-bit data transfer
1714
  * @retval SD Card error state
1715
  */
1716
HAL_SD_ErrorTypedef HAL_SD_WideBusOperation_Config(SD_HandleTypeDef *hsd, uint32_t WideMode)
1717
{
1718
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1719
  SDIO_InitTypeDef init = {0};
1720
 
1721
  /* MMC Card does not support this feature */
1722
  if (hsd->CardType == MULTIMEDIA_CARD)
1723
  {
1724
    errorstate = SD_UNSUPPORTED_FEATURE;
1725
  }
1726
  else if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
1727
    (hsd->CardType == HIGH_CAPACITY_SD_CARD))
1728
  {
1729
    if (WideMode == SDIO_BUS_WIDE_8B)
1730
    {
1731
      errorstate = SD_UNSUPPORTED_FEATURE;
1732
    }
1733
    else if (WideMode == SDIO_BUS_WIDE_4B)
1734
    {
1735
      errorstate = SD_WideBus_Enable(hsd);
1736
    }
1737
    else if (WideMode == SDIO_BUS_WIDE_1B)
1738
    {
1739
      errorstate = SD_WideBus_Disable(hsd);
1740
    }
1741
    else
1742
    {
1743
      /* WideMode is not a valid argument*/
1744
      errorstate = SD_INVALID_PARAMETER;
1745
    }
1746
 
1747
    if (errorstate == SD_OK)
1748
    {
1749
      /* Configure the SDIO peripheral */
1750
      init.ClockEdge           = hsd->Init.ClockEdge;
1751
      init.ClockBypass         = hsd->Init.ClockBypass;
1752
      init.ClockPowerSave      = hsd->Init.ClockPowerSave;
1753
      init.BusWide             = WideMode;
1754
      init.HardwareFlowControl = hsd->Init.HardwareFlowControl;
1755
      init.ClockDiv            = hsd->Init.ClockDiv;
1756
 
1757
      /* Configure SDIO peripheral interface */
1758
      SDIO_Init(hsd->Instance, init);
1759
    }
1760
    else
1761
    {
1762
      /* An error occured while enabling/disabling the wide bus*/
1763
    }
1764
  }
1765
  else
1766
  {
1767
    /* Not supported card type */
1768
    errorstate = SD_ERROR;
1769
  }
1770
 
1771
  return errorstate;
1772
}
1773
 
1774
/**
1775
  * @brief  Aborts an ongoing data transfer.
1776
  * @param  hsd: SD handle
1777
  * @retval SD Card error state
1778
  */
1779
HAL_SD_ErrorTypedef HAL_SD_StopTransfer(SD_HandleTypeDef *hsd)
1780
{
1781
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
1782
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1783
 
1784
  /* Send CMD12 STOP_TRANSMISSION  */
1785
  sdio_cmdinitstructure.Argument         = 0;
1786
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_STOP_TRANSMISSION;
1787
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
1788
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
1789
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
1790
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1791
 
1792
  /* Check for error conditions */
1793
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_STOP_TRANSMISSION);
1794
 
1795
  return errorstate;
1796
}
1797
 
1798
/**
1799
  * @brief  Switches the SD card to High Speed mode.
1800
  *         This API must be used after "Transfer State"
1801
  * @note   This operation should be followed by the configuration
1802
  *         of PLL to have SDIOCK clock between 67 and 75 MHz
1803
  * @param  hsd: SD handle
1804
  * @retval SD Card error state
1805
  */
1806
HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd)
1807
{
1808
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1809
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
1810
  SDIO_DataInitTypeDef sdio_datainitstructure = {0};
1811
 
1812
  uint8_t SD_hs[64]  = {0};
1813
  uint32_t SD_scr[2] = {0, 0};
1814
  uint32_t SD_SPEC   = 0 ;
1815
  uint32_t count = 0, *tempbuff = (uint32_t *)SD_hs;
1816
 
1817
  /* Initialize the Data control register */
1818
  hsd->Instance->DCTRL = 0;
1819
 
1820
  /* Get SCR Register */
1821
  errorstate = SD_FindSCR(hsd, SD_scr);
1822
 
1823
  if (errorstate != SD_OK)
1824
  {
1825
    return errorstate;
1826
  }
1827
 
1828
  /* Test the Version supported by the card*/
1829
  SD_SPEC = (SD_scr[1]  & 0x01000000) | (SD_scr[1]  & 0x02000000);
1830
 
1831
  if (SD_SPEC != SD_ALLZERO)
1832
  {
1833
    /* Set Block Size for Card */
1834
    sdio_cmdinitstructure.Argument         = (uint32_t)64;
1835
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
1836
    sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
1837
    sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
1838
    sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
1839
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1840
 
1841
    /* Check for error conditions */
1842
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
1843
 
1844
    if (errorstate != SD_OK)
1845
    {
1846
      return errorstate;
1847
    }
1848
 
1849
    /* Configure the SD DPSM (Data Path State Machine) */
1850
    sdio_datainitstructure.DataTimeOut   = SD_DATATIMEOUT;
1851
    sdio_datainitstructure.DataLength    = 64;
1852
    sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B ;
1853
    sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
1854
    sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
1855
    sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
1856
    SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
1857
 
1858
    /* Send CMD6 switch mode */
1859
    sdio_cmdinitstructure.Argument         = 0x80FFFF01;
1860
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_HS_SWITCH;
1861
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1862
 
1863
    /* Check for error conditions */
1864
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_HS_SWITCH);
1865
 
1866
    if (errorstate != SD_OK)
1867
    {
1868
      return errorstate;
1869
    }
1870
 
1871
    while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
1872
    {
1873
      if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
1874
      {
1875
        for (count = 0; count < 8; count++)
1876
        {
1877
          *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance);
1878
        }
1879
 
1880
        tempbuff += 8;
1881
      }
1882
    }
1883
 
1884
    if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
1885
    {
1886
      __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
1887
 
1888
      errorstate = SD_DATA_TIMEOUT;
1889
 
1890
      return errorstate;
1891
    }
1892
    else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
1893
    {
1894
      __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
1895
 
1896
      errorstate = SD_DATA_CRC_FAIL;
1897
 
1898
      return errorstate;
1899
    }
1900
    else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
1901
    {
1902
      __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
1903
 
1904
      errorstate = SD_RX_OVERRUN;
1905
 
1906
      return errorstate;
1907
    }
1908
    else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
1909
    {
1910
      __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
1911
 
1912
      errorstate = SD_START_BIT_ERR;
1913
 
1914
      return errorstate;
1915
    }
1916
    else
1917
    {
1918
      /* No error flag set */
1919
    }
1920
 
1921
    count = SD_DATATIMEOUT;
1922
 
1923
    while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0))
1924
    {
1925
      *tempbuff = SDIO_ReadFIFO(hsd->Instance);
1926
      tempbuff++;
1927
      count--;
1928
    }
1929
 
1930
    /* Clear all the static flags */
1931
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
1932
 
1933
    /* Test if the switch mode HS is ok */
1934
    if ((SD_hs[13]& 2) != 2)
1935
    {
1936
      errorstate = SD_UNSUPPORTED_FEATURE;
1937
    }
1938
  }
1939
 
1940
  return errorstate;
1941
}
1942
 
1943
/**
1944
  * @}
1945
  */
1946
 
1947
/** @defgroup SD_Exported_Functions_Group4 Peripheral State functions
1948
 *  @brief   Peripheral State functions
1949
 *
1950
@verbatim  
1951
  ==============================================================================
1952
                      ##### Peripheral State functions #####
1953
  ==============================================================================  
1954
  [..]
1955
    This subsection permits to get in runtime the status of the peripheral
1956
    and the data flow.
1957
 
1958
@endverbatim
1959
  * @{
1960
  */
1961
 
1962
/**
1963
  * @brief  Returns the current SD card's status.
1964
  * @param  hsd: SD handle
1965
  * @param  pSDstatus: Pointer to the buffer that will contain the SD card status
1966
  *         SD Status register)
1967
  * @retval SD Card error state
1968
  */
1969
HAL_SD_ErrorTypedef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus)
1970
{
1971
  SDIO_CmdInitTypeDef  sdio_cmdinitstructure = {0};
1972
  SDIO_DataInitTypeDef sdio_datainitstructure = {0};
1973
  HAL_SD_ErrorTypedef errorstate = SD_OK;
1974
  uint32_t count = 0;
1975
 
1976
  /* Check SD response */
1977
  if ((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
1978
  {
1979
    errorstate = SD_LOCK_UNLOCK_FAILED;
1980
 
1981
    return errorstate;
1982
  }
1983
 
1984
  /* Set block size for card if it is not equal to current block size for card */
1985
  sdio_cmdinitstructure.Argument         = 64;
1986
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
1987
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
1988
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
1989
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
1990
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
1991
 
1992
  /* Check for error conditions */
1993
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
1994
 
1995
  if (errorstate != SD_OK)
1996
  {
1997
    return errorstate;
1998
  }
1999
 
2000
  /* Send CMD55 */
2001
  sdio_cmdinitstructure.Argument         = (uint32_t)(hsd->RCA << 16);
2002
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
2003
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2004
 
2005
  /* Check for error conditions */
2006
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
2007
 
2008
  if (errorstate != SD_OK)
2009
  {
2010
    return errorstate;
2011
  }
2012
 
2013
  /* Configure the SD DPSM (Data Path State Machine) */
2014
  sdio_datainitstructure.DataTimeOut   = SD_DATATIMEOUT;
2015
  sdio_datainitstructure.DataLength    = 64;
2016
  sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B;
2017
  sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
2018
  sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
2019
  sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
2020
  SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
2021
 
2022
  /* Send ACMD13 (SD_APP_STAUS)  with argument as card's RCA */
2023
  sdio_cmdinitstructure.Argument         = 0;
2024
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SD_APP_STATUS;
2025
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2026
 
2027
  /* Check for error conditions */
2028
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_STATUS);
2029
 
2030
  if (errorstate != SD_OK)
2031
  {
2032
    return errorstate;
2033
  }
2034
 
2035
  /* Get status data */
2036
  while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
2037
  {
2038
    if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF))
2039
    {
2040
      for (count = 0; count < 8; count++)
2041
      {
2042
        *(pSDstatus + count) = SDIO_ReadFIFO(hsd->Instance);
2043
      }
2044
 
2045
      pSDstatus += 8;
2046
    }
2047
  }
2048
 
2049
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
2050
  {
2051
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
2052
 
2053
    errorstate = SD_DATA_TIMEOUT;
2054
 
2055
    return errorstate;
2056
  }
2057
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
2058
  {
2059
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
2060
 
2061
    errorstate = SD_DATA_CRC_FAIL;
2062
 
2063
    return errorstate;
2064
  }
2065
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
2066
  {
2067
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
2068
 
2069
    errorstate = SD_RX_OVERRUN;
2070
 
2071
    return errorstate;
2072
  }
2073
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
2074
  {
2075
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
2076
 
2077
    errorstate = SD_START_BIT_ERR;
2078
 
2079
    return errorstate;
2080
  }
2081
  else
2082
  {
2083
    /* No error flag set */
2084
  }
2085
 
2086
  count = SD_DATATIMEOUT;
2087
  while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0))
2088
  {
2089
    *pSDstatus = SDIO_ReadFIFO(hsd->Instance);
2090
    pSDstatus++;
2091
    count--;
2092
  }
2093
 
2094
  /* Clear all the static status flags*/
2095
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2096
 
2097
  return errorstate;
2098
}
2099
 
2100
/**
2101
  * @brief  Gets the current sd card data status.
2102
  * @param  hsd: SD handle
2103
  * @retval Data Transfer state
2104
  */
2105
HAL_SD_TransferStateTypedef HAL_SD_GetStatus(SD_HandleTypeDef *hsd)
2106
{
2107
  HAL_SD_CardStateTypedef cardstate =  SD_CARD_TRANSFER;
2108
 
2109
  /* Get SD card state */
2110
  cardstate = SD_GetState(hsd);
2111
 
2112
  /* Find SD status according to card state*/
2113
  if (cardstate == SD_CARD_TRANSFER)
2114
  {
2115
    return SD_TRANSFER_OK;
2116
  }
2117
  else if(cardstate == SD_CARD_ERROR)
2118
  {
2119
    return SD_TRANSFER_ERROR;
2120
  }
2121
  else
2122
  {
2123
    return SD_TRANSFER_BUSY;
2124
  }
2125
}
2126
 
2127
/**
2128
  * @brief  Gets the SD card status.
2129
  * @param  hsd: SD handle      
2130
  * @param  pCardStatus: Pointer to the HAL_SD_CardStatusTypedef structure that
2131
  *         will contain the SD card status information
2132
  * @retval SD Card error state
2133
  */
2134
HAL_SD_ErrorTypedef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pCardStatus)
2135
{
2136
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2137
  uint32_t tmp = 0;
2138
  uint32_t sd_status[16];
2139
 
2140
  errorstate = HAL_SD_SendSDStatus(hsd, sd_status);
2141
 
2142
  if (errorstate  != SD_OK)
2143
  {
2144
    return errorstate;
2145
  }
2146
 
2147
  /* Byte 0 */
2148
  tmp = (sd_status[0] & 0xC0) >> 6;
2149
  pCardStatus->DAT_BUS_WIDTH = (uint8_t)tmp;
2150
 
2151
  /* Byte 0 */
2152
  tmp = (sd_status[0] & 0x20) >> 5;
2153
  pCardStatus->SECURED_MODE = (uint8_t)tmp;
2154
 
2155
  /* Byte 2 */
2156
  tmp = (sd_status[2] & 0xFF);
2157
  pCardStatus->SD_CARD_TYPE = (uint8_t)(tmp << 8);
2158
 
2159
  /* Byte 3 */
2160
  tmp = (sd_status[3] & 0xFF);
2161
  pCardStatus->SD_CARD_TYPE |= (uint8_t)tmp;
2162
 
2163
  /* Byte 4 */
2164
  tmp = (sd_status[4] & 0xFF);
2165
  pCardStatus->SIZE_OF_PROTECTED_AREA = (uint8_t)(tmp << 24);
2166
 
2167
  /* Byte 5 */
2168
  tmp = (sd_status[5] & 0xFF);
2169
  pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 16);
2170
 
2171
  /* Byte 6 */
2172
  tmp = (sd_status[6] & 0xFF);
2173
  pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 8);
2174
 
2175
  /* Byte 7 */
2176
  tmp = (sd_status[7] & 0xFF);
2177
  pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)tmp;
2178
 
2179
  /* Byte 8 */
2180
  tmp = (sd_status[8] & 0xFF);
2181
  pCardStatus->SPEED_CLASS = (uint8_t)tmp;
2182
 
2183
  /* Byte 9 */
2184
  tmp = (sd_status[9] & 0xFF);
2185
  pCardStatus->PERFORMANCE_MOVE = (uint8_t)tmp;
2186
 
2187
  /* Byte 10 */
2188
  tmp = (sd_status[10] & 0xF0) >> 4;
2189
  pCardStatus->AU_SIZE = (uint8_t)tmp;
2190
 
2191
  /* Byte 11 */
2192
  tmp = (sd_status[11] & 0xFF);
2193
  pCardStatus->ERASE_SIZE = (uint8_t)(tmp << 8);
2194
 
2195
  /* Byte 12 */
2196
  tmp = (sd_status[12] & 0xFF);
2197
  pCardStatus->ERASE_SIZE |= (uint8_t)tmp;
2198
 
2199
  /* Byte 13 */
2200
  tmp = (sd_status[13] & 0xFC) >> 2;
2201
  pCardStatus->ERASE_TIMEOUT = (uint8_t)tmp;
2202
 
2203
  /* Byte 13 */
2204
  tmp = (sd_status[13] & 0x3);
2205
  pCardStatus->ERASE_OFFSET = (uint8_t)tmp;
2206
 
2207
  return errorstate;
2208
}
2209
 
2210
/**
2211
  * @}
2212
  */
2213
 
2214
/**
2215
  * @}
2216
  */
2217
 
2218
/** @addtogroup SD_Private_Functions
2219
  * @{
2220
  */
2221
 
2222
/**
2223
  * @brief  SD DMA transfer complete Rx callback.
2224
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
2225
  *                the configuration information for the specified DMA module.
2226
  * @retval None
2227
  */
2228
static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma)
2229
{
2230
  SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
2231
 
2232
  /* DMA transfer is complete */
2233
  hsd->DmaTransferCplt = 1;
2234
 
2235
  /* Wait until SD transfer is complete */
2236
  while(hsd->SdTransferCplt == 0)
2237
  {
2238
  }
2239
 
2240
  /* Transfer complete user callback */
2241
  HAL_SD_DMA_RxCpltCallback(hsd->hdmarx);  
2242
}
2243
 
2244
/**
2245
  * @brief  SD DMA transfer Error Rx callback.
2246
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
2247
  *                the configuration information for the specified DMA module.
2248
  * @retval None
2249
  */
2250
static void SD_DMA_RxError(DMA_HandleTypeDef *hdma)
2251
{
2252
  SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
2253
 
2254
  /* Transfer complete user callback */
2255
  HAL_SD_DMA_RxErrorCallback(hsd->hdmarx);
2256
}
2257
 
2258
/**
2259
  * @brief  SD DMA transfer complete Tx callback.
2260
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
2261
  *                the configuration information for the specified DMA module.
2262
  * @retval None
2263
  */
2264
static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma)
2265
{
2266
  SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent;
2267
 
2268
  /* DMA transfer is complete */
2269
  hsd->DmaTransferCplt = 1;
2270
 
2271
  /* Wait until SD transfer is complete */
2272
  while(hsd->SdTransferCplt == 0)
2273
  {
2274
  }
2275
 
2276
  /* Transfer complete user callback */
2277
  HAL_SD_DMA_TxCpltCallback(hsd->hdmatx);  
2278
}
2279
 
2280
/**
2281
  * @brief  SD DMA transfer Error Tx callback.
2282
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
2283
  *                the configuration information for the specified DMA module.
2284
  * @retval None
2285
  */
2286
static void SD_DMA_TxError(DMA_HandleTypeDef *hdma)
2287
{
2288
  SD_HandleTypeDef *hsd = ( SD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2289
 
2290
  /* Transfer complete user callback */
2291
  HAL_SD_DMA_TxErrorCallback(hsd->hdmatx);
2292
}
2293
 
2294
/**
2295
  * @brief  Returns the SD current state.
2296
  * @param  hsd: SD handle
2297
  * @retval SD card current state
2298
  */
2299
static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd)
2300
{
2301
  uint32_t resp1 = 0;
2302
 
2303
  if (SD_SendStatus(hsd, &resp1) != SD_OK)
2304
  {
2305
    return SD_CARD_ERROR;
2306
  }
2307
  else
2308
  {
2309
    return (HAL_SD_CardStateTypedef)((resp1 >> 9) & 0x0F);
2310
  }
2311
}
2312
 
2313
/**
2314
  * @brief  Initializes all cards or single card as the case may be Card(s) come
2315
  *         into standby state.
2316
  * @param  hsd: SD handle
2317
  * @retval SD Card error state
2318
  */
2319
static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd)
2320
{
2321
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
2322
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2323
  uint16_t sd_rca = 1;
2324
 
2325
  if(SDIO_GetPowerState(hsd->Instance) == 0) /* Power off */
2326
  {
2327
    errorstate = SD_REQUEST_NOT_APPLICABLE;
2328
 
2329
    return errorstate;
2330
  }
2331
 
2332
  if(hsd->CardType != SECURE_DIGITAL_IO_CARD)
2333
  {
2334
    /* Send CMD2 ALL_SEND_CID */
2335
    sdio_cmdinitstructure.Argument         = 0;
2336
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_ALL_SEND_CID;
2337
    sdio_cmdinitstructure.Response         = SDIO_RESPONSE_LONG;
2338
    sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
2339
    sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
2340
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2341
 
2342
    /* Check for error conditions */
2343
    errorstate = SD_CmdResp2Error(hsd);
2344
 
2345
    if(errorstate != SD_OK)
2346
    {
2347
      return errorstate;
2348
    }
2349
 
2350
    /* Get Card identification number data */
2351
    hsd->CID[0] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2352
    hsd->CID[1] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2353
    hsd->CID[2] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2354
    hsd->CID[3] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2355
  }
2356
 
2357
  if((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1)    || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\
2358
     (hsd->CardType == SECURE_DIGITAL_IO_COMBO_CARD) || (hsd->CardType == HIGH_CAPACITY_SD_CARD))
2359
  {
2360
    /* Send CMD3 SET_REL_ADDR with argument 0 */
2361
    /* SD Card publishes its RCA. */
2362
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_REL_ADDR;
2363
    sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
2364
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2365
 
2366
    /* Check for error conditions */
2367
    errorstate = SD_CmdResp6Error(hsd, SD_CMD_SET_REL_ADDR, &sd_rca);
2368
 
2369
    if(errorstate != SD_OK)
2370
    {
2371
      return errorstate;
2372
    }
2373
  }
2374
 
2375
  if (hsd->CardType != SECURE_DIGITAL_IO_CARD)
2376
  {
2377
    /* Get the SD card RCA */
2378
    hsd->RCA = sd_rca;
2379
 
2380
    /* Send CMD9 SEND_CSD with argument as card's RCA */
2381
    sdio_cmdinitstructure.Argument         = (uint32_t)(hsd->RCA << 16);
2382
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_SEND_CSD;
2383
    sdio_cmdinitstructure.Response         = SDIO_RESPONSE_LONG;
2384
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2385
 
2386
    /* Check for error conditions */
2387
    errorstate = SD_CmdResp2Error(hsd);
2388
 
2389
    if(errorstate != SD_OK)
2390
    {
2391
      return errorstate;
2392
    }
2393
 
2394
    /* Get Card Specific Data */
2395
    hsd->CSD[0] = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2396
    hsd->CSD[1] = SDIO_GetResponse(hsd->Instance, SDIO_RESP2);
2397
    hsd->CSD[2] = SDIO_GetResponse(hsd->Instance, SDIO_RESP3);
2398
    hsd->CSD[3] = SDIO_GetResponse(hsd->Instance, SDIO_RESP4);
2399
  }
2400
 
2401
  /* All cards are initialized */
2402
  return errorstate;
2403
}
2404
 
2405
/**
2406
  * @brief  Selects od Deselects the corresponding card.
2407
  * @param  hsd: SD handle
2408
  * @param  Addr: Address of the card to be selected  
2409
  * @retval SD Card error state
2410
  */
2411
static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t Addr)
2412
{
2413
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
2414
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2415
 
2416
  /* Send CMD7 SDIO_SEL_DESEL_CARD */
2417
  sdio_cmdinitstructure.Argument         = (uint32_t)Addr;
2418
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SEL_DESEL_CARD;
2419
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
2420
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
2421
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
2422
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2423
 
2424
  /* Check for error conditions */
2425
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEL_DESEL_CARD);
2426
 
2427
  return errorstate;
2428
}
2429
 
2430
/**
2431
  * @brief  Enquires cards about their operating voltage and configures clock
2432
  *         controls and stores SD information that will be needed in future
2433
  *         in the SD handle.
2434
  * @param  hsd: SD handle
2435
  * @retval SD Card error state
2436
  */
2437
static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd)
2438
{
2439
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
2440
  __IO HAL_SD_ErrorTypedef errorstate = SD_OK;
2441
  uint32_t response = 0, count = 0, validvoltage = 0;
2442
  uint32_t sdtype = SD_STD_CAPACITY;
2443
 
2444
  /* Power ON Sequence -------------------------------------------------------*/
2445
  /* Disable SDIO Clock */
2446
  __HAL_SD_SDIO_DISABLE(hsd);
2447
 
2448
  /* Set Power State to ON */
2449
  SDIO_PowerState_ON(hsd->Instance);
2450
 
2451
  /* 1ms: required power up waiting time before starting the SD initialization
2452
     sequence */
2453
  HAL_Delay(1);
2454
 
2455
  /* Enable SDIO Clock */
2456
  __HAL_SD_SDIO_ENABLE(hsd);
2457
 
2458
  /* CMD0: GO_IDLE_STATE -----------------------------------------------------*/
2459
  /* No CMD response required */
2460
  sdio_cmdinitstructure.Argument         = 0;
2461
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_GO_IDLE_STATE;
2462
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_NO;
2463
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
2464
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
2465
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2466
 
2467
  /* Check for error conditions */
2468
  errorstate = SD_CmdError(hsd);
2469
 
2470
  if(errorstate != SD_OK)
2471
  {
2472
    /* CMD Response TimeOut (wait for CMDSENT flag) */
2473
    return errorstate;
2474
  }
2475
 
2476
  /* CMD8: SEND_IF_COND ------------------------------------------------------*/
2477
  /* Send CMD8 to verify SD card interface operating condition */
2478
  /* Argument: - [31:12]: Reserved (shall be set to '0')
2479
  - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
2480
  - [7:0]: Check Pattern (recommended 0xAA) */
2481
  /* CMD Response: R7 */
2482
  sdio_cmdinitstructure.Argument         = SD_CHECK_PATTERN;
2483
  sdio_cmdinitstructure.CmdIndex         = SD_SDIO_SEND_IF_COND;
2484
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
2485
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2486
 
2487
  /* Check for error conditions */
2488
  errorstate = SD_CmdResp7Error(hsd);
2489
 
2490
  if (errorstate == SD_OK)
2491
  {
2492
    /* SD Card 2.0 */
2493
    hsd->CardType = STD_CAPACITY_SD_CARD_V2_0;
2494
    sdtype        = SD_HIGH_CAPACITY;
2495
  }
2496
 
2497
  /* Send CMD55 */
2498
  sdio_cmdinitstructure.Argument         = 0;
2499
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
2500
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2501
 
2502
  /* Check for error conditions */
2503
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
2504
 
2505
  /* If errorstate is Command TimeOut, it is a MMC card */
2506
  /* If errorstate is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
2507
     or SD card 1.x */
2508
  if(errorstate == SD_OK)
2509
  {
2510
    /* SD CARD */
2511
    /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
2512
    while((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
2513
    {
2514
 
2515
      /* SEND CMD55 APP_CMD with RCA as 0 */
2516
      sdio_cmdinitstructure.Argument         = 0;
2517
      sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
2518
      sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
2519
      sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
2520
      sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
2521
      SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2522
 
2523
      /* Check for error conditions */
2524
      errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
2525
 
2526
      if(errorstate != SD_OK)
2527
      {
2528
        return errorstate;
2529
      }
2530
 
2531
      /* Send CMD41 */
2532
      sdio_cmdinitstructure.Argument         = SD_VOLTAGE_WINDOW_SD | sdtype;
2533
      sdio_cmdinitstructure.CmdIndex         = SD_CMD_SD_APP_OP_COND;
2534
      sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
2535
      sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
2536
      sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
2537
      SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2538
 
2539
      /* Check for error conditions */
2540
      errorstate = SD_CmdResp3Error(hsd);
2541
 
2542
      if(errorstate != SD_OK)
2543
      {
2544
        return errorstate;
2545
      }
2546
 
2547
      /* Get command response */
2548
      response = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2549
 
2550
      /* Get operating voltage*/
2551
      validvoltage = (((response >> 31) == 1) ? 1 : 0);
2552
 
2553
      count++;
2554
    }
2555
 
2556
    if(count >= SD_MAX_VOLT_TRIAL)
2557
    {
2558
      errorstate = SD_INVALID_VOLTRANGE;
2559
 
2560
      return errorstate;
2561
    }
2562
 
2563
    if((response & SD_HIGH_CAPACITY) == SD_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */
2564
    {
2565
      hsd->CardType = HIGH_CAPACITY_SD_CARD;
2566
    }
2567
 
2568
  } /* else MMC Card */
2569
 
2570
  return errorstate;
2571
}
2572
 
2573
/**
2574
  * @brief  Turns the SDIO output signals off.
2575
  * @param  hsd: SD handle
2576
  * @retval SD Card error state
2577
  */
2578
static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd)
2579
{
2580
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2581
 
2582
  /* Set Power State to OFF */
2583
  SDIO_PowerState_OFF(hsd->Instance);
2584
 
2585
  return errorstate;
2586
}
2587
 
2588
/**
2589
  * @brief  Returns the current card's status.
2590
  * @param  hsd: SD handle
2591
  * @param  pCardStatus: pointer to the buffer that will contain the SD card
2592
  *         status (Card Status register)  
2593
  * @retval SD Card error state
2594
  */
2595
static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus)
2596
{
2597
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
2598
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2599
 
2600
  if(pCardStatus == NULL)
2601
  {
2602
    errorstate = SD_INVALID_PARAMETER;
2603
 
2604
    return errorstate;
2605
  }
2606
 
2607
  /* Send Status command */
2608
  sdio_cmdinitstructure.Argument         = (uint32_t)(hsd->RCA << 16);
2609
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SEND_STATUS;
2610
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
2611
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
2612
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
2613
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
2614
 
2615
  /* Check for error conditions */
2616
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEND_STATUS);
2617
 
2618
  if(errorstate != SD_OK)
2619
  {
2620
    return errorstate;
2621
  }
2622
 
2623
  /* Get SD card status */
2624
  *pCardStatus = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2625
 
2626
  return errorstate;
2627
}
2628
 
2629
/**
2630
  * @brief  Checks for error conditions for CMD0.
2631
  * @param  hsd: SD handle
2632
  * @retval SD Card error state
2633
  */
2634
static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd)
2635
{
2636
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2637
  uint32_t timeout = SDIO_CMD0TIMEOUT, tmp;
2638
 
2639
  tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT);
2640
 
2641
  while((timeout > 0) && (!tmp))
2642
  {
2643
    tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT);
2644
    timeout--;
2645
  }
2646
 
2647
  if(timeout == 0)
2648
  {
2649
    errorstate = SD_CMD_RSP_TIMEOUT;
2650
    return errorstate;
2651
  }
2652
 
2653
  /* Clear all the static flags */
2654
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2655
 
2656
  return errorstate;
2657
}
2658
 
2659
/**
2660
  * @brief  Checks for error conditions for R7 response.
2661
  * @param  hsd: SD handle
2662
  * @retval SD Card error state
2663
  */
2664
static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd)
2665
{
2666
  HAL_SD_ErrorTypedef errorstate = SD_ERROR;
2667
  uint32_t timeout = SDIO_CMD0TIMEOUT, tmp;
2668
 
2669
  tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT);
2670
 
2671
  while((!tmp) && (timeout > 0))
2672
  {
2673
    tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT);
2674
    timeout--;
2675
  }
2676
 
2677
  tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
2678
 
2679
  if((timeout == 0) || tmp)
2680
  {
2681
    /* Card is not V2.0 compliant or card does not support the set voltage range */
2682
    errorstate = SD_CMD_RSP_TIMEOUT;
2683
 
2684
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
2685
 
2686
    return errorstate;
2687
  }
2688
 
2689
  if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDREND))
2690
  {
2691
    /* Card is SD V2.0 compliant */
2692
    errorstate = SD_OK;
2693
 
2694
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CMDREND);
2695
 
2696
    return errorstate;
2697
  }
2698
 
2699
  return errorstate;
2700
}
2701
 
2702
/**
2703
  * @brief  Checks for error conditions for R1 response.
2704
  * @param  hsd: SD handle
2705
  * @param  SD_CMD: The sent command index  
2706
  * @retval SD Card error state
2707
  */
2708
static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD)
2709
{
2710
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2711
  uint32_t response_r1 = 0;
2712
 
2713
  while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
2714
  {
2715
  }
2716
 
2717
  if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
2718
  {
2719
    errorstate = SD_CMD_RSP_TIMEOUT;
2720
 
2721
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
2722
 
2723
    return errorstate;
2724
  }
2725
  else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
2726
  {
2727
    errorstate = SD_CMD_CRC_FAIL;
2728
 
2729
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
2730
 
2731
    return errorstate;
2732
  }
2733
  else
2734
  {
2735
    /* No error flag set */
2736
  }
2737
 
2738
  /* Check response received is of desired command */
2739
  if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD)
2740
  {
2741
    errorstate = SD_ILLEGAL_CMD;
2742
 
2743
    return errorstate;
2744
  }
2745
 
2746
  /* Clear all the static flags */
2747
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2748
 
2749
  /* We have received response, retrieve it for analysis  */
2750
  response_r1 = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2751
 
2752
  if((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
2753
  {
2754
    return errorstate;
2755
  }
2756
 
2757
  if((response_r1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE)
2758
  {
2759
    return(SD_ADDR_OUT_OF_RANGE);
2760
  }
2761
 
2762
  if((response_r1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED)
2763
  {
2764
    return(SD_ADDR_MISALIGNED);
2765
  }
2766
 
2767
  if((response_r1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR)
2768
  {
2769
    return(SD_BLOCK_LEN_ERR);
2770
  }
2771
 
2772
  if((response_r1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR)
2773
  {
2774
    return(SD_ERASE_SEQ_ERR);
2775
  }
2776
 
2777
  if((response_r1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM)
2778
  {
2779
    return(SD_BAD_ERASE_PARAM);
2780
  }
2781
 
2782
  if((response_r1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION)
2783
  {
2784
    return(SD_WRITE_PROT_VIOLATION);
2785
  }
2786
 
2787
  if((response_r1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED)
2788
  {
2789
    return(SD_LOCK_UNLOCK_FAILED);
2790
  }
2791
 
2792
  if((response_r1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED)
2793
  {
2794
    return(SD_COM_CRC_FAILED);
2795
  }
2796
 
2797
  if((response_r1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD)
2798
  {
2799
    return(SD_ILLEGAL_CMD);
2800
  }
2801
 
2802
  if((response_r1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED)
2803
  {
2804
    return(SD_CARD_ECC_FAILED);
2805
  }
2806
 
2807
  if((response_r1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR)
2808
  {
2809
    return(SD_CC_ERROR);
2810
  }
2811
 
2812
  if((response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR)
2813
  {
2814
    return(SD_GENERAL_UNKNOWN_ERROR);
2815
  }
2816
 
2817
  if((response_r1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN)
2818
  {
2819
    return(SD_STREAM_READ_UNDERRUN);
2820
  }
2821
 
2822
  if((response_r1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN)
2823
  {
2824
    return(SD_STREAM_WRITE_OVERRUN);
2825
  }
2826
 
2827
  if((response_r1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE)
2828
  {
2829
    return(SD_CID_CSD_OVERWRITE);
2830
  }
2831
 
2832
  if((response_r1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP)
2833
  {
2834
    return(SD_WP_ERASE_SKIP);
2835
  }
2836
 
2837
  if((response_r1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED)
2838
  {
2839
    return(SD_CARD_ECC_DISABLED);
2840
  }
2841
 
2842
  if((response_r1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET)
2843
  {
2844
    return(SD_ERASE_RESET);
2845
  }
2846
 
2847
  if((response_r1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR)
2848
  {
2849
    return(SD_AKE_SEQ_ERROR);
2850
  }
2851
 
2852
  return errorstate;
2853
}
2854
 
2855
/**
2856
  * @brief  Checks for error conditions for R3 (OCR) response.
2857
  * @param  hsd: SD handle
2858
  * @retval SD Card error state
2859
  */
2860
static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd)
2861
{
2862
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2863
 
2864
  while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
2865
  {
2866
  }
2867
 
2868
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
2869
  {
2870
    errorstate = SD_CMD_RSP_TIMEOUT;
2871
 
2872
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
2873
 
2874
    return errorstate;
2875
  }
2876
 
2877
  /* Clear all the static flags */
2878
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2879
 
2880
  return errorstate;
2881
}
2882
 
2883
/**
2884
  * @brief  Checks for error conditions for R2 (CID or CSD) response.
2885
  * @param  hsd: SD handle
2886
  * @retval SD Card error state
2887
  */
2888
static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd)
2889
{
2890
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2891
 
2892
  while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
2893
  {
2894
  }
2895
 
2896
  if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
2897
  {
2898
    errorstate = SD_CMD_RSP_TIMEOUT;
2899
 
2900
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
2901
 
2902
    return errorstate;
2903
  }
2904
  else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
2905
  {
2906
    errorstate = SD_CMD_CRC_FAIL;
2907
 
2908
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
2909
 
2910
    return errorstate;
2911
  }
2912
  else
2913
  {
2914
    /* No error flag set */
2915
  }
2916
 
2917
  /* Clear all the static flags */
2918
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2919
 
2920
  return errorstate;
2921
}
2922
 
2923
/**
2924
  * @brief  Checks for error conditions for R6 (RCA) response.
2925
  * @param  hsd: SD handle
2926
  * @param  SD_CMD: The sent command index
2927
  * @param  pRCA: Pointer to the variable that will contain the SD card relative
2928
  *         address RCA  
2929
  * @retval SD Card error state
2930
  */
2931
static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA)
2932
{
2933
  HAL_SD_ErrorTypedef errorstate = SD_OK;
2934
  uint32_t response_r1 = 0;
2935
 
2936
  while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
2937
  {
2938
  }
2939
 
2940
  if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
2941
  {
2942
    errorstate = SD_CMD_RSP_TIMEOUT;
2943
 
2944
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
2945
 
2946
    return errorstate;
2947
  }
2948
  else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
2949
  {
2950
    errorstate = SD_CMD_CRC_FAIL;
2951
 
2952
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
2953
 
2954
    return errorstate;
2955
  }
2956
  else
2957
  {
2958
    /* No error flag set */
2959
  }
2960
 
2961
  /* Check response received is of desired command */
2962
  if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD)
2963
  {
2964
    errorstate = SD_ILLEGAL_CMD;
2965
 
2966
    return errorstate;
2967
  }
2968
 
2969
  /* Clear all the static flags */
2970
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
2971
 
2972
  /* We have received response, retrieve it.  */
2973
  response_r1 = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
2974
 
2975
  if((response_r1 & (SD_R6_GENERAL_UNKNOWN_ERROR | SD_R6_ILLEGAL_CMD | SD_R6_COM_CRC_FAILED)) == SD_ALLZERO)
2976
  {
2977
    *pRCA = (uint16_t) (response_r1 >> 16);
2978
 
2979
    return errorstate;
2980
  }
2981
 
2982
  if((response_r1 & SD_R6_GENERAL_UNKNOWN_ERROR) == SD_R6_GENERAL_UNKNOWN_ERROR)
2983
  {
2984
    return(SD_GENERAL_UNKNOWN_ERROR);
2985
  }
2986
 
2987
  if((response_r1 & SD_R6_ILLEGAL_CMD) == SD_R6_ILLEGAL_CMD)
2988
  {
2989
    return(SD_ILLEGAL_CMD);
2990
  }
2991
 
2992
  if((response_r1 & SD_R6_COM_CRC_FAILED) == SD_R6_COM_CRC_FAILED)
2993
  {
2994
    return(SD_COM_CRC_FAILED);
2995
  }
2996
 
2997
  return errorstate;
2998
}
2999
 
3000
/**
3001
  * @brief  Enables the SDIO wide bus mode.
3002
  * @param  hsd: SD handle
3003
  * @retval SD Card error state
3004
  */
3005
static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd)
3006
{
3007
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
3008
  HAL_SD_ErrorTypedef errorstate = SD_OK;
3009
 
3010
  uint32_t scr[2] = {0, 0};
3011
 
3012
  if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
3013
  {
3014
    errorstate = SD_LOCK_UNLOCK_FAILED;
3015
 
3016
    return errorstate;
3017
  }
3018
 
3019
  /* Get SCR Register */
3020
  errorstate = SD_FindSCR(hsd, scr);
3021
 
3022
  if(errorstate != SD_OK)
3023
  {
3024
    return errorstate;
3025
  }
3026
 
3027
  /* If requested card supports wide bus operation */
3028
  if((scr[1] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO)
3029
  {
3030
    /* Send CMD55 APP_CMD with argument as card's RCA.*/
3031
    sdio_cmdinitstructure.Argument         = (uint32_t)(hsd->RCA << 16);
3032
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
3033
    sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
3034
    sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
3035
    sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
3036
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3037
 
3038
    /* Check for error conditions */
3039
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
3040
 
3041
    if(errorstate != SD_OK)
3042
    {
3043
      return errorstate;
3044
    }
3045
 
3046
    /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
3047
    sdio_cmdinitstructure.Argument         = 2;
3048
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_SD_SET_BUSWIDTH;
3049
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3050
 
3051
    /* Check for error conditions */
3052
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH);
3053
 
3054
    if(errorstate != SD_OK)
3055
    {
3056
      return errorstate;
3057
    }
3058
 
3059
    return errorstate;
3060
  }
3061
  else
3062
  {
3063
    errorstate = SD_REQUEST_NOT_APPLICABLE;
3064
 
3065
    return errorstate;
3066
  }
3067
}  
3068
 
3069
/**
3070
  * @brief  Disables the SDIO wide bus mode.
3071
  * @param  hsd: SD handle
3072
  * @retval SD Card error state
3073
  */
3074
static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd)
3075
{
3076
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
3077
  HAL_SD_ErrorTypedef errorstate = SD_OK;
3078
 
3079
  uint32_t scr[2] = {0, 0};
3080
 
3081
  if((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED)
3082
  {
3083
    errorstate = SD_LOCK_UNLOCK_FAILED;
3084
 
3085
    return errorstate;
3086
  }
3087
 
3088
  /* Get SCR Register */
3089
  errorstate = SD_FindSCR(hsd, scr);
3090
 
3091
  if(errorstate != SD_OK)
3092
  {
3093
    return errorstate;
3094
  }
3095
 
3096
  /* If requested card supports 1 bit mode operation */
3097
  if((scr[1] & SD_SINGLE_BUS_SUPPORT) != SD_ALLZERO)
3098
  {
3099
    /* Send CMD55 APP_CMD with argument as card's RCA */
3100
    sdio_cmdinitstructure.Argument         = (uint32_t)(hsd->RCA << 16);
3101
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
3102
    sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
3103
    sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
3104
    sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
3105
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3106
 
3107
    /* Check for error conditions */
3108
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
3109
 
3110
    if(errorstate != SD_OK)
3111
    {
3112
      return errorstate;
3113
    }
3114
 
3115
    /* Send ACMD6 APP_CMD with argument as 0 for single bus mode */
3116
    sdio_cmdinitstructure.Argument         = 0;
3117
    sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_SD_SET_BUSWIDTH;
3118
    SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3119
 
3120
    /* Check for error conditions */
3121
    errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH);
3122
 
3123
    if(errorstate != SD_OK)
3124
    {
3125
      return errorstate;
3126
    }
3127
 
3128
    return errorstate;
3129
  }
3130
  else
3131
  {
3132
    errorstate = SD_REQUEST_NOT_APPLICABLE;
3133
 
3134
    return errorstate;
3135
  }
3136
}
3137
 
3138
 
3139
/**
3140
  * @brief  Finds the SD card SCR register value.
3141
  * @param  hsd: SD handle
3142
  * @param  pSCR: pointer to the buffer that will contain the SCR value  
3143
  * @retval SD Card error state
3144
  */
3145
static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
3146
{
3147
  SDIO_CmdInitTypeDef  sdio_cmdinitstructure = {0};
3148
  SDIO_DataInitTypeDef sdio_datainitstructure = {0};
3149
  HAL_SD_ErrorTypedef errorstate = SD_OK;
3150
  uint32_t index = 0;
3151
  uint32_t tempscr[2] = {0, 0};
3152
 
3153
  /* Set Block Size To 8 Bytes */
3154
  /* Send CMD55 APP_CMD with argument as card's RCA */
3155
  sdio_cmdinitstructure.Argument         = (uint32_t)8;
3156
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SET_BLOCKLEN;
3157
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
3158
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
3159
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
3160
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3161
 
3162
  /* Check for error conditions */
3163
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
3164
 
3165
  if(errorstate != SD_OK)
3166
  {
3167
    return errorstate;
3168
  }
3169
 
3170
  /* Send CMD55 APP_CMD with argument as card's RCA */
3171
  sdio_cmdinitstructure.Argument         = (uint32_t)((hsd->RCA) << 16);
3172
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_APP_CMD;
3173
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3174
 
3175
  /* Check for error conditions */
3176
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
3177
 
3178
  if(errorstate != SD_OK)
3179
  {
3180
    return errorstate;
3181
  }
3182
  sdio_datainitstructure.DataTimeOut   = SD_DATATIMEOUT;
3183
  sdio_datainitstructure.DataLength    = 8;
3184
  sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_8B;
3185
  sdio_datainitstructure.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
3186
  sdio_datainitstructure.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
3187
  sdio_datainitstructure.DPSM          = SDIO_DPSM_ENABLE;
3188
  SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
3189
 
3190
  /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
3191
  sdio_cmdinitstructure.Argument         = 0;
3192
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SD_APP_SEND_SCR;
3193
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3194
 
3195
  /* Check for error conditions */
3196
  errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_SEND_SCR);
3197
 
3198
  if(errorstate != SD_OK)
3199
  {
3200
    return errorstate;
3201
  }
3202
 
3203
  while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))
3204
  {
3205
    if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))
3206
    {
3207
      *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance);
3208
      index++;
3209
    }
3210
  }
3211
 
3212
  if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
3213
  {
3214
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);
3215
 
3216
    errorstate = SD_DATA_TIMEOUT;
3217
 
3218
    return errorstate;
3219
  }
3220
  else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
3221
  {
3222
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);
3223
 
3224
    errorstate = SD_DATA_CRC_FAIL;
3225
 
3226
    return errorstate;
3227
  }
3228
  else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
3229
  {
3230
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);
3231
 
3232
    errorstate = SD_RX_OVERRUN;
3233
 
3234
    return errorstate;
3235
  }
3236
  else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR))
3237
  {
3238
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR);
3239
 
3240
    errorstate = SD_START_BIT_ERR;
3241
 
3242
    return errorstate;
3243
  }
3244
  else
3245
  {
3246
    /* No error flag set */
3247
  }
3248
 
3249
  /* Clear all the static flags */
3250
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
3251
 
3252
  *(pSCR + 1) = ((tempscr[0] & SD_0TO7BITS) << 24)  | ((tempscr[0] & SD_8TO15BITS) << 8) |\
3253
    ((tempscr[0] & SD_16TO23BITS) >> 8) | ((tempscr[0] & SD_24TO31BITS) >> 24);
3254
 
3255
  *(pSCR) = ((tempscr[1] & SD_0TO7BITS) << 24)  | ((tempscr[1] & SD_8TO15BITS) << 8) |\
3256
    ((tempscr[1] & SD_16TO23BITS) >> 8) | ((tempscr[1] & SD_24TO31BITS) >> 24);
3257
 
3258
  return errorstate;
3259
}
3260
 
3261
/**
3262
  * @brief  Checks if the SD card is in programming state.
3263
  * @param  hsd: SD handle
3264
  * @param  pStatus: pointer to the variable that will contain the SD card state  
3265
  * @retval SD Card error state
3266
  */
3267
static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus)
3268
{
3269
  SDIO_CmdInitTypeDef sdio_cmdinitstructure = {0};
3270
  HAL_SD_ErrorTypedef errorstate = SD_OK;
3271
  __IO uint32_t responseR1 = 0;
3272
 
3273
  sdio_cmdinitstructure.Argument         = (uint32_t)(hsd->RCA << 16);
3274
  sdio_cmdinitstructure.CmdIndex         = SD_CMD_SEND_STATUS;
3275
  sdio_cmdinitstructure.Response         = SDIO_RESPONSE_SHORT;
3276
  sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
3277
  sdio_cmdinitstructure.CPSM             = SDIO_CPSM_ENABLE;
3278
  SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
3279
 
3280
  while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))
3281
  {
3282
  }
3283
 
3284
  if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT))
3285
  {
3286
    errorstate = SD_CMD_RSP_TIMEOUT;
3287
 
3288
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT);
3289
 
3290
    return errorstate;
3291
  }
3292
  else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL))
3293
  {
3294
    errorstate = SD_CMD_CRC_FAIL;
3295
 
3296
    __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL);
3297
 
3298
    return errorstate;
3299
  }
3300
  else
3301
  {
3302
    /* No error flag set */
3303
  }
3304
 
3305
  /* Check response received is of desired command */
3306
  if((uint32_t)SDIO_GetCommandResponse(hsd->Instance) != SD_CMD_SEND_STATUS)
3307
  {
3308
    errorstate = SD_ILLEGAL_CMD;
3309
 
3310
    return errorstate;
3311
  }
3312
 
3313
  /* Clear all the static flags */
3314
  __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
3315
 
3316
 
3317
  /* We have received response, retrieve it for analysis */
3318
  responseR1 = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);
3319
 
3320
  /* Find out card status */
3321
  *pStatus = (uint8_t)((responseR1 >> 9) & 0x0000000F);
3322
 
3323
  if((responseR1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
3324
  {
3325
    return errorstate;
3326
  }
3327
 
3328
  if((responseR1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE)
3329
  {
3330
    return(SD_ADDR_OUT_OF_RANGE);
3331
  }
3332
 
3333
  if((responseR1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED)
3334
  {
3335
    return(SD_ADDR_MISALIGNED);
3336
  }
3337
 
3338
  if((responseR1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR)
3339
  {
3340
    return(SD_BLOCK_LEN_ERR);
3341
  }
3342
 
3343
  if((responseR1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR)
3344
  {
3345
    return(SD_ERASE_SEQ_ERR);
3346
  }
3347
 
3348
  if((responseR1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM)
3349
  {
3350
    return(SD_BAD_ERASE_PARAM);
3351
  }
3352
 
3353
  if((responseR1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION)
3354
  {
3355
    return(SD_WRITE_PROT_VIOLATION);
3356
  }
3357
 
3358
  if((responseR1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED)
3359
  {
3360
    return(SD_LOCK_UNLOCK_FAILED);
3361
  }
3362
 
3363
  if((responseR1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED)
3364
  {
3365
    return(SD_COM_CRC_FAILED);
3366
  }
3367
 
3368
  if((responseR1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD)
3369
  {
3370
    return(SD_ILLEGAL_CMD);
3371
  }
3372
 
3373
  if((responseR1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED)
3374
  {
3375
    return(SD_CARD_ECC_FAILED);
3376
  }
3377
 
3378
  if((responseR1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR)
3379
  {
3380
    return(SD_CC_ERROR);
3381
  }
3382
 
3383
  if((responseR1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR)
3384
  {
3385
    return(SD_GENERAL_UNKNOWN_ERROR);
3386
  }
3387
 
3388
  if((responseR1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN)
3389
  {
3390
    return(SD_STREAM_READ_UNDERRUN);
3391
  }
3392
 
3393
  if((responseR1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN)
3394
  {
3395
    return(SD_STREAM_WRITE_OVERRUN);
3396
  }
3397
 
3398
  if((responseR1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE)
3399
  {
3400
    return(SD_CID_CSD_OVERWRITE);
3401
  }
3402
 
3403
  if((responseR1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP)
3404
  {
3405
    return(SD_WP_ERASE_SKIP);
3406
  }
3407
 
3408
  if((responseR1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED)
3409
  {
3410
    return(SD_CARD_ECC_DISABLED);
3411
  }
3412
 
3413
  if((responseR1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET)
3414
  {
3415
    return(SD_ERASE_RESET);
3416
  }
3417
 
3418
  if((responseR1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR)
3419
  {
3420
    return(SD_AKE_SEQ_ERROR);
3421
  }
3422
 
3423
  return errorstate;
3424
}  
3425
 
3426
/**
3427
  * @}
3428
  */
3429
 
3430
#endif /* STM32F103xE || STM32F103xG */
3431
 
3432
#endif /* HAL_SD_MODULE_ENABLED */
3433
 
3434
/**
3435
  * @}
3436
  */
3437
 
3438
/**
3439
  * @}
3440
  */
3441
 
3442
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/