Pedro Correia / mbed-dev

Fork of mbed-dev by mbed official

Committer:
AnnaBridge
Date:
Wed Jun 21 17:46:44 2017 +0100
Revision:
167:e84263d55307
Parent:
149:156823d33999
Child:
182:a56a73fd2a6f
This updates the lib to the mbed lib v 145

Who changed what in which revision?

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