Library to control Silicon Labs SI570 10 MHZ TO 1.4 GHZ I2C PROGRAMMABLE XO/VCXO.

Dependencies:   mbed

Fork of SI570 by Gerrit Polder

Committer:
DL3LD
Date:
Sun Mar 27 06:55:59 2016 +0000
Revision:
1:1556bcaaf759
STM32F746NG SI570 VFO Test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DL3LD 1:1556bcaaf759 1 /**
DL3LD 1:1556bcaaf759 2 ******************************************************************************
DL3LD 1:1556bcaaf759 3 * @file stm32746g_discovery_sd.c
DL3LD 1:1556bcaaf759 4 * @author MCD Application Team
DL3LD 1:1556bcaaf759 5 * @version V1.0.0
DL3LD 1:1556bcaaf759 6 * @date 25-June-2015
DL3LD 1:1556bcaaf759 7 * @brief This file includes the uSD card driver mounted on STM32746G-Discovery
DL3LD 1:1556bcaaf759 8 * board.
DL3LD 1:1556bcaaf759 9 @verbatim
DL3LD 1:1556bcaaf759 10 1. How To use this driver:
DL3LD 1:1556bcaaf759 11 --------------------------
DL3LD 1:1556bcaaf759 12 - This driver is used to drive the micro SD external card mounted on STM32746G-Discovery
DL3LD 1:1556bcaaf759 13 board.
DL3LD 1:1556bcaaf759 14 - This driver does not need a specific component driver for the micro SD device
DL3LD 1:1556bcaaf759 15 to be included with.
DL3LD 1:1556bcaaf759 16
DL3LD 1:1556bcaaf759 17 2. Driver description:
DL3LD 1:1556bcaaf759 18 ---------------------
DL3LD 1:1556bcaaf759 19 + Initialization steps:
DL3LD 1:1556bcaaf759 20 o Initialize the micro SD card using the BSP_SD_Init() function. This
DL3LD 1:1556bcaaf759 21 function includes the MSP layer hardware resources initialization and the
DL3LD 1:1556bcaaf759 22 SDIO interface configuration to interface with the external micro SD. It
DL3LD 1:1556bcaaf759 23 also includes the micro SD initialization sequence.
DL3LD 1:1556bcaaf759 24 o To check the SD card presence you can use the function BSP_SD_IsDetected() which
DL3LD 1:1556bcaaf759 25 returns the detection status
DL3LD 1:1556bcaaf759 26 o If SD presence detection interrupt mode is desired, you must configure the
DL3LD 1:1556bcaaf759 27 SD detection interrupt mode by calling the function BSP_SD_ITConfig(). The interrupt
DL3LD 1:1556bcaaf759 28 is generated as an external interrupt whenever the micro SD card is
DL3LD 1:1556bcaaf759 29 plugged/unplugged in/from the board.
DL3LD 1:1556bcaaf759 30 o The function BSP_SD_GetCardInfo() is used to get the micro SD card information
DL3LD 1:1556bcaaf759 31 which is stored in the structure "HAL_SD_CardInfoTypedef".
DL3LD 1:1556bcaaf759 32
DL3LD 1:1556bcaaf759 33 + Micro SD card operations
DL3LD 1:1556bcaaf759 34 o The micro SD card can be accessed with read/write block(s) operations once
DL3LD 1:1556bcaaf759 35 it is ready for access. The access can be performed whether using the polling
DL3LD 1:1556bcaaf759 36 mode by calling the functions BSP_SD_ReadBlocks()/BSP_SD_WriteBlocks(), or by DMA
DL3LD 1:1556bcaaf759 37 transfer using the functions BSP_SD_ReadBlocks_DMA()/BSP_SD_WriteBlocks_DMA()
DL3LD 1:1556bcaaf759 38 o The DMA transfer complete is used with interrupt mode. Once the SD transfer
DL3LD 1:1556bcaaf759 39 is complete, the SD interrupt is handled using the function BSP_SD_IRQHandler(),
DL3LD 1:1556bcaaf759 40 the DMA Tx/Rx transfer complete are handled using the functions
DL3LD 1:1556bcaaf759 41 BSP_SD_DMA_Tx_IRQHandler()/BSP_SD_DMA_Rx_IRQHandler(). The corresponding user callbacks
DL3LD 1:1556bcaaf759 42 are implemented by the user at application level.
DL3LD 1:1556bcaaf759 43 o The SD erase block(s) is performed using the function BSP_SD_Erase() with specifying
DL3LD 1:1556bcaaf759 44 the number of blocks to erase.
DL3LD 1:1556bcaaf759 45 o The SD runtime status is returned when calling the function BSP_SD_GetStatus().
DL3LD 1:1556bcaaf759 46 @endverbatim
DL3LD 1:1556bcaaf759 47 ******************************************************************************
DL3LD 1:1556bcaaf759 48 * @attention
DL3LD 1:1556bcaaf759 49 *
DL3LD 1:1556bcaaf759 50 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
DL3LD 1:1556bcaaf759 51 *
DL3LD 1:1556bcaaf759 52 * Redistribution and use in source and binary forms, with or without modification,
DL3LD 1:1556bcaaf759 53 * are permitted provided that the following conditions are met:
DL3LD 1:1556bcaaf759 54 * 1. Redistributions of source code must retain the above copyright notice,
DL3LD 1:1556bcaaf759 55 * this list of conditions and the following disclaimer.
DL3LD 1:1556bcaaf759 56 * 2. Redistributions in binary form must reproduce the above copyright notice,
DL3LD 1:1556bcaaf759 57 * this list of conditions and the following disclaimer in the documentation
DL3LD 1:1556bcaaf759 58 * and/or other materials provided with the distribution.
DL3LD 1:1556bcaaf759 59 * 3. Neither the name of STMicroelectronics nor the names of its contributors
DL3LD 1:1556bcaaf759 60 * may be used to endorse or promote products derived from this software
DL3LD 1:1556bcaaf759 61 * without specific prior written permission.
DL3LD 1:1556bcaaf759 62 *
DL3LD 1:1556bcaaf759 63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
DL3LD 1:1556bcaaf759 64 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
DL3LD 1:1556bcaaf759 65 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DL3LD 1:1556bcaaf759 66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
DL3LD 1:1556bcaaf759 67 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DL3LD 1:1556bcaaf759 68 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
DL3LD 1:1556bcaaf759 69 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
DL3LD 1:1556bcaaf759 70 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
DL3LD 1:1556bcaaf759 71 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
DL3LD 1:1556bcaaf759 72 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
DL3LD 1:1556bcaaf759 73 *
DL3LD 1:1556bcaaf759 74 ******************************************************************************
DL3LD 1:1556bcaaf759 75 */
DL3LD 1:1556bcaaf759 76
DL3LD 1:1556bcaaf759 77 /* Includes ------------------------------------------------------------------*/
DL3LD 1:1556bcaaf759 78 #include "stm32746g_discovery_sd.h"
DL3LD 1:1556bcaaf759 79
DL3LD 1:1556bcaaf759 80 /** @addtogroup BSP
DL3LD 1:1556bcaaf759 81 * @{
DL3LD 1:1556bcaaf759 82 */
DL3LD 1:1556bcaaf759 83
DL3LD 1:1556bcaaf759 84 /** @addtogroup STM32746G_DISCOVERY
DL3LD 1:1556bcaaf759 85 * @{
DL3LD 1:1556bcaaf759 86 */
DL3LD 1:1556bcaaf759 87
DL3LD 1:1556bcaaf759 88 /** @defgroup STM32746G_DISCOVERY_SD STM32746G_DISCOVERY_SD
DL3LD 1:1556bcaaf759 89 * @{
DL3LD 1:1556bcaaf759 90 */
DL3LD 1:1556bcaaf759 91
DL3LD 1:1556bcaaf759 92
DL3LD 1:1556bcaaf759 93 /** @defgroup STM32746G_DISCOVERY_SD_Private_TypesDefinitions STM32746G_DISCOVERY_SD Private Types Definitions
DL3LD 1:1556bcaaf759 94 * @{
DL3LD 1:1556bcaaf759 95 */
DL3LD 1:1556bcaaf759 96 /**
DL3LD 1:1556bcaaf759 97 * @}
DL3LD 1:1556bcaaf759 98 */
DL3LD 1:1556bcaaf759 99
DL3LD 1:1556bcaaf759 100 /** @defgroup STM32746G_DISCOVERY_SD_Private_Defines STM32746G_DISCOVERY_SD Private Defines
DL3LD 1:1556bcaaf759 101 * @{
DL3LD 1:1556bcaaf759 102 */
DL3LD 1:1556bcaaf759 103 /**
DL3LD 1:1556bcaaf759 104 * @}
DL3LD 1:1556bcaaf759 105 */
DL3LD 1:1556bcaaf759 106
DL3LD 1:1556bcaaf759 107 /** @defgroup STM32746G_DISCOVERY_SD_Private_Macros STM32746G_DISCOVERY_SD Private Macros
DL3LD 1:1556bcaaf759 108 * @{
DL3LD 1:1556bcaaf759 109 */
DL3LD 1:1556bcaaf759 110 /**
DL3LD 1:1556bcaaf759 111 * @}
DL3LD 1:1556bcaaf759 112 */
DL3LD 1:1556bcaaf759 113
DL3LD 1:1556bcaaf759 114 /** @defgroup STM32746G_DISCOVERY_SD_Private_Variables STM32746G_DISCOVERY_SD Private Variables
DL3LD 1:1556bcaaf759 115 * @{
DL3LD 1:1556bcaaf759 116 */
DL3LD 1:1556bcaaf759 117 static SD_HandleTypeDef uSdHandle;
DL3LD 1:1556bcaaf759 118 static SD_CardInfo uSdCardInfo;
DL3LD 1:1556bcaaf759 119
DL3LD 1:1556bcaaf759 120 /**
DL3LD 1:1556bcaaf759 121 * @}
DL3LD 1:1556bcaaf759 122 */
DL3LD 1:1556bcaaf759 123
DL3LD 1:1556bcaaf759 124 /** @defgroup STM32746G_DISCOVERY_SD_Private_FunctionPrototypes STM32746G_DISCOVERY_SD Private Function Prototypes
DL3LD 1:1556bcaaf759 125 * @{
DL3LD 1:1556bcaaf759 126 */
DL3LD 1:1556bcaaf759 127 /**
DL3LD 1:1556bcaaf759 128 * @}
DL3LD 1:1556bcaaf759 129 */
DL3LD 1:1556bcaaf759 130
DL3LD 1:1556bcaaf759 131 /** @defgroup STM32746G_DISCOVERY_SD_Exported_Functions STM32746G_DISCOVERY_SD Exported Functions
DL3LD 1:1556bcaaf759 132 * @{
DL3LD 1:1556bcaaf759 133 */
DL3LD 1:1556bcaaf759 134
DL3LD 1:1556bcaaf759 135 /**
DL3LD 1:1556bcaaf759 136 * @brief Initializes the SD card device.
DL3LD 1:1556bcaaf759 137 * @retval SD status
DL3LD 1:1556bcaaf759 138 */
DL3LD 1:1556bcaaf759 139 uint8_t BSP_SD_Init(void)
DL3LD 1:1556bcaaf759 140 {
DL3LD 1:1556bcaaf759 141 uint8_t sd_state = MSD_OK;
DL3LD 1:1556bcaaf759 142
DL3LD 1:1556bcaaf759 143 /* uSD device interface configuration */
DL3LD 1:1556bcaaf759 144 uSdHandle.Instance = SDMMC1;
DL3LD 1:1556bcaaf759 145
DL3LD 1:1556bcaaf759 146 uSdHandle.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
DL3LD 1:1556bcaaf759 147 uSdHandle.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
DL3LD 1:1556bcaaf759 148 uSdHandle.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
DL3LD 1:1556bcaaf759 149 uSdHandle.Init.BusWide = SDMMC_BUS_WIDE_1B;
DL3LD 1:1556bcaaf759 150 uSdHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
DL3LD 1:1556bcaaf759 151 uSdHandle.Init.ClockDiv = SDMMC_TRANSFER_CLK_DIV;
DL3LD 1:1556bcaaf759 152
DL3LD 1:1556bcaaf759 153 /* Msp SD Detect pin initialization */
DL3LD 1:1556bcaaf759 154 BSP_SD_Detect_MspInit(&uSdHandle, NULL);
DL3LD 1:1556bcaaf759 155 if(BSP_SD_IsDetected() != SD_PRESENT) /* Check if SD card is present */
DL3LD 1:1556bcaaf759 156 {
DL3LD 1:1556bcaaf759 157 return MSD_ERROR_SD_NOT_PRESENT;
DL3LD 1:1556bcaaf759 158 }
DL3LD 1:1556bcaaf759 159
DL3LD 1:1556bcaaf759 160 /* Msp SD initialization */
DL3LD 1:1556bcaaf759 161 BSP_SD_MspInit(&uSdHandle, NULL);
DL3LD 1:1556bcaaf759 162
DL3LD 1:1556bcaaf759 163 /* HAL SD initialization */
DL3LD 1:1556bcaaf759 164 if(HAL_SD_Init(&uSdHandle, &uSdCardInfo) != SD_OK)
DL3LD 1:1556bcaaf759 165 {
DL3LD 1:1556bcaaf759 166 sd_state = MSD_ERROR;
DL3LD 1:1556bcaaf759 167 }
DL3LD 1:1556bcaaf759 168
DL3LD 1:1556bcaaf759 169 /* Configure SD Bus width */
DL3LD 1:1556bcaaf759 170 if(sd_state == MSD_OK)
DL3LD 1:1556bcaaf759 171 {
DL3LD 1:1556bcaaf759 172 /* Enable wide operation */
DL3LD 1:1556bcaaf759 173 if(HAL_SD_WideBusOperation_Config(&uSdHandle, SDMMC_BUS_WIDE_4B) != SD_OK)
DL3LD 1:1556bcaaf759 174 {
DL3LD 1:1556bcaaf759 175 sd_state = MSD_ERROR;
DL3LD 1:1556bcaaf759 176 }
DL3LD 1:1556bcaaf759 177 else
DL3LD 1:1556bcaaf759 178 {
DL3LD 1:1556bcaaf759 179 sd_state = MSD_OK;
DL3LD 1:1556bcaaf759 180 }
DL3LD 1:1556bcaaf759 181 }
DL3LD 1:1556bcaaf759 182
DL3LD 1:1556bcaaf759 183 return sd_state;
DL3LD 1:1556bcaaf759 184 }
DL3LD 1:1556bcaaf759 185
DL3LD 1:1556bcaaf759 186 /**
DL3LD 1:1556bcaaf759 187 * @brief DeInitializes the SD card device.
DL3LD 1:1556bcaaf759 188 * @retval SD status
DL3LD 1:1556bcaaf759 189 */
DL3LD 1:1556bcaaf759 190 uint8_t BSP_SD_DeInit(void)
DL3LD 1:1556bcaaf759 191 {
DL3LD 1:1556bcaaf759 192 uint8_t sd_state = MSD_OK;
DL3LD 1:1556bcaaf759 193
DL3LD 1:1556bcaaf759 194 uSdHandle.Instance = SDMMC1;
DL3LD 1:1556bcaaf759 195
DL3LD 1:1556bcaaf759 196 /* HAL SD deinitialization */
DL3LD 1:1556bcaaf759 197 if(HAL_SD_DeInit(&uSdHandle) != HAL_OK)
DL3LD 1:1556bcaaf759 198 {
DL3LD 1:1556bcaaf759 199 sd_state = MSD_ERROR;
DL3LD 1:1556bcaaf759 200 }
DL3LD 1:1556bcaaf759 201
DL3LD 1:1556bcaaf759 202 /* Msp SD deinitialization */
DL3LD 1:1556bcaaf759 203 uSdHandle.Instance = SDMMC1;
DL3LD 1:1556bcaaf759 204 BSP_SD_MspDeInit(&uSdHandle, NULL);
DL3LD 1:1556bcaaf759 205
DL3LD 1:1556bcaaf759 206 return sd_state;
DL3LD 1:1556bcaaf759 207 }
DL3LD 1:1556bcaaf759 208
DL3LD 1:1556bcaaf759 209 /**
DL3LD 1:1556bcaaf759 210 * @brief Configures Interrupt mode for SD detection pin.
DL3LD 1:1556bcaaf759 211 * @retval Returns MSD_OK
DL3LD 1:1556bcaaf759 212 */
DL3LD 1:1556bcaaf759 213 uint8_t BSP_SD_ITConfig(void)
DL3LD 1:1556bcaaf759 214 {
DL3LD 1:1556bcaaf759 215 GPIO_InitTypeDef gpio_init_structure;
DL3LD 1:1556bcaaf759 216
DL3LD 1:1556bcaaf759 217 /* Configure Interrupt mode for SD detection pin */
DL3LD 1:1556bcaaf759 218 gpio_init_structure.Pin = SD_DETECT_PIN;
DL3LD 1:1556bcaaf759 219 gpio_init_structure.Pull = GPIO_PULLUP;
DL3LD 1:1556bcaaf759 220 gpio_init_structure.Speed = GPIO_SPEED_FAST;
DL3LD 1:1556bcaaf759 221 gpio_init_structure.Mode = GPIO_MODE_IT_RISING_FALLING;
DL3LD 1:1556bcaaf759 222 HAL_GPIO_Init(SD_DETECT_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 223
DL3LD 1:1556bcaaf759 224 /* Enable and set SD detect EXTI Interrupt to the lowest priority */
DL3LD 1:1556bcaaf759 225 HAL_NVIC_SetPriority((IRQn_Type)(SD_DETECT_EXTI_IRQn), 0x0F, 0x00);
DL3LD 1:1556bcaaf759 226 HAL_NVIC_EnableIRQ((IRQn_Type)(SD_DETECT_EXTI_IRQn));
DL3LD 1:1556bcaaf759 227
DL3LD 1:1556bcaaf759 228 return MSD_OK;
DL3LD 1:1556bcaaf759 229 }
DL3LD 1:1556bcaaf759 230
DL3LD 1:1556bcaaf759 231 /**
DL3LD 1:1556bcaaf759 232 * @brief Detects if SD card is correctly plugged in the memory slot or not.
DL3LD 1:1556bcaaf759 233 * @retval Returns if SD is detected or not
DL3LD 1:1556bcaaf759 234 */
DL3LD 1:1556bcaaf759 235 uint8_t BSP_SD_IsDetected(void)
DL3LD 1:1556bcaaf759 236 {
DL3LD 1:1556bcaaf759 237 __IO uint8_t status = SD_PRESENT;
DL3LD 1:1556bcaaf759 238
DL3LD 1:1556bcaaf759 239 /* Check SD card detect pin */
DL3LD 1:1556bcaaf759 240 if (HAL_GPIO_ReadPin(SD_DETECT_GPIO_PORT, SD_DETECT_PIN) == GPIO_PIN_SET)
DL3LD 1:1556bcaaf759 241 {
DL3LD 1:1556bcaaf759 242 status = SD_NOT_PRESENT;
DL3LD 1:1556bcaaf759 243 }
DL3LD 1:1556bcaaf759 244
DL3LD 1:1556bcaaf759 245 return status;
DL3LD 1:1556bcaaf759 246 }
DL3LD 1:1556bcaaf759 247
DL3LD 1:1556bcaaf759 248 /**
DL3LD 1:1556bcaaf759 249 * @brief Reads block(s) from a specified address in an SD card, in polling mode.
DL3LD 1:1556bcaaf759 250 * @param pData: Pointer to the buffer that will contain the data to transmit
DL3LD 1:1556bcaaf759 251 * @param ReadAddr: Address from where data is to be read
DL3LD 1:1556bcaaf759 252 * @param BlockSize: SD card data block size, that should be 512
DL3LD 1:1556bcaaf759 253 * @param NumOfBlocks: Number of SD blocks to read
DL3LD 1:1556bcaaf759 254 * @retval SD status
DL3LD 1:1556bcaaf759 255 */
DL3LD 1:1556bcaaf759 256 uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
DL3LD 1:1556bcaaf759 257 {
DL3LD 1:1556bcaaf759 258 if(HAL_SD_ReadBlocks(&uSdHandle, pData, ReadAddr, BlockSize, NumOfBlocks) != SD_OK)
DL3LD 1:1556bcaaf759 259 {
DL3LD 1:1556bcaaf759 260 return MSD_ERROR;
DL3LD 1:1556bcaaf759 261 }
DL3LD 1:1556bcaaf759 262 else
DL3LD 1:1556bcaaf759 263 {
DL3LD 1:1556bcaaf759 264 return MSD_OK;
DL3LD 1:1556bcaaf759 265 }
DL3LD 1:1556bcaaf759 266 }
DL3LD 1:1556bcaaf759 267
DL3LD 1:1556bcaaf759 268 /**
DL3LD 1:1556bcaaf759 269 * @brief Writes block(s) to a specified address in an SD card, in polling mode.
DL3LD 1:1556bcaaf759 270 * @param pData: Pointer to the buffer that will contain the data to transmit
DL3LD 1:1556bcaaf759 271 * @param WriteAddr: Address from where data is to be written
DL3LD 1:1556bcaaf759 272 * @param BlockSize: SD card data block size, that should be 512
DL3LD 1:1556bcaaf759 273 * @param NumOfBlocks: Number of SD blocks to write
DL3LD 1:1556bcaaf759 274 * @retval SD status
DL3LD 1:1556bcaaf759 275 */
DL3LD 1:1556bcaaf759 276 uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
DL3LD 1:1556bcaaf759 277 {
DL3LD 1:1556bcaaf759 278 if(HAL_SD_WriteBlocks(&uSdHandle, pData, WriteAddr, BlockSize, NumOfBlocks) != SD_OK)
DL3LD 1:1556bcaaf759 279 {
DL3LD 1:1556bcaaf759 280 return MSD_ERROR;
DL3LD 1:1556bcaaf759 281 }
DL3LD 1:1556bcaaf759 282 else
DL3LD 1:1556bcaaf759 283 {
DL3LD 1:1556bcaaf759 284 return MSD_OK;
DL3LD 1:1556bcaaf759 285 }
DL3LD 1:1556bcaaf759 286 }
DL3LD 1:1556bcaaf759 287
DL3LD 1:1556bcaaf759 288 /**
DL3LD 1:1556bcaaf759 289 * @brief Reads block(s) from a specified address in an SD card, in DMA mode.
DL3LD 1:1556bcaaf759 290 * @param pData: Pointer to the buffer that will contain the data to transmit
DL3LD 1:1556bcaaf759 291 * @param ReadAddr: Address from where data is to be read
DL3LD 1:1556bcaaf759 292 * @param BlockSize: SD card data block size, that should be 512
DL3LD 1:1556bcaaf759 293 * @param NumOfBlocks: Number of SD blocks to read
DL3LD 1:1556bcaaf759 294 * @retval SD status
DL3LD 1:1556bcaaf759 295 */
DL3LD 1:1556bcaaf759 296 uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
DL3LD 1:1556bcaaf759 297 {
DL3LD 1:1556bcaaf759 298 uint8_t sd_state = MSD_OK;
DL3LD 1:1556bcaaf759 299
DL3LD 1:1556bcaaf759 300 /* Read block(s) in DMA transfer mode */
DL3LD 1:1556bcaaf759 301 if(HAL_SD_ReadBlocks_DMA(&uSdHandle, pData, ReadAddr, BlockSize, NumOfBlocks) != SD_OK)
DL3LD 1:1556bcaaf759 302 {
DL3LD 1:1556bcaaf759 303 sd_state = MSD_ERROR;
DL3LD 1:1556bcaaf759 304 }
DL3LD 1:1556bcaaf759 305
DL3LD 1:1556bcaaf759 306 /* Wait until transfer is complete */
DL3LD 1:1556bcaaf759 307 if(sd_state == MSD_OK)
DL3LD 1:1556bcaaf759 308 {
DL3LD 1:1556bcaaf759 309 if(HAL_SD_CheckReadOperation(&uSdHandle, (uint32_t)SD_DATATIMEOUT) != SD_OK)
DL3LD 1:1556bcaaf759 310 {
DL3LD 1:1556bcaaf759 311 sd_state = MSD_ERROR;
DL3LD 1:1556bcaaf759 312 }
DL3LD 1:1556bcaaf759 313 else
DL3LD 1:1556bcaaf759 314 {
DL3LD 1:1556bcaaf759 315 sd_state = MSD_OK;
DL3LD 1:1556bcaaf759 316 }
DL3LD 1:1556bcaaf759 317 }
DL3LD 1:1556bcaaf759 318
DL3LD 1:1556bcaaf759 319 return sd_state;
DL3LD 1:1556bcaaf759 320 }
DL3LD 1:1556bcaaf759 321
DL3LD 1:1556bcaaf759 322 /**
DL3LD 1:1556bcaaf759 323 * @brief Writes block(s) to a specified address in an SD card, in DMA mode.
DL3LD 1:1556bcaaf759 324 * @param pData: Pointer to the buffer that will contain the data to transmit
DL3LD 1:1556bcaaf759 325 * @param WriteAddr: Address from where data is to be written
DL3LD 1:1556bcaaf759 326 * @param BlockSize: SD card data block size, that should be 512
DL3LD 1:1556bcaaf759 327 * @param NumOfBlocks: Number of SD blocks to write
DL3LD 1:1556bcaaf759 328 * @retval SD status
DL3LD 1:1556bcaaf759 329 */
DL3LD 1:1556bcaaf759 330 uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks)
DL3LD 1:1556bcaaf759 331 {
DL3LD 1:1556bcaaf759 332 uint8_t sd_state = MSD_OK;
DL3LD 1:1556bcaaf759 333
DL3LD 1:1556bcaaf759 334 /* Write block(s) in DMA transfer mode */
DL3LD 1:1556bcaaf759 335 if(HAL_SD_WriteBlocks_DMA(&uSdHandle, pData, WriteAddr, BlockSize, NumOfBlocks) != SD_OK)
DL3LD 1:1556bcaaf759 336 {
DL3LD 1:1556bcaaf759 337 sd_state = MSD_ERROR;
DL3LD 1:1556bcaaf759 338 }
DL3LD 1:1556bcaaf759 339
DL3LD 1:1556bcaaf759 340 /* Wait until transfer is complete */
DL3LD 1:1556bcaaf759 341 if(sd_state == MSD_OK)
DL3LD 1:1556bcaaf759 342 {
DL3LD 1:1556bcaaf759 343 if(HAL_SD_CheckWriteOperation(&uSdHandle, (uint32_t)SD_DATATIMEOUT) != SD_OK)
DL3LD 1:1556bcaaf759 344 {
DL3LD 1:1556bcaaf759 345 sd_state = MSD_ERROR;
DL3LD 1:1556bcaaf759 346 }
DL3LD 1:1556bcaaf759 347 else
DL3LD 1:1556bcaaf759 348 {
DL3LD 1:1556bcaaf759 349 sd_state = MSD_OK;
DL3LD 1:1556bcaaf759 350 }
DL3LD 1:1556bcaaf759 351 }
DL3LD 1:1556bcaaf759 352
DL3LD 1:1556bcaaf759 353 return sd_state;
DL3LD 1:1556bcaaf759 354 }
DL3LD 1:1556bcaaf759 355
DL3LD 1:1556bcaaf759 356 /**
DL3LD 1:1556bcaaf759 357 * @brief Erases the specified memory area of the given SD card.
DL3LD 1:1556bcaaf759 358 * @param StartAddr: Start byte address
DL3LD 1:1556bcaaf759 359 * @param EndAddr: End byte address
DL3LD 1:1556bcaaf759 360 * @retval SD status
DL3LD 1:1556bcaaf759 361 */
DL3LD 1:1556bcaaf759 362 uint8_t BSP_SD_Erase(uint64_t StartAddr, uint64_t EndAddr)
DL3LD 1:1556bcaaf759 363 {
DL3LD 1:1556bcaaf759 364 if(HAL_SD_Erase(&uSdHandle, StartAddr, EndAddr) != SD_OK)
DL3LD 1:1556bcaaf759 365 {
DL3LD 1:1556bcaaf759 366 return MSD_ERROR;
DL3LD 1:1556bcaaf759 367 }
DL3LD 1:1556bcaaf759 368 else
DL3LD 1:1556bcaaf759 369 {
DL3LD 1:1556bcaaf759 370 return MSD_OK;
DL3LD 1:1556bcaaf759 371 }
DL3LD 1:1556bcaaf759 372 }
DL3LD 1:1556bcaaf759 373
DL3LD 1:1556bcaaf759 374 /**
DL3LD 1:1556bcaaf759 375 * @brief Initializes the SD MSP.
DL3LD 1:1556bcaaf759 376 * @param hsd: SD handle
DL3LD 1:1556bcaaf759 377 * @param Params
DL3LD 1:1556bcaaf759 378 * @retval None
DL3LD 1:1556bcaaf759 379 */
DL3LD 1:1556bcaaf759 380 __weak void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params)
DL3LD 1:1556bcaaf759 381 {
DL3LD 1:1556bcaaf759 382 static DMA_HandleTypeDef dma_rx_handle;
DL3LD 1:1556bcaaf759 383 static DMA_HandleTypeDef dma_tx_handle;
DL3LD 1:1556bcaaf759 384 GPIO_InitTypeDef gpio_init_structure;
DL3LD 1:1556bcaaf759 385
DL3LD 1:1556bcaaf759 386 /* Enable SDIO clock */
DL3LD 1:1556bcaaf759 387 __HAL_RCC_SDMMC1_CLK_ENABLE();
DL3LD 1:1556bcaaf759 388
DL3LD 1:1556bcaaf759 389 /* Enable DMA2 clocks */
DL3LD 1:1556bcaaf759 390 __DMAx_TxRx_CLK_ENABLE();
DL3LD 1:1556bcaaf759 391
DL3LD 1:1556bcaaf759 392 /* Enable GPIOs clock */
DL3LD 1:1556bcaaf759 393 __HAL_RCC_GPIOC_CLK_ENABLE();
DL3LD 1:1556bcaaf759 394 __HAL_RCC_GPIOD_CLK_ENABLE();
DL3LD 1:1556bcaaf759 395
DL3LD 1:1556bcaaf759 396 /* Common GPIO configuration */
DL3LD 1:1556bcaaf759 397 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
DL3LD 1:1556bcaaf759 398 gpio_init_structure.Pull = GPIO_PULLUP;
DL3LD 1:1556bcaaf759 399 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
DL3LD 1:1556bcaaf759 400 gpio_init_structure.Alternate = GPIO_AF12_SDMMC1;
DL3LD 1:1556bcaaf759 401
DL3LD 1:1556bcaaf759 402 /* GPIOC configuration */
DL3LD 1:1556bcaaf759 403 gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
DL3LD 1:1556bcaaf759 404 HAL_GPIO_Init(GPIOC, &gpio_init_structure);
DL3LD 1:1556bcaaf759 405
DL3LD 1:1556bcaaf759 406 /* GPIOD configuration */
DL3LD 1:1556bcaaf759 407 gpio_init_structure.Pin = GPIO_PIN_2;
DL3LD 1:1556bcaaf759 408 HAL_GPIO_Init(GPIOD, &gpio_init_structure);
DL3LD 1:1556bcaaf759 409
DL3LD 1:1556bcaaf759 410 /* NVIC configuration for SDIO interrupts */
DL3LD 1:1556bcaaf759 411 HAL_NVIC_SetPriority(SDMMC1_IRQn, 5, 0);
DL3LD 1:1556bcaaf759 412 HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
DL3LD 1:1556bcaaf759 413
DL3LD 1:1556bcaaf759 414 /* Configure DMA Rx parameters */
DL3LD 1:1556bcaaf759 415 dma_rx_handle.Init.Channel = SD_DMAx_Rx_CHANNEL;
DL3LD 1:1556bcaaf759 416 dma_rx_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
DL3LD 1:1556bcaaf759 417 dma_rx_handle.Init.PeriphInc = DMA_PINC_DISABLE;
DL3LD 1:1556bcaaf759 418 dma_rx_handle.Init.MemInc = DMA_MINC_ENABLE;
DL3LD 1:1556bcaaf759 419 dma_rx_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
DL3LD 1:1556bcaaf759 420 dma_rx_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
DL3LD 1:1556bcaaf759 421 dma_rx_handle.Init.Mode = DMA_PFCTRL;
DL3LD 1:1556bcaaf759 422 dma_rx_handle.Init.Priority = DMA_PRIORITY_VERY_HIGH;
DL3LD 1:1556bcaaf759 423 dma_rx_handle.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
DL3LD 1:1556bcaaf759 424 dma_rx_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
DL3LD 1:1556bcaaf759 425 dma_rx_handle.Init.MemBurst = DMA_MBURST_INC4;
DL3LD 1:1556bcaaf759 426 dma_rx_handle.Init.PeriphBurst = DMA_PBURST_INC4;
DL3LD 1:1556bcaaf759 427
DL3LD 1:1556bcaaf759 428 dma_rx_handle.Instance = SD_DMAx_Rx_STREAM;
DL3LD 1:1556bcaaf759 429
DL3LD 1:1556bcaaf759 430 /* Associate the DMA handle */
DL3LD 1:1556bcaaf759 431 __HAL_LINKDMA(hsd, hdmarx, dma_rx_handle);
DL3LD 1:1556bcaaf759 432
DL3LD 1:1556bcaaf759 433 /* Deinitialize the stream for new transfer */
DL3LD 1:1556bcaaf759 434 HAL_DMA_DeInit(&dma_rx_handle);
DL3LD 1:1556bcaaf759 435
DL3LD 1:1556bcaaf759 436 /* Configure the DMA stream */
DL3LD 1:1556bcaaf759 437 HAL_DMA_Init(&dma_rx_handle);
DL3LD 1:1556bcaaf759 438
DL3LD 1:1556bcaaf759 439 /* Configure DMA Tx parameters */
DL3LD 1:1556bcaaf759 440 dma_tx_handle.Init.Channel = SD_DMAx_Tx_CHANNEL;
DL3LD 1:1556bcaaf759 441 dma_tx_handle.Init.Direction = DMA_MEMORY_TO_PERIPH;
DL3LD 1:1556bcaaf759 442 dma_tx_handle.Init.PeriphInc = DMA_PINC_DISABLE;
DL3LD 1:1556bcaaf759 443 dma_tx_handle.Init.MemInc = DMA_MINC_ENABLE;
DL3LD 1:1556bcaaf759 444 dma_tx_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
DL3LD 1:1556bcaaf759 445 dma_tx_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
DL3LD 1:1556bcaaf759 446 dma_tx_handle.Init.Mode = DMA_PFCTRL;
DL3LD 1:1556bcaaf759 447 dma_tx_handle.Init.Priority = DMA_PRIORITY_VERY_HIGH;
DL3LD 1:1556bcaaf759 448 dma_tx_handle.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
DL3LD 1:1556bcaaf759 449 dma_tx_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
DL3LD 1:1556bcaaf759 450 dma_tx_handle.Init.MemBurst = DMA_MBURST_INC4;
DL3LD 1:1556bcaaf759 451 dma_tx_handle.Init.PeriphBurst = DMA_PBURST_INC4;
DL3LD 1:1556bcaaf759 452
DL3LD 1:1556bcaaf759 453 dma_tx_handle.Instance = SD_DMAx_Tx_STREAM;
DL3LD 1:1556bcaaf759 454
DL3LD 1:1556bcaaf759 455 /* Associate the DMA handle */
DL3LD 1:1556bcaaf759 456 __HAL_LINKDMA(hsd, hdmatx, dma_tx_handle);
DL3LD 1:1556bcaaf759 457
DL3LD 1:1556bcaaf759 458 /* Deinitialize the stream for new transfer */
DL3LD 1:1556bcaaf759 459 HAL_DMA_DeInit(&dma_tx_handle);
DL3LD 1:1556bcaaf759 460
DL3LD 1:1556bcaaf759 461 /* Configure the DMA stream */
DL3LD 1:1556bcaaf759 462 HAL_DMA_Init(&dma_tx_handle);
DL3LD 1:1556bcaaf759 463
DL3LD 1:1556bcaaf759 464 /* NVIC configuration for DMA transfer complete interrupt */
DL3LD 1:1556bcaaf759 465 HAL_NVIC_SetPriority(SD_DMAx_Rx_IRQn, 6, 0);
DL3LD 1:1556bcaaf759 466 HAL_NVIC_EnableIRQ(SD_DMAx_Rx_IRQn);
DL3LD 1:1556bcaaf759 467
DL3LD 1:1556bcaaf759 468 /* NVIC configuration for DMA transfer complete interrupt */
DL3LD 1:1556bcaaf759 469 HAL_NVIC_SetPriority(SD_DMAx_Tx_IRQn, 6, 0);
DL3LD 1:1556bcaaf759 470 HAL_NVIC_EnableIRQ(SD_DMAx_Tx_IRQn);
DL3LD 1:1556bcaaf759 471 }
DL3LD 1:1556bcaaf759 472
DL3LD 1:1556bcaaf759 473 /**
DL3LD 1:1556bcaaf759 474 * @brief Initializes the SD Detect pin MSP.
DL3LD 1:1556bcaaf759 475 * @param hsd: SD handle
DL3LD 1:1556bcaaf759 476 * @param Params
DL3LD 1:1556bcaaf759 477 * @retval None
DL3LD 1:1556bcaaf759 478 */
DL3LD 1:1556bcaaf759 479 __weak void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params)
DL3LD 1:1556bcaaf759 480 {
DL3LD 1:1556bcaaf759 481 GPIO_InitTypeDef gpio_init_structure;
DL3LD 1:1556bcaaf759 482
DL3LD 1:1556bcaaf759 483 SD_DETECT_GPIO_CLK_ENABLE();
DL3LD 1:1556bcaaf759 484
DL3LD 1:1556bcaaf759 485 /* GPIO configuration in input for uSD_Detect signal */
DL3LD 1:1556bcaaf759 486 gpio_init_structure.Pin = SD_DETECT_PIN;
DL3LD 1:1556bcaaf759 487 gpio_init_structure.Mode = GPIO_MODE_INPUT;
DL3LD 1:1556bcaaf759 488 gpio_init_structure.Pull = GPIO_PULLUP;
DL3LD 1:1556bcaaf759 489 gpio_init_structure.Speed = GPIO_SPEED_HIGH;
DL3LD 1:1556bcaaf759 490 HAL_GPIO_Init(SD_DETECT_GPIO_PORT, &gpio_init_structure);
DL3LD 1:1556bcaaf759 491 }
DL3LD 1:1556bcaaf759 492
DL3LD 1:1556bcaaf759 493 /**
DL3LD 1:1556bcaaf759 494 * @brief DeInitializes the SD MSP.
DL3LD 1:1556bcaaf759 495 * @param hsd: SD handle
DL3LD 1:1556bcaaf759 496 * @param Params
DL3LD 1:1556bcaaf759 497 * @retval None
DL3LD 1:1556bcaaf759 498 */
DL3LD 1:1556bcaaf759 499 __weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)
DL3LD 1:1556bcaaf759 500 {
DL3LD 1:1556bcaaf759 501 static DMA_HandleTypeDef dma_rx_handle;
DL3LD 1:1556bcaaf759 502 static DMA_HandleTypeDef dma_tx_handle;
DL3LD 1:1556bcaaf759 503
DL3LD 1:1556bcaaf759 504 /* Disable NVIC for DMA transfer complete interrupts */
DL3LD 1:1556bcaaf759 505 HAL_NVIC_DisableIRQ(SD_DMAx_Rx_IRQn);
DL3LD 1:1556bcaaf759 506 HAL_NVIC_DisableIRQ(SD_DMAx_Tx_IRQn);
DL3LD 1:1556bcaaf759 507
DL3LD 1:1556bcaaf759 508 /* Deinitialize the stream for new transfer */
DL3LD 1:1556bcaaf759 509 dma_rx_handle.Instance = SD_DMAx_Rx_STREAM;
DL3LD 1:1556bcaaf759 510 HAL_DMA_DeInit(&dma_rx_handle);
DL3LD 1:1556bcaaf759 511
DL3LD 1:1556bcaaf759 512 /* Deinitialize the stream for new transfer */
DL3LD 1:1556bcaaf759 513 dma_tx_handle.Instance = SD_DMAx_Tx_STREAM;
DL3LD 1:1556bcaaf759 514 HAL_DMA_DeInit(&dma_tx_handle);
DL3LD 1:1556bcaaf759 515
DL3LD 1:1556bcaaf759 516 /* Disable NVIC for SDIO interrupts */
DL3LD 1:1556bcaaf759 517 HAL_NVIC_DisableIRQ(SDMMC1_IRQn);
DL3LD 1:1556bcaaf759 518
DL3LD 1:1556bcaaf759 519 /* DeInit GPIO pins can be done in the application
DL3LD 1:1556bcaaf759 520 (by surcharging this __weak function) */
DL3LD 1:1556bcaaf759 521
DL3LD 1:1556bcaaf759 522 /* Disable SDMMC1 clock */
DL3LD 1:1556bcaaf759 523 __HAL_RCC_SDMMC1_CLK_DISABLE();
DL3LD 1:1556bcaaf759 524
DL3LD 1:1556bcaaf759 525 /* GPIO pins clock and DMA clocks can be shut down in the application
DL3LD 1:1556bcaaf759 526 by surcharging this __weak function */
DL3LD 1:1556bcaaf759 527 }
DL3LD 1:1556bcaaf759 528
DL3LD 1:1556bcaaf759 529 /**
DL3LD 1:1556bcaaf759 530 * @brief Handles SD card interrupt request.
DL3LD 1:1556bcaaf759 531 * @retval None
DL3LD 1:1556bcaaf759 532 */
DL3LD 1:1556bcaaf759 533 void BSP_SD_IRQHandler(void)
DL3LD 1:1556bcaaf759 534 {
DL3LD 1:1556bcaaf759 535 HAL_SD_IRQHandler(&uSdHandle);
DL3LD 1:1556bcaaf759 536 }
DL3LD 1:1556bcaaf759 537
DL3LD 1:1556bcaaf759 538 /**
DL3LD 1:1556bcaaf759 539 * @brief Handles SD DMA Tx transfer interrupt request.
DL3LD 1:1556bcaaf759 540 * @retval None
DL3LD 1:1556bcaaf759 541 */
DL3LD 1:1556bcaaf759 542 void BSP_SD_DMA_Tx_IRQHandler(void)
DL3LD 1:1556bcaaf759 543 {
DL3LD 1:1556bcaaf759 544 HAL_DMA_IRQHandler(uSdHandle.hdmatx);
DL3LD 1:1556bcaaf759 545 }
DL3LD 1:1556bcaaf759 546
DL3LD 1:1556bcaaf759 547 /**
DL3LD 1:1556bcaaf759 548 * @brief Handles SD DMA Rx transfer interrupt request.
DL3LD 1:1556bcaaf759 549 * @retval None
DL3LD 1:1556bcaaf759 550 */
DL3LD 1:1556bcaaf759 551 void BSP_SD_DMA_Rx_IRQHandler(void)
DL3LD 1:1556bcaaf759 552 {
DL3LD 1:1556bcaaf759 553 HAL_DMA_IRQHandler(uSdHandle.hdmarx);
DL3LD 1:1556bcaaf759 554 }
DL3LD 1:1556bcaaf759 555
DL3LD 1:1556bcaaf759 556 /**
DL3LD 1:1556bcaaf759 557 * @brief Gets the current SD card data status.
DL3LD 1:1556bcaaf759 558 * @retval Data transfer state.
DL3LD 1:1556bcaaf759 559 * This value can be one of the following values:
DL3LD 1:1556bcaaf759 560 * @arg SD_TRANSFER_OK: No data transfer is acting
DL3LD 1:1556bcaaf759 561 * @arg SD_TRANSFER_BUSY: Data transfer is acting
DL3LD 1:1556bcaaf759 562 * @arg SD_TRANSFER_ERROR: Data transfer error
DL3LD 1:1556bcaaf759 563 */
DL3LD 1:1556bcaaf759 564 HAL_SD_TransferStateTypedef BSP_SD_GetStatus(void)
DL3LD 1:1556bcaaf759 565 {
DL3LD 1:1556bcaaf759 566 return(HAL_SD_GetStatus(&uSdHandle));
DL3LD 1:1556bcaaf759 567 }
DL3LD 1:1556bcaaf759 568
DL3LD 1:1556bcaaf759 569 /**
DL3LD 1:1556bcaaf759 570 * @brief Get SD information about specific SD card.
DL3LD 1:1556bcaaf759 571 * @param CardInfo: Pointer to HAL_SD_CardInfoTypedef structure
DL3LD 1:1556bcaaf759 572 * @retval None
DL3LD 1:1556bcaaf759 573 */
DL3LD 1:1556bcaaf759 574 void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypedef *CardInfo)
DL3LD 1:1556bcaaf759 575 {
DL3LD 1:1556bcaaf759 576 /* Get SD card Information */
DL3LD 1:1556bcaaf759 577 HAL_SD_Get_CardInfo(&uSdHandle, CardInfo);
DL3LD 1:1556bcaaf759 578 }
DL3LD 1:1556bcaaf759 579
DL3LD 1:1556bcaaf759 580 /**
DL3LD 1:1556bcaaf759 581 * @}
DL3LD 1:1556bcaaf759 582 */
DL3LD 1:1556bcaaf759 583
DL3LD 1:1556bcaaf759 584 /**
DL3LD 1:1556bcaaf759 585 * @}
DL3LD 1:1556bcaaf759 586 */
DL3LD 1:1556bcaaf759 587
DL3LD 1:1556bcaaf759 588 /**
DL3LD 1:1556bcaaf759 589 * @}
DL3LD 1:1556bcaaf759 590 */
DL3LD 1:1556bcaaf759 591
DL3LD 1:1556bcaaf759 592 /**
DL3LD 1:1556bcaaf759 593 * @}
DL3LD 1:1556bcaaf759 594 */
DL3LD 1:1556bcaaf759 595
DL3LD 1:1556bcaaf759 596 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
DL3LD 1:1556bcaaf759 597