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