added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

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