mbed library sources

Dependents:   bare

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 87:085cde657901 1 /**
mbed_official 87:085cde657901 2 ******************************************************************************
mbed_official 87:085cde657901 3 * @file stm32f4xx_hal_nand.c
mbed_official 87:085cde657901 4 * @author MCD Application Team
mbed_official 87:085cde657901 5 * @version V1.0.0RC2
mbed_official 87:085cde657901 6 * @date 04-February-2014
mbed_official 87:085cde657901 7 * @brief NAND HAL module driver.
mbed_official 87:085cde657901 8 * This file provides a generic firmware to drive NAND memories mounted
mbed_official 87:085cde657901 9 * as external device.
mbed_official 87:085cde657901 10 *
mbed_official 87:085cde657901 11 @verbatim
mbed_official 87:085cde657901 12 ==============================================================================
mbed_official 87:085cde657901 13 ##### How to use this driver #####
mbed_official 87:085cde657901 14 ==============================================================================
mbed_official 87:085cde657901 15 [..]
mbed_official 87:085cde657901 16 This driver is a generic layered driver which contains a set of APIs used to
mbed_official 87:085cde657901 17 control NAND flash memories. It uses the FMC/FSMC layer functions to interface
mbed_official 87:085cde657901 18 with NAND devices. This driver is used as follows:
mbed_official 87:085cde657901 19
mbed_official 87:085cde657901 20 (+) NAND flash memory configuration sequence using the function HAL_NAND_Init()
mbed_official 87:085cde657901 21 with control and timing parameters for both common and attribute spaces.
mbed_official 87:085cde657901 22
mbed_official 87:085cde657901 23 (+) Read NAND flash memory maker and device IDs using the function
mbed_official 87:085cde657901 24 HAL_NAND_Read_ID(). The read information is stored in the NAND_ID_TypeDef
mbed_official 87:085cde657901 25 structure declared by the function caller.
mbed_official 87:085cde657901 26
mbed_official 87:085cde657901 27 (+) Access NAND flash memory by read/write operations using the functions
mbed_official 87:085cde657901 28 HAL_NAND_Read_Page()/HAL_NAND_Read_SpareArea(), HAL_NAND_Write_Page()/HAL_NAND_Write_SpareArea()
mbed_official 87:085cde657901 29 to read/write page(s)/spare area(s). These functions use specific device
mbed_official 87:085cde657901 30 information (Block, page size..) predefined by the user in the HAL_NAND_Info_TypeDef
mbed_official 87:085cde657901 31 structure. The read/write address information is contained by the Nand_Address_Typedef
mbed_official 87:085cde657901 32 structure passed as parameter.
mbed_official 87:085cde657901 33
mbed_official 87:085cde657901 34 (+) Perform NAND flash Reset chip operation using the function HAL_NAND_Reset().
mbed_official 87:085cde657901 35
mbed_official 87:085cde657901 36 (+) Perform NAND flash erase block operation using the function HAL_NAND_Erase_Block().
mbed_official 87:085cde657901 37 The erase block address information is contained in the Nand_Address_Typedef
mbed_official 87:085cde657901 38 structure passed as parameter.
mbed_official 87:085cde657901 39
mbed_official 87:085cde657901 40 (+) Read the NAND flash status operation using the function HAL_NAND_Read_Status().
mbed_official 87:085cde657901 41
mbed_official 87:085cde657901 42 (+) You can also control the NAND device by calling the control APIs HAL_NAND_ECC_Enable()/
mbed_official 87:085cde657901 43 HAL_NAND_ECC_Disable() to respectively enable/disable the ECC code correction
mbed_official 87:085cde657901 44 feature or the function HAL_NAND_GetECC() to get the ECC correction code.
mbed_official 87:085cde657901 45
mbed_official 87:085cde657901 46 (+) You can monitor the NAND device HAL state by calling the function
mbed_official 87:085cde657901 47 HAL_NAND_GetState()
mbed_official 87:085cde657901 48
mbed_official 87:085cde657901 49 [..]
mbed_official 87:085cde657901 50 (@) This driver is a set of generic APIs which handle standard NAND flash operations.
mbed_official 87:085cde657901 51 If a NAND flash device contains different operations and/or implementations,
mbed_official 87:085cde657901 52 it should be implemented separately.
mbed_official 87:085cde657901 53
mbed_official 87:085cde657901 54 @endverbatim
mbed_official 87:085cde657901 55 ******************************************************************************
mbed_official 87:085cde657901 56 * @attention
mbed_official 87:085cde657901 57 *
mbed_official 87:085cde657901 58 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 87:085cde657901 59 *
mbed_official 87:085cde657901 60 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 87:085cde657901 61 * are permitted provided that the following conditions are met:
mbed_official 87:085cde657901 62 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 87:085cde657901 63 * this list of conditions and the following disclaimer.
mbed_official 87:085cde657901 64 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 87:085cde657901 65 * this list of conditions and the following disclaimer in the documentation
mbed_official 87:085cde657901 66 * and/or other materials provided with the distribution.
mbed_official 87:085cde657901 67 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 87:085cde657901 68 * may be used to endorse or promote products derived from this software
mbed_official 87:085cde657901 69 * without specific prior written permission.
mbed_official 87:085cde657901 70 *
mbed_official 87:085cde657901 71 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 87:085cde657901 72 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 87:085cde657901 73 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 87:085cde657901 74 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 87:085cde657901 75 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 87:085cde657901 76 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 87:085cde657901 77 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 87:085cde657901 78 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 87:085cde657901 79 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 87:085cde657901 80 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 87:085cde657901 81 *
mbed_official 87:085cde657901 82 ******************************************************************************
mbed_official 87:085cde657901 83 */
mbed_official 87:085cde657901 84
mbed_official 87:085cde657901 85 /* Includes ------------------------------------------------------------------*/
mbed_official 87:085cde657901 86 #include "stm32f4xx_hal.h"
mbed_official 87:085cde657901 87
mbed_official 87:085cde657901 88 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 87:085cde657901 89 * @{
mbed_official 87:085cde657901 90 */
mbed_official 87:085cde657901 91
mbed_official 87:085cde657901 92 /** @defgroup NAND
mbed_official 87:085cde657901 93 * @brief NAND driver modules
mbed_official 87:085cde657901 94 * @{
mbed_official 87:085cde657901 95 */
mbed_official 87:085cde657901 96 #ifdef HAL_NAND_MODULE_ENABLED
mbed_official 87:085cde657901 97
mbed_official 87:085cde657901 98 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
mbed_official 87:085cde657901 99
mbed_official 87:085cde657901 100 /* Private typedef -----------------------------------------------------------*/
mbed_official 87:085cde657901 101 /* Private define ------------------------------------------------------------*/
mbed_official 87:085cde657901 102 /* Private macro -------------------------------------------------------------*/
mbed_official 87:085cde657901 103 /* Private variables ---------------------------------------------------------*/
mbed_official 87:085cde657901 104 /* Private function prototypes -----------------------------------------------*/
mbed_official 87:085cde657901 105 /* Private functions ---------------------------------------------------------*/
mbed_official 87:085cde657901 106
mbed_official 87:085cde657901 107 /** @defgroup NAND_Private_Functions
mbed_official 87:085cde657901 108 * @{
mbed_official 87:085cde657901 109 */
mbed_official 87:085cde657901 110
mbed_official 87:085cde657901 111 /** @defgroup NAND_Group1 Initialization and de-initialization functions
mbed_official 87:085cde657901 112 * @brief Initialization and Configuration functions
mbed_official 87:085cde657901 113 *
mbed_official 87:085cde657901 114 @verbatim
mbed_official 87:085cde657901 115 ==============================================================================
mbed_official 87:085cde657901 116 ##### NAND Initialization and de-initialization functions #####
mbed_official 87:085cde657901 117 ==============================================================================
mbed_official 87:085cde657901 118 [..]
mbed_official 87:085cde657901 119 This section provides functions allowing to initialize/de-initialize
mbed_official 87:085cde657901 120 the NAND memory
mbed_official 87:085cde657901 121
mbed_official 87:085cde657901 122 @endverbatim
mbed_official 87:085cde657901 123 * @{
mbed_official 87:085cde657901 124 */
mbed_official 87:085cde657901 125
mbed_official 87:085cde657901 126 /**
mbed_official 87:085cde657901 127 * @brief Perform NAND memory Initialization sequence
mbed_official 87:085cde657901 128 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 129 * @param ComSpace_Timing: pointer to Common space timing structure
mbed_official 87:085cde657901 130 * @param AttSpace_Timing: pointer to Attribute space timing structure
mbed_official 87:085cde657901 131 * @retval HAL status
mbed_official 87:085cde657901 132 */
mbed_official 87:085cde657901 133 HAL_StatusTypeDef HAL_NAND_Init(NAND_HandleTypeDef *hnand, FMC_NAND_PCC_TimingTypeDef *ComSpace_Timing, FMC_NAND_PCC_TimingTypeDef *AttSpace_Timing)
mbed_official 87:085cde657901 134 {
mbed_official 87:085cde657901 135 /* Check the NAND handle state */
mbed_official 87:085cde657901 136 if(hnand == NULL)
mbed_official 87:085cde657901 137 {
mbed_official 87:085cde657901 138 return HAL_ERROR;
mbed_official 87:085cde657901 139 }
mbed_official 87:085cde657901 140
mbed_official 87:085cde657901 141 if(hnand->State == HAL_NAND_STATE_RESET)
mbed_official 87:085cde657901 142 {
mbed_official 87:085cde657901 143 /* Initialize the low level hardware (MSP) */
mbed_official 87:085cde657901 144 HAL_NAND_MspInit(hnand);
mbed_official 87:085cde657901 145 }
mbed_official 87:085cde657901 146
mbed_official 87:085cde657901 147 /* Initialize NAND control Interface */
mbed_official 87:085cde657901 148 FMC_NAND_Init(hnand->Instance, &(hnand->Init));
mbed_official 87:085cde657901 149
mbed_official 87:085cde657901 150 /* Initialize NAND common space timing Interface */
mbed_official 87:085cde657901 151 FMC_NAND_CommonSpace_Timing_Init(hnand->Instance, ComSpace_Timing, hnand->Init.NandBank);
mbed_official 87:085cde657901 152
mbed_official 87:085cde657901 153 /* Initialize NAND attribute space timing Interface */
mbed_official 87:085cde657901 154 FMC_NAND_AttributeSpace_Timing_Init(hnand->Instance, AttSpace_Timing, hnand->Init.NandBank);
mbed_official 87:085cde657901 155
mbed_official 87:085cde657901 156 /* Enable the NAND device */
mbed_official 87:085cde657901 157 __FMC_NAND_ENABLE(hnand->Instance, hnand->Init.NandBank);
mbed_official 87:085cde657901 158
mbed_official 87:085cde657901 159 /* Update the NAND controller state */
mbed_official 87:085cde657901 160 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 161
mbed_official 87:085cde657901 162 return HAL_OK;
mbed_official 87:085cde657901 163
mbed_official 87:085cde657901 164 }
mbed_official 87:085cde657901 165
mbed_official 87:085cde657901 166 /**
mbed_official 87:085cde657901 167 * @brief Perform NAND memory De-Initialization sequence
mbed_official 87:085cde657901 168 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 169 * @retval HAL status
mbed_official 87:085cde657901 170 */
mbed_official 87:085cde657901 171 HAL_StatusTypeDef HAL_NAND_DeInit(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 172 {
mbed_official 87:085cde657901 173 /* Initialize the low level hardware (MSP) */
mbed_official 87:085cde657901 174 HAL_NAND_MspDeInit(hnand);
mbed_official 87:085cde657901 175
mbed_official 87:085cde657901 176 /* Configure the NAND registers with their reset values */
mbed_official 87:085cde657901 177 FMC_NAND_DeInit(hnand->Instance, hnand->Init.NandBank);
mbed_official 87:085cde657901 178
mbed_official 87:085cde657901 179 return HAL_OK;
mbed_official 87:085cde657901 180
mbed_official 87:085cde657901 181 }
mbed_official 87:085cde657901 182
mbed_official 87:085cde657901 183 /**
mbed_official 87:085cde657901 184 * @brief NAND MSP Init
mbed_official 87:085cde657901 185 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 186 * @retval None
mbed_official 87:085cde657901 187 */
mbed_official 87:085cde657901 188 __weak void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 189 {
mbed_official 87:085cde657901 190 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 191 the HAL_NAND_MspInit could be implemented in the user file
mbed_official 87:085cde657901 192 */
mbed_official 87:085cde657901 193 }
mbed_official 87:085cde657901 194
mbed_official 87:085cde657901 195 /**
mbed_official 87:085cde657901 196 * @brief NAND MSP DeInit
mbed_official 87:085cde657901 197 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 198 * @retval None
mbed_official 87:085cde657901 199 */
mbed_official 87:085cde657901 200 __weak void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 201 {
mbed_official 87:085cde657901 202 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 203 the HAL_NAND_MspDeInit could be implemented in the user file
mbed_official 87:085cde657901 204 */
mbed_official 87:085cde657901 205 }
mbed_official 87:085cde657901 206
mbed_official 87:085cde657901 207
mbed_official 87:085cde657901 208 /**
mbed_official 87:085cde657901 209 * @brief This function handles NAND device interrupt request.
mbed_official 87:085cde657901 210 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 211 * @retval HAL status
mbed_official 87:085cde657901 212 */
mbed_official 87:085cde657901 213 void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 214 {
mbed_official 87:085cde657901 215 /* Check NAND interrupt Rising edge flag */
mbed_official 87:085cde657901 216 if(__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_RISING_EDGE))
mbed_official 87:085cde657901 217 {
mbed_official 87:085cde657901 218 /* NAND interrupt callback*/
mbed_official 87:085cde657901 219 HAL_NAND_ITCallback(hnand);
mbed_official 87:085cde657901 220
mbed_official 87:085cde657901 221 /* Clear NAND interrupt Rising edge pending bit */
mbed_official 87:085cde657901 222 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_RISING_EDGE);
mbed_official 87:085cde657901 223 }
mbed_official 87:085cde657901 224
mbed_official 87:085cde657901 225 /* Check NAND interrupt Level flag */
mbed_official 87:085cde657901 226 if(__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_LEVEL))
mbed_official 87:085cde657901 227 {
mbed_official 87:085cde657901 228 /* NAND interrupt callback*/
mbed_official 87:085cde657901 229 HAL_NAND_ITCallback(hnand);
mbed_official 87:085cde657901 230
mbed_official 87:085cde657901 231 /* Clear NAND interrupt Level pending bit */
mbed_official 87:085cde657901 232 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_LEVEL);
mbed_official 87:085cde657901 233 }
mbed_official 87:085cde657901 234
mbed_official 87:085cde657901 235 /* Check NAND interrupt Falling edge flag */
mbed_official 87:085cde657901 236 if(__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FALLING_EDGE))
mbed_official 87:085cde657901 237 {
mbed_official 87:085cde657901 238 /* NAND interrupt callback*/
mbed_official 87:085cde657901 239 HAL_NAND_ITCallback(hnand);
mbed_official 87:085cde657901 240
mbed_official 87:085cde657901 241 /* Clear NAND interrupt Falling edge pending bit */
mbed_official 87:085cde657901 242 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FALLING_EDGE);
mbed_official 87:085cde657901 243 }
mbed_official 87:085cde657901 244
mbed_official 87:085cde657901 245 /* Check NAND interrupt FIFO empty flag */
mbed_official 87:085cde657901 246 if(__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FEMPT))
mbed_official 87:085cde657901 247 {
mbed_official 87:085cde657901 248 /* NAND interrupt callback*/
mbed_official 87:085cde657901 249 HAL_NAND_ITCallback(hnand);
mbed_official 87:085cde657901 250
mbed_official 87:085cde657901 251 /* Clear NAND interrupt FIFO empty pending bit */
mbed_official 87:085cde657901 252 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FEMPT);
mbed_official 87:085cde657901 253 }
mbed_official 87:085cde657901 254
mbed_official 87:085cde657901 255 }
mbed_official 87:085cde657901 256
mbed_official 87:085cde657901 257 /**
mbed_official 87:085cde657901 258 * @brief NAND interrupt feature callback
mbed_official 87:085cde657901 259 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 260 * @retval None
mbed_official 87:085cde657901 261 */
mbed_official 87:085cde657901 262 __weak void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 263 {
mbed_official 87:085cde657901 264 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 265 the HAL_NAND_ITCallback could be implemented in the user file
mbed_official 87:085cde657901 266 */
mbed_official 87:085cde657901 267 }
mbed_official 87:085cde657901 268
mbed_official 87:085cde657901 269 /**
mbed_official 87:085cde657901 270 * @}
mbed_official 87:085cde657901 271 */
mbed_official 87:085cde657901 272
mbed_official 87:085cde657901 273 /** @defgroup NAND_Group2 Input and Output functions
mbed_official 87:085cde657901 274 * @brief Input Output and memory control functions
mbed_official 87:085cde657901 275 *
mbed_official 87:085cde657901 276 @verbatim
mbed_official 87:085cde657901 277 ==============================================================================
mbed_official 87:085cde657901 278 ##### NAND Input and Output functions #####
mbed_official 87:085cde657901 279 ==============================================================================
mbed_official 87:085cde657901 280 [..]
mbed_official 87:085cde657901 281 This section provides functions allowing to use and control the NAND
mbed_official 87:085cde657901 282 memory
mbed_official 87:085cde657901 283
mbed_official 87:085cde657901 284 @endverbatim
mbed_official 87:085cde657901 285 * @{
mbed_official 87:085cde657901 286 */
mbed_official 87:085cde657901 287
mbed_official 87:085cde657901 288 /**
mbed_official 87:085cde657901 289 * @brief Read the NAND memory electronic signature
mbed_official 87:085cde657901 290 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 291 * @param pNAND_ID: NAND ID structure
mbed_official 87:085cde657901 292 * @retval HAL status
mbed_official 87:085cde657901 293 */
mbed_official 87:085cde657901 294 HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID)
mbed_official 87:085cde657901 295 {
mbed_official 87:085cde657901 296 __IO uint32_t data = 0;
mbed_official 87:085cde657901 297 uint32_t deviceAddress = 0;
mbed_official 87:085cde657901 298
mbed_official 87:085cde657901 299 /* Process Locked */
mbed_official 87:085cde657901 300 __HAL_LOCK(hnand);
mbed_official 87:085cde657901 301
mbed_official 87:085cde657901 302 /* Check the NAND controller state */
mbed_official 87:085cde657901 303 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 304 {
mbed_official 87:085cde657901 305 return HAL_BUSY;
mbed_official 87:085cde657901 306 }
mbed_official 87:085cde657901 307
mbed_official 87:085cde657901 308 /* Identify the device address */
mbed_official 87:085cde657901 309 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 310 {
mbed_official 87:085cde657901 311 deviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 312 }
mbed_official 87:085cde657901 313 else
mbed_official 87:085cde657901 314 {
mbed_official 87:085cde657901 315 deviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 316 }
mbed_official 87:085cde657901 317
mbed_official 87:085cde657901 318 /* Update the NAND controller state */
mbed_official 87:085cde657901 319 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 320
mbed_official 87:085cde657901 321 /* Send Read ID command sequence */
mbed_official 87:085cde657901 322 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0x90;
mbed_official 87:085cde657901 323 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = 0x00;
mbed_official 87:085cde657901 324
mbed_official 87:085cde657901 325 /* Read the electronic signature from NAND flash */
mbed_official 87:085cde657901 326 data = *(__IO uint32_t *)deviceAddress;
mbed_official 87:085cde657901 327
mbed_official 87:085cde657901 328 /* Return the data read */
mbed_official 87:085cde657901 329 pNAND_ID->Maker_Id = ADDR_1st_CYCLE(data);
mbed_official 87:085cde657901 330 pNAND_ID->Device_Id = ADDR_2nd_CYCLE(data);
mbed_official 87:085cde657901 331 pNAND_ID->Third_Id = ADDR_3rd_CYCLE(data);
mbed_official 87:085cde657901 332 pNAND_ID->Fourth_Id = ADDR_4th_CYCLE(data);
mbed_official 87:085cde657901 333
mbed_official 87:085cde657901 334 /* Update the NAND controller state */
mbed_official 87:085cde657901 335 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 336
mbed_official 87:085cde657901 337 /* Process unlocked */
mbed_official 87:085cde657901 338 __HAL_UNLOCK(hnand);
mbed_official 87:085cde657901 339
mbed_official 87:085cde657901 340 return HAL_OK;
mbed_official 87:085cde657901 341 }
mbed_official 87:085cde657901 342
mbed_official 87:085cde657901 343 /**
mbed_official 87:085cde657901 344 * @brief NAND memory reset
mbed_official 87:085cde657901 345 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 346 * @retval HAL status
mbed_official 87:085cde657901 347 */
mbed_official 87:085cde657901 348 HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 349 {
mbed_official 87:085cde657901 350 uint32_t deviceAddress = 0;
mbed_official 87:085cde657901 351
mbed_official 87:085cde657901 352 /* Process Locked */
mbed_official 87:085cde657901 353 __HAL_LOCK(hnand);
mbed_official 87:085cde657901 354
mbed_official 87:085cde657901 355 /* Check the NAND controller state */
mbed_official 87:085cde657901 356 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 357 {
mbed_official 87:085cde657901 358 return HAL_BUSY;
mbed_official 87:085cde657901 359 }
mbed_official 87:085cde657901 360
mbed_official 87:085cde657901 361 /* Identify the device address */
mbed_official 87:085cde657901 362 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 363 {
mbed_official 87:085cde657901 364 deviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 365 }
mbed_official 87:085cde657901 366 else
mbed_official 87:085cde657901 367 {
mbed_official 87:085cde657901 368 deviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 369 }
mbed_official 87:085cde657901 370
mbed_official 87:085cde657901 371 /* Update the NAND controller state */
mbed_official 87:085cde657901 372 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 373
mbed_official 87:085cde657901 374 /* Send NAND reset command */
mbed_official 87:085cde657901 375 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0xFF;
mbed_official 87:085cde657901 376
mbed_official 87:085cde657901 377
mbed_official 87:085cde657901 378 /* Update the NAND controller state */
mbed_official 87:085cde657901 379 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 380
mbed_official 87:085cde657901 381 /* Process unlocked */
mbed_official 87:085cde657901 382 __HAL_UNLOCK(hnand);
mbed_official 87:085cde657901 383
mbed_official 87:085cde657901 384 return HAL_OK;
mbed_official 87:085cde657901 385
mbed_official 87:085cde657901 386 }
mbed_official 87:085cde657901 387
mbed_official 87:085cde657901 388
mbed_official 87:085cde657901 389 /**
mbed_official 87:085cde657901 390 * @brief Read Page(s) from NAND memory block
mbed_official 87:085cde657901 391 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 392 * @param pAddress : pointer to NAND address structure
mbed_official 87:085cde657901 393 * @param pBuffer : pointer to destination read buffer
mbed_official 87:085cde657901 394 * @param NumPageToRead : number of pages to read from block
mbed_official 87:085cde657901 395 * @retval HAL status
mbed_official 87:085cde657901 396 */
mbed_official 87:085cde657901 397 HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypedef *pAddress, uint8_t *pBuffer, uint32_t NumPageToRead)
mbed_official 87:085cde657901 398 {
mbed_official 87:085cde657901 399 __IO uint32_t index = 0;
mbed_official 87:085cde657901 400 uint32_t deviceAddress = 0, size = 0, numPagesRead = 0, nandAddress = 0;
mbed_official 87:085cde657901 401
mbed_official 87:085cde657901 402 /* Process Locked */
mbed_official 87:085cde657901 403 __HAL_LOCK(hnand);
mbed_official 87:085cde657901 404
mbed_official 87:085cde657901 405 /* Check the NAND controller state */
mbed_official 87:085cde657901 406 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 407 {
mbed_official 87:085cde657901 408 return HAL_BUSY;
mbed_official 87:085cde657901 409 }
mbed_official 87:085cde657901 410
mbed_official 87:085cde657901 411 /* Identify the device address */
mbed_official 87:085cde657901 412 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 413 {
mbed_official 87:085cde657901 414 deviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 415 }
mbed_official 87:085cde657901 416 else
mbed_official 87:085cde657901 417 {
mbed_official 87:085cde657901 418 deviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 419 }
mbed_official 87:085cde657901 420
mbed_official 87:085cde657901 421 /* Update the NAND controller state */
mbed_official 87:085cde657901 422 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 423
mbed_official 87:085cde657901 424 /* NAND raw address calculation */
mbed_official 87:085cde657901 425 nandAddress = ARRAY_ADDRESS(pAddress, hnand);
mbed_official 87:085cde657901 426
mbed_official 87:085cde657901 427 /* Page(s) read loop */
mbed_official 87:085cde657901 428 while((NumPageToRead != 0) && (nandAddress < (hnand->Info.BlockSize) * (hnand->Info.PageSize)))
mbed_official 87:085cde657901 429 {
mbed_official 87:085cde657901 430 /* update the buffer size */
mbed_official 87:085cde657901 431 size = (hnand->Info.PageSize) + ((hnand->Info.PageSize) * numPagesRead);
mbed_official 87:085cde657901 432
mbed_official 87:085cde657901 433 /* Send read page command sequence */
mbed_official 87:085cde657901 434 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = NAND_CMD_AREA_A;
mbed_official 87:085cde657901 435
mbed_official 87:085cde657901 436 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = 0x00;
mbed_official 87:085cde657901 437 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_1st_CYCLE(nandAddress);
mbed_official 87:085cde657901 438 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_2nd_CYCLE(nandAddress);
mbed_official 87:085cde657901 439 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_3rd_CYCLE(nandAddress);
mbed_official 87:085cde657901 440
mbed_official 87:085cde657901 441 /* for 512 and 1 GB devices, 4th cycle is required */
mbed_official 87:085cde657901 442 if(hnand->Info.BlockNbr >= 1024)
mbed_official 87:085cde657901 443 {
mbed_official 87:085cde657901 444 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_4th_CYCLE(nandAddress);
mbed_official 87:085cde657901 445 }
mbed_official 87:085cde657901 446
mbed_official 87:085cde657901 447 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0x30;
mbed_official 87:085cde657901 448
mbed_official 87:085cde657901 449 /* Get Data into Buffer */
mbed_official 87:085cde657901 450 for(; index < size; index++)
mbed_official 87:085cde657901 451 {
mbed_official 87:085cde657901 452 *(uint8_t *)pBuffer++ = *(uint8_t *)deviceAddress;
mbed_official 87:085cde657901 453 }
mbed_official 87:085cde657901 454
mbed_official 87:085cde657901 455 /* Increment read pages number */
mbed_official 87:085cde657901 456 numPagesRead++;
mbed_official 87:085cde657901 457
mbed_official 87:085cde657901 458 /* Decrement pages to read */
mbed_official 87:085cde657901 459 NumPageToRead--;
mbed_official 87:085cde657901 460
mbed_official 87:085cde657901 461 /* Increment the NAND address */
mbed_official 87:085cde657901 462 nandAddress = (uint32_t)(nandAddress + (hnand->Info.PageSize * 8));
mbed_official 87:085cde657901 463
mbed_official 87:085cde657901 464 }
mbed_official 87:085cde657901 465
mbed_official 87:085cde657901 466 /* Update the NAND controller state */
mbed_official 87:085cde657901 467 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 468
mbed_official 87:085cde657901 469 /* Process unlocked */
mbed_official 87:085cde657901 470 __HAL_UNLOCK(hnand);
mbed_official 87:085cde657901 471
mbed_official 87:085cde657901 472 return HAL_OK;
mbed_official 87:085cde657901 473
mbed_official 87:085cde657901 474 }
mbed_official 87:085cde657901 475
mbed_official 87:085cde657901 476 /**
mbed_official 87:085cde657901 477 * @brief Write Page(s) to NAND memory block
mbed_official 87:085cde657901 478 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 479 * @param pAddress : pointer to NAND address structure
mbed_official 87:085cde657901 480 * @param pBuffer : pointer to source buffer to write
mbed_official 87:085cde657901 481 * @param NumPageToWrite : number of pages to write to block
mbed_official 87:085cde657901 482 * @retval HAL status
mbed_official 87:085cde657901 483 */
mbed_official 87:085cde657901 484 HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypedef *pAddress, uint8_t *pBuffer, uint32_t NumPageToWrite)
mbed_official 87:085cde657901 485 {
mbed_official 87:085cde657901 486 __IO uint32_t index = 0;
mbed_official 87:085cde657901 487 uint32_t timeout = 0;
mbed_official 87:085cde657901 488 uint32_t deviceAddress = 0, size = 0 , numPagesWritten = 0, nandAddress = 0;
mbed_official 87:085cde657901 489
mbed_official 87:085cde657901 490 /* Process Locked */
mbed_official 87:085cde657901 491 __HAL_LOCK(hnand);
mbed_official 87:085cde657901 492
mbed_official 87:085cde657901 493 /* Check the NAND controller state */
mbed_official 87:085cde657901 494 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 495 {
mbed_official 87:085cde657901 496 return HAL_BUSY;
mbed_official 87:085cde657901 497 }
mbed_official 87:085cde657901 498
mbed_official 87:085cde657901 499 /* Identify the device address */
mbed_official 87:085cde657901 500 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 501 {
mbed_official 87:085cde657901 502 deviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 503 }
mbed_official 87:085cde657901 504 else
mbed_official 87:085cde657901 505 {
mbed_official 87:085cde657901 506 deviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 507 }
mbed_official 87:085cde657901 508
mbed_official 87:085cde657901 509 /* Update the NAND controller state */
mbed_official 87:085cde657901 510 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 511
mbed_official 87:085cde657901 512 /* NAND raw address calculation */
mbed_official 87:085cde657901 513 nandAddress = ARRAY_ADDRESS(pAddress, hnand);
mbed_official 87:085cde657901 514
mbed_official 87:085cde657901 515 /* Page(s) write loop */
mbed_official 87:085cde657901 516 while((NumPageToWrite != 0) && (nandAddress < (hnand->Info.BlockSize) * (hnand->Info.PageSize)))
mbed_official 87:085cde657901 517 {
mbed_official 87:085cde657901 518 /* update the buffer size */
mbed_official 87:085cde657901 519 size = (hnand->Info.PageSize) + ((hnand->Info.PageSize) * numPagesWritten);
mbed_official 87:085cde657901 520
mbed_official 87:085cde657901 521 /* Send write page command sequence */
mbed_official 87:085cde657901 522 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = NAND_CMD_AREA_A;
mbed_official 87:085cde657901 523 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0x80;
mbed_official 87:085cde657901 524
mbed_official 87:085cde657901 525 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = 0x00;
mbed_official 87:085cde657901 526 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_1st_CYCLE(nandAddress);
mbed_official 87:085cde657901 527 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_2nd_CYCLE(nandAddress);
mbed_official 87:085cde657901 528 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_3rd_CYCLE(nandAddress);
mbed_official 87:085cde657901 529
mbed_official 87:085cde657901 530 /* for 512 and 1 GB devices, 4th cycle is required */
mbed_official 87:085cde657901 531 if(hnand->Info.BlockNbr >= 1024)
mbed_official 87:085cde657901 532 {
mbed_official 87:085cde657901 533 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_4th_CYCLE(nandAddress);
mbed_official 87:085cde657901 534 }
mbed_official 87:085cde657901 535
mbed_official 87:085cde657901 536 /* Write data to memory */
mbed_official 87:085cde657901 537 for(; index < size; index++)
mbed_official 87:085cde657901 538 {
mbed_official 87:085cde657901 539 *(__IO uint8_t *)deviceAddress = *(uint8_t *)pBuffer++;
mbed_official 87:085cde657901 540 }
mbed_official 87:085cde657901 541
mbed_official 87:085cde657901 542 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0x10;
mbed_official 87:085cde657901 543
mbed_official 87:085cde657901 544 /* Read status until NAND is ready */
mbed_official 87:085cde657901 545 while(HAL_NAND_Read_Status(hnand) != NAND_READY)
mbed_official 87:085cde657901 546 {
mbed_official 87:085cde657901 547 /* Check for timeout value */
mbed_official 87:085cde657901 548 timeout = HAL_GetTick() + NAND_WRITE_TIMEOUT;
mbed_official 87:085cde657901 549
mbed_official 87:085cde657901 550 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 551 {
mbed_official 87:085cde657901 552 return HAL_TIMEOUT;
mbed_official 87:085cde657901 553 }
mbed_official 87:085cde657901 554 }
mbed_official 87:085cde657901 555
mbed_official 87:085cde657901 556 /* Increment written pages number */
mbed_official 87:085cde657901 557 numPagesWritten++;
mbed_official 87:085cde657901 558
mbed_official 87:085cde657901 559 /* Decrement pages to write */
mbed_official 87:085cde657901 560 NumPageToWrite--;
mbed_official 87:085cde657901 561
mbed_official 87:085cde657901 562 /* Increment the NAND address */
mbed_official 87:085cde657901 563 nandAddress = (uint32_t)(nandAddress + (hnand->Info.PageSize * 8));
mbed_official 87:085cde657901 564
mbed_official 87:085cde657901 565 }
mbed_official 87:085cde657901 566
mbed_official 87:085cde657901 567 /* Update the NAND controller state */
mbed_official 87:085cde657901 568 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 569
mbed_official 87:085cde657901 570 /* Process unlocked */
mbed_official 87:085cde657901 571 __HAL_UNLOCK(hnand);
mbed_official 87:085cde657901 572
mbed_official 87:085cde657901 573 return HAL_OK;
mbed_official 87:085cde657901 574 }
mbed_official 87:085cde657901 575
mbed_official 87:085cde657901 576
mbed_official 87:085cde657901 577 /**
mbed_official 87:085cde657901 578 * @brief Read Spare area(s) from NAND memory
mbed_official 87:085cde657901 579 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 580 * @param pAddress : pointer to NAND address structure
mbed_official 87:085cde657901 581 * @param pBuffer: pointer to source buffer to write
mbed_official 87:085cde657901 582 * @param NumSpareAreaToRead: Number of spare area to read
mbed_official 87:085cde657901 583 * @retval HAL status
mbed_official 87:085cde657901 584 */
mbed_official 87:085cde657901 585 HAL_StatusTypeDef HAL_NAND_Read_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypedef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaToRead)
mbed_official 87:085cde657901 586 {
mbed_official 87:085cde657901 587 __IO uint32_t index = 0;
mbed_official 87:085cde657901 588 uint32_t deviceAddress = 0, size = 0, numSpareAreaRead = 0, nandAddress = 0;
mbed_official 87:085cde657901 589
mbed_official 87:085cde657901 590 /* Process Locked */
mbed_official 87:085cde657901 591 __HAL_LOCK(hnand);
mbed_official 87:085cde657901 592
mbed_official 87:085cde657901 593 /* Check the NAND controller state */
mbed_official 87:085cde657901 594 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 595 {
mbed_official 87:085cde657901 596 return HAL_BUSY;
mbed_official 87:085cde657901 597 }
mbed_official 87:085cde657901 598
mbed_official 87:085cde657901 599 /* Identify the device address */
mbed_official 87:085cde657901 600 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 601 {
mbed_official 87:085cde657901 602 deviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 603 }
mbed_official 87:085cde657901 604 else
mbed_official 87:085cde657901 605 {
mbed_official 87:085cde657901 606 deviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 607 }
mbed_official 87:085cde657901 608
mbed_official 87:085cde657901 609 /* Update the NAND controller state */
mbed_official 87:085cde657901 610 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 611
mbed_official 87:085cde657901 612 /* NAND raw address calculation */
mbed_official 87:085cde657901 613 nandAddress = ARRAY_ADDRESS(pAddress, hnand);
mbed_official 87:085cde657901 614
mbed_official 87:085cde657901 615 /* Spare area(s) read loop */
mbed_official 87:085cde657901 616 while((NumSpareAreaToRead != 0) && (nandAddress < (hnand->Info.BlockSize) * (hnand->Info.SpareAreaSize)))
mbed_official 87:085cde657901 617 {
mbed_official 87:085cde657901 618
mbed_official 87:085cde657901 619 /* update the buffer size */
mbed_official 87:085cde657901 620 size = (hnand->Info.PageSize) + ((hnand->Info.PageSize) * numSpareAreaRead);
mbed_official 87:085cde657901 621
mbed_official 87:085cde657901 622 /* Send read spare area command sequence */
mbed_official 87:085cde657901 623 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = NAND_CMD_AREA_C;
mbed_official 87:085cde657901 624
mbed_official 87:085cde657901 625 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = 0x00;
mbed_official 87:085cde657901 626 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_1st_CYCLE(nandAddress);
mbed_official 87:085cde657901 627 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_2nd_CYCLE(nandAddress);
mbed_official 87:085cde657901 628 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_3rd_CYCLE(nandAddress);
mbed_official 87:085cde657901 629
mbed_official 87:085cde657901 630 /* for 512 and 1 GB devices, 4th cycle is required */
mbed_official 87:085cde657901 631 if(hnand->Info.BlockNbr >= 1024)
mbed_official 87:085cde657901 632 {
mbed_official 87:085cde657901 633 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_4th_CYCLE(nandAddress);
mbed_official 87:085cde657901 634 }
mbed_official 87:085cde657901 635
mbed_official 87:085cde657901 636 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0x30;
mbed_official 87:085cde657901 637
mbed_official 87:085cde657901 638 /* Get Data into Buffer */
mbed_official 87:085cde657901 639 for ( ;index < size; index++)
mbed_official 87:085cde657901 640 {
mbed_official 87:085cde657901 641 *(uint8_t *)pBuffer++ = *(uint8_t *)deviceAddress;
mbed_official 87:085cde657901 642 }
mbed_official 87:085cde657901 643
mbed_official 87:085cde657901 644 /* Increment read spare areas number */
mbed_official 87:085cde657901 645 numSpareAreaRead++;
mbed_official 87:085cde657901 646
mbed_official 87:085cde657901 647 /* Decrement spare areas to read */
mbed_official 87:085cde657901 648 NumSpareAreaToRead--;
mbed_official 87:085cde657901 649
mbed_official 87:085cde657901 650 /* Increment the NAND address */
mbed_official 87:085cde657901 651 nandAddress = (uint32_t)(nandAddress + (hnand->Info.SpareAreaSize));
mbed_official 87:085cde657901 652 }
mbed_official 87:085cde657901 653
mbed_official 87:085cde657901 654 /* Update the NAND controller state */
mbed_official 87:085cde657901 655 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 656
mbed_official 87:085cde657901 657 /* Process unlocked */
mbed_official 87:085cde657901 658 __HAL_UNLOCK(hnand);
mbed_official 87:085cde657901 659
mbed_official 87:085cde657901 660 return HAL_OK;
mbed_official 87:085cde657901 661 }
mbed_official 87:085cde657901 662
mbed_official 87:085cde657901 663 /**
mbed_official 87:085cde657901 664 * @brief Write Spare area(s) to NAND memory
mbed_official 87:085cde657901 665 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 666 * @param pAddress : pointer to NAND address structure
mbed_official 87:085cde657901 667 * @param pBuffer : pointer to source buffer to write
mbed_official 87:085cde657901 668 * @param NumSpareAreaTowrite : number of spare areas to write to block
mbed_official 87:085cde657901 669 * @retval HAL status
mbed_official 87:085cde657901 670 */
mbed_official 87:085cde657901 671 HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypedef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaTowrite)
mbed_official 87:085cde657901 672 {
mbed_official 87:085cde657901 673 __IO uint32_t index = 0;
mbed_official 87:085cde657901 674 uint32_t timeout = 0;
mbed_official 87:085cde657901 675 uint32_t deviceAddress = 0, size = 0, numSpareAreaWritten = 0, nandAddress = 0;
mbed_official 87:085cde657901 676
mbed_official 87:085cde657901 677 /* Process Locked */
mbed_official 87:085cde657901 678 __HAL_LOCK(hnand);
mbed_official 87:085cde657901 679
mbed_official 87:085cde657901 680 /* Check the NAND controller state */
mbed_official 87:085cde657901 681 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 682 {
mbed_official 87:085cde657901 683 return HAL_BUSY;
mbed_official 87:085cde657901 684 }
mbed_official 87:085cde657901 685
mbed_official 87:085cde657901 686 /* Identify the device address */
mbed_official 87:085cde657901 687 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 688 {
mbed_official 87:085cde657901 689 deviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 690 }
mbed_official 87:085cde657901 691 else
mbed_official 87:085cde657901 692 {
mbed_official 87:085cde657901 693 deviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 694 }
mbed_official 87:085cde657901 695
mbed_official 87:085cde657901 696 /* Update the FMC_NAND controller state */
mbed_official 87:085cde657901 697 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 698
mbed_official 87:085cde657901 699 /* NAND raw address calculation */
mbed_official 87:085cde657901 700 nandAddress = ARRAY_ADDRESS(pAddress, hnand);
mbed_official 87:085cde657901 701
mbed_official 87:085cde657901 702 /* Spare area(s) write loop */
mbed_official 87:085cde657901 703 while((NumSpareAreaTowrite != 0) && (nandAddress < (hnand->Info.BlockSize) * (hnand->Info.SpareAreaSize)))
mbed_official 87:085cde657901 704 {
mbed_official 87:085cde657901 705 /* update the buffer size */
mbed_official 87:085cde657901 706 size = (hnand->Info.PageSize) + ((hnand->Info.PageSize) * numSpareAreaWritten);
mbed_official 87:085cde657901 707
mbed_official 87:085cde657901 708 /* Send write Spare area command sequence */
mbed_official 87:085cde657901 709 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = NAND_CMD_AREA_C;
mbed_official 87:085cde657901 710 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0x80;
mbed_official 87:085cde657901 711
mbed_official 87:085cde657901 712 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = 0x00;
mbed_official 87:085cde657901 713 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_1st_CYCLE(nandAddress);
mbed_official 87:085cde657901 714 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_2nd_CYCLE(nandAddress);
mbed_official 87:085cde657901 715 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_3rd_CYCLE(nandAddress);
mbed_official 87:085cde657901 716
mbed_official 87:085cde657901 717 /* for 512 and 1 GB devices, 4th cycle is required */
mbed_official 87:085cde657901 718 if(hnand->Info.BlockNbr >= 1024)
mbed_official 87:085cde657901 719 {
mbed_official 87:085cde657901 720 *(__IO uint8_t *)((uint32_t)(deviceAddress | ADDR_AREA)) = ADDR_4th_CYCLE(nandAddress);
mbed_official 87:085cde657901 721 }
mbed_official 87:085cde657901 722
mbed_official 87:085cde657901 723 /* Write data to memory */
mbed_official 87:085cde657901 724 for(; index < size; index++)
mbed_official 87:085cde657901 725 {
mbed_official 87:085cde657901 726 *(__IO uint8_t *)deviceAddress = *(uint8_t *)pBuffer++;
mbed_official 87:085cde657901 727 }
mbed_official 87:085cde657901 728
mbed_official 87:085cde657901 729 *(__IO uint8_t *)((uint32_t)(deviceAddress | CMD_AREA)) = 0x10;
mbed_official 87:085cde657901 730
mbed_official 87:085cde657901 731
mbed_official 87:085cde657901 732 /* Read status until NAND is ready */
mbed_official 87:085cde657901 733 while(HAL_NAND_Read_Status(hnand) != NAND_READY)
mbed_official 87:085cde657901 734 {
mbed_official 87:085cde657901 735 /* Check for timeout value */
mbed_official 87:085cde657901 736 timeout = HAL_GetTick() + NAND_WRITE_TIMEOUT;
mbed_official 87:085cde657901 737
mbed_official 87:085cde657901 738 if(HAL_GetTick() >= timeout)
mbed_official 87:085cde657901 739 {
mbed_official 87:085cde657901 740 return HAL_TIMEOUT;
mbed_official 87:085cde657901 741 }
mbed_official 87:085cde657901 742 }
mbed_official 87:085cde657901 743
mbed_official 87:085cde657901 744 /* Increment written spare areas number */
mbed_official 87:085cde657901 745 numSpareAreaWritten++;
mbed_official 87:085cde657901 746
mbed_official 87:085cde657901 747 /* Decrement spare areas to write */
mbed_official 87:085cde657901 748 NumSpareAreaTowrite--;
mbed_official 87:085cde657901 749
mbed_official 87:085cde657901 750 /* Increment the NAND address */
mbed_official 87:085cde657901 751 nandAddress = (uint32_t)(nandAddress + (hnand->Info.PageSize));
mbed_official 87:085cde657901 752
mbed_official 87:085cde657901 753 }
mbed_official 87:085cde657901 754
mbed_official 87:085cde657901 755 /* Update the NAND controller state */
mbed_official 87:085cde657901 756 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 757
mbed_official 87:085cde657901 758 /* Process unlocked */
mbed_official 87:085cde657901 759 __HAL_UNLOCK(hnand);
mbed_official 87:085cde657901 760
mbed_official 87:085cde657901 761 return HAL_OK;
mbed_official 87:085cde657901 762 }
mbed_official 87:085cde657901 763
mbed_official 87:085cde657901 764 /**
mbed_official 87:085cde657901 765 * @brief NAND memory Block erase
mbed_official 87:085cde657901 766 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 767 * @param pAddress : pointer to NAND address structure
mbed_official 87:085cde657901 768 * @retval HAL status
mbed_official 87:085cde657901 769 */
mbed_official 87:085cde657901 770 HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand, NAND_AddressTypedef *pAddress)
mbed_official 87:085cde657901 771 {
mbed_official 87:085cde657901 772 uint32_t DeviceAddress = 0;
mbed_official 87:085cde657901 773
mbed_official 87:085cde657901 774 /* Process Locked */
mbed_official 87:085cde657901 775 __HAL_LOCK(hnand);
mbed_official 87:085cde657901 776
mbed_official 87:085cde657901 777 /* Check the NAND controller state */
mbed_official 87:085cde657901 778 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 779 {
mbed_official 87:085cde657901 780 return HAL_BUSY;
mbed_official 87:085cde657901 781 }
mbed_official 87:085cde657901 782
mbed_official 87:085cde657901 783 /* Identify the device address */
mbed_official 87:085cde657901 784 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 785 {
mbed_official 87:085cde657901 786 DeviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 787 }
mbed_official 87:085cde657901 788 else
mbed_official 87:085cde657901 789 {
mbed_official 87:085cde657901 790 DeviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 791 }
mbed_official 87:085cde657901 792
mbed_official 87:085cde657901 793 /* Update the NAND controller state */
mbed_official 87:085cde657901 794 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 795
mbed_official 87:085cde657901 796 /* Send Erase block command sequence */
mbed_official 87:085cde657901 797 *(__IO uint8_t *)((uint32_t)(DeviceAddress | CMD_AREA)) = 0x60;
mbed_official 87:085cde657901 798
mbed_official 87:085cde657901 799 *(__IO uint8_t *)((uint32_t)(DeviceAddress | ADDR_AREA)) = ADDR_1st_CYCLE(ARRAY_ADDRESS(pAddress, hnand));
mbed_official 87:085cde657901 800 *(__IO uint8_t *)((uint32_t)(DeviceAddress | ADDR_AREA)) = ADDR_2nd_CYCLE(ARRAY_ADDRESS(pAddress, hnand));
mbed_official 87:085cde657901 801 *(__IO uint8_t *)((uint32_t)(DeviceAddress | ADDR_AREA)) = ADDR_3rd_CYCLE(ARRAY_ADDRESS(pAddress, hnand));
mbed_official 87:085cde657901 802
mbed_official 87:085cde657901 803 /* for 512 and 1 GB devices, 4th cycle is required */
mbed_official 87:085cde657901 804 if(hnand->Info.BlockNbr >= 1024)
mbed_official 87:085cde657901 805 {
mbed_official 87:085cde657901 806 *(__IO uint8_t *)((uint32_t)(DeviceAddress | ADDR_AREA)) = ADDR_4th_CYCLE(ARRAY_ADDRESS(pAddress, hnand));
mbed_official 87:085cde657901 807 }
mbed_official 87:085cde657901 808
mbed_official 87:085cde657901 809 *(__IO uint8_t *)((uint32_t)(DeviceAddress | CMD_AREA)) = 0xD0;
mbed_official 87:085cde657901 810
mbed_official 87:085cde657901 811 /* Update the NAND controller state */
mbed_official 87:085cde657901 812 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 813
mbed_official 87:085cde657901 814 /* Process unlocked */
mbed_official 87:085cde657901 815 __HAL_UNLOCK(hnand);
mbed_official 87:085cde657901 816
mbed_official 87:085cde657901 817 return HAL_OK;
mbed_official 87:085cde657901 818 }
mbed_official 87:085cde657901 819
mbed_official 87:085cde657901 820
mbed_official 87:085cde657901 821 /**
mbed_official 87:085cde657901 822 * @brief NAND memory read status
mbed_official 87:085cde657901 823 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 824 * @retval NAND status
mbed_official 87:085cde657901 825 */
mbed_official 87:085cde657901 826 uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 827 {
mbed_official 87:085cde657901 828 uint32_t data = 0;
mbed_official 87:085cde657901 829 uint32_t DeviceAddress = 0;
mbed_official 87:085cde657901 830
mbed_official 87:085cde657901 831 /* Identify the device address */
mbed_official 87:085cde657901 832 if(hnand->Init.NandBank == FMC_NAND_BANK2)
mbed_official 87:085cde657901 833 {
mbed_official 87:085cde657901 834 DeviceAddress = NAND_DEVICE1;
mbed_official 87:085cde657901 835 }
mbed_official 87:085cde657901 836 else
mbed_official 87:085cde657901 837 {
mbed_official 87:085cde657901 838 DeviceAddress = NAND_DEVICE2;
mbed_official 87:085cde657901 839 }
mbed_official 87:085cde657901 840
mbed_official 87:085cde657901 841 /* Send Read status operation command */
mbed_official 87:085cde657901 842 *(__IO uint8_t *)((uint32_t)(DeviceAddress | CMD_AREA)) = 0x70;
mbed_official 87:085cde657901 843
mbed_official 87:085cde657901 844 /* Read status register data */
mbed_official 87:085cde657901 845 data = *(__IO uint8_t *)DeviceAddress;
mbed_official 87:085cde657901 846
mbed_official 87:085cde657901 847 /* Return the status */
mbed_official 87:085cde657901 848 if((data & NAND_ERROR) == NAND_ERROR)
mbed_official 87:085cde657901 849 {
mbed_official 87:085cde657901 850 return NAND_ERROR;
mbed_official 87:085cde657901 851 }
mbed_official 87:085cde657901 852 else if((data & NAND_READY) == NAND_READY)
mbed_official 87:085cde657901 853 {
mbed_official 87:085cde657901 854 return NAND_READY;
mbed_official 87:085cde657901 855 }
mbed_official 87:085cde657901 856
mbed_official 87:085cde657901 857 return NAND_BUSY;
mbed_official 87:085cde657901 858
mbed_official 87:085cde657901 859 }
mbed_official 87:085cde657901 860
mbed_official 87:085cde657901 861 /**
mbed_official 87:085cde657901 862 * @brief Increment the NAND memory address
mbed_official 87:085cde657901 863 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 864 * @param pAddress: pointer to NAND adress structure
mbed_official 87:085cde657901 865 * @retval The new status of the increment address operation. It can be:
mbed_official 87:085cde657901 866 * - NAND_VALID_ADDRESS: When the new address is valid address
mbed_official 87:085cde657901 867 * - NAND_INVALID_ADDRESS: When the new address is invalid address
mbed_official 87:085cde657901 868 */
mbed_official 87:085cde657901 869 uint32_t HAL_NAND_Address_Inc(NAND_HandleTypeDef *hnand, NAND_AddressTypedef *pAddress)
mbed_official 87:085cde657901 870 {
mbed_official 87:085cde657901 871 uint32_t status = NAND_VALID_ADDRESS;
mbed_official 87:085cde657901 872
mbed_official 87:085cde657901 873 /* Increment page address */
mbed_official 87:085cde657901 874 pAddress->Page++;
mbed_official 87:085cde657901 875
mbed_official 87:085cde657901 876 /* Check NAND address is valid */
mbed_official 87:085cde657901 877 if(pAddress->Page == hnand->Info.BlockSize)
mbed_official 87:085cde657901 878 {
mbed_official 87:085cde657901 879 pAddress->Page = 0;
mbed_official 87:085cde657901 880 pAddress->Block++;
mbed_official 87:085cde657901 881
mbed_official 87:085cde657901 882 if(pAddress->Block == hnand->Info.ZoneSize)
mbed_official 87:085cde657901 883 {
mbed_official 87:085cde657901 884 pAddress->Block = 0;
mbed_official 87:085cde657901 885 pAddress->Zone++;
mbed_official 87:085cde657901 886
mbed_official 87:085cde657901 887 if(pAddress->Zone == (hnand->Info.ZoneSize/ hnand->Info.BlockNbr))
mbed_official 87:085cde657901 888 {
mbed_official 87:085cde657901 889 status = NAND_INVALID_ADDRESS;
mbed_official 87:085cde657901 890 }
mbed_official 87:085cde657901 891 }
mbed_official 87:085cde657901 892 }
mbed_official 87:085cde657901 893
mbed_official 87:085cde657901 894 return (status);
mbed_official 87:085cde657901 895 }
mbed_official 87:085cde657901 896
mbed_official 87:085cde657901 897
mbed_official 87:085cde657901 898 /**
mbed_official 87:085cde657901 899 * @}
mbed_official 87:085cde657901 900 */
mbed_official 87:085cde657901 901
mbed_official 87:085cde657901 902 /** @defgroup NAND_Group3 Control functions
mbed_official 87:085cde657901 903 * @brief management functions
mbed_official 87:085cde657901 904 *
mbed_official 87:085cde657901 905 @verbatim
mbed_official 87:085cde657901 906 ==============================================================================
mbed_official 87:085cde657901 907 ##### NAND Control functions #####
mbed_official 87:085cde657901 908 ==============================================================================
mbed_official 87:085cde657901 909 [..]
mbed_official 87:085cde657901 910 This subsection provides a set of functions allowing to control dynamically
mbed_official 87:085cde657901 911 the NAND interface.
mbed_official 87:085cde657901 912
mbed_official 87:085cde657901 913 @endverbatim
mbed_official 87:085cde657901 914 * @{
mbed_official 87:085cde657901 915 */
mbed_official 87:085cde657901 916
mbed_official 87:085cde657901 917
mbed_official 87:085cde657901 918 /**
mbed_official 87:085cde657901 919 * @brief Enables dynamically NAND ECC feature.
mbed_official 87:085cde657901 920 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 921 * @retval HAL status
mbed_official 87:085cde657901 922 */
mbed_official 87:085cde657901 923 HAL_StatusTypeDef HAL_NAND_ECC_Enable(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 924 {
mbed_official 87:085cde657901 925 /* Check the NAND controller state */
mbed_official 87:085cde657901 926 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 927 {
mbed_official 87:085cde657901 928 return HAL_BUSY;
mbed_official 87:085cde657901 929 }
mbed_official 87:085cde657901 930
mbed_official 87:085cde657901 931 /* Update the NAND state */
mbed_official 87:085cde657901 932 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 933
mbed_official 87:085cde657901 934 /* Enable ECC feature */
mbed_official 87:085cde657901 935 FMC_NAND_ECC_Enable(hnand->Instance, hnand->Init.NandBank);
mbed_official 87:085cde657901 936
mbed_official 87:085cde657901 937 /* Update the NAND state */
mbed_official 87:085cde657901 938 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 939
mbed_official 87:085cde657901 940 return HAL_OK;
mbed_official 87:085cde657901 941 }
mbed_official 87:085cde657901 942
mbed_official 87:085cde657901 943
mbed_official 87:085cde657901 944 /**
mbed_official 87:085cde657901 945 * @brief Disables dynamically FMC_NAND ECC feature.
mbed_official 87:085cde657901 946 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 947 * @retval HAL status
mbed_official 87:085cde657901 948 */
mbed_official 87:085cde657901 949 HAL_StatusTypeDef HAL_NAND_ECC_Disable(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 950 {
mbed_official 87:085cde657901 951 /* Check the NAND controller state */
mbed_official 87:085cde657901 952 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 953 {
mbed_official 87:085cde657901 954 return HAL_BUSY;
mbed_official 87:085cde657901 955 }
mbed_official 87:085cde657901 956
mbed_official 87:085cde657901 957 /* Update the NAND state */
mbed_official 87:085cde657901 958 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 959
mbed_official 87:085cde657901 960 /* Disable ECC feature */
mbed_official 87:085cde657901 961 FMC_NAND_ECC_Disable(hnand->Instance, hnand->Init.NandBank);
mbed_official 87:085cde657901 962
mbed_official 87:085cde657901 963 /* Update the NAND state */
mbed_official 87:085cde657901 964 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 965
mbed_official 87:085cde657901 966 return HAL_OK;
mbed_official 87:085cde657901 967 }
mbed_official 87:085cde657901 968
mbed_official 87:085cde657901 969 /**
mbed_official 87:085cde657901 970 * @brief Disables dynamically NAND ECC feature.
mbed_official 87:085cde657901 971 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 972 * @param ECCval: pointer to ECC value
mbed_official 87:085cde657901 973 * @param Timeout: maximum timeout to wait
mbed_official 87:085cde657901 974 * @retval HAL status
mbed_official 87:085cde657901 975 */
mbed_official 87:085cde657901 976 HAL_StatusTypeDef HAL_NAND_GetECC(NAND_HandleTypeDef *hnand, uint32_t *ECCval, uint32_t Timeout)
mbed_official 87:085cde657901 977 {
mbed_official 87:085cde657901 978 HAL_StatusTypeDef status = HAL_OK;
mbed_official 87:085cde657901 979
mbed_official 87:085cde657901 980 /* Check the NAND controller state */
mbed_official 87:085cde657901 981 if(hnand->State == HAL_NAND_STATE_BUSY)
mbed_official 87:085cde657901 982 {
mbed_official 87:085cde657901 983 return HAL_BUSY;
mbed_official 87:085cde657901 984 }
mbed_official 87:085cde657901 985
mbed_official 87:085cde657901 986 /* Update the NAND state */
mbed_official 87:085cde657901 987 hnand->State = HAL_NAND_STATE_BUSY;
mbed_official 87:085cde657901 988
mbed_official 87:085cde657901 989 /* Get NAND ECC value */
mbed_official 87:085cde657901 990 status = FMC_NAND_GetECC(hnand->Instance, ECCval, hnand->Init.NandBank, Timeout);
mbed_official 87:085cde657901 991
mbed_official 87:085cde657901 992 /* Update the NAND state */
mbed_official 87:085cde657901 993 hnand->State = HAL_NAND_STATE_READY;
mbed_official 87:085cde657901 994
mbed_official 87:085cde657901 995 return status;
mbed_official 87:085cde657901 996 }
mbed_official 87:085cde657901 997
mbed_official 87:085cde657901 998 /**
mbed_official 87:085cde657901 999 * @}
mbed_official 87:085cde657901 1000 */
mbed_official 87:085cde657901 1001
mbed_official 87:085cde657901 1002
mbed_official 87:085cde657901 1003 /** @defgroup NAND_Group4 State functions
mbed_official 87:085cde657901 1004 * @brief Peripheral State functions
mbed_official 87:085cde657901 1005 *
mbed_official 87:085cde657901 1006 @verbatim
mbed_official 87:085cde657901 1007 ==============================================================================
mbed_official 87:085cde657901 1008 ##### NAND State functions #####
mbed_official 87:085cde657901 1009 ==============================================================================
mbed_official 87:085cde657901 1010 [..]
mbed_official 87:085cde657901 1011 This subsection permit to get in run-time the status of the NAND controller
mbed_official 87:085cde657901 1012 and the data flow.
mbed_official 87:085cde657901 1013
mbed_official 87:085cde657901 1014 @endverbatim
mbed_official 87:085cde657901 1015 * @{
mbed_official 87:085cde657901 1016 */
mbed_official 87:085cde657901 1017
mbed_official 87:085cde657901 1018 /**
mbed_official 87:085cde657901 1019 * @brief return the NAND state
mbed_official 87:085cde657901 1020 * @param hnand: pointer to NAND handle
mbed_official 87:085cde657901 1021 * @retval HAL state
mbed_official 87:085cde657901 1022 */
mbed_official 87:085cde657901 1023 HAL_NAND_StateTypeDef HAL_NAND_GetState(NAND_HandleTypeDef *hnand)
mbed_official 87:085cde657901 1024 {
mbed_official 87:085cde657901 1025 return hnand->State;
mbed_official 87:085cde657901 1026 }
mbed_official 87:085cde657901 1027
mbed_official 87:085cde657901 1028 /**
mbed_official 87:085cde657901 1029 * @}
mbed_official 87:085cde657901 1030 */
mbed_official 87:085cde657901 1031
mbed_official 87:085cde657901 1032 /**
mbed_official 87:085cde657901 1033 * @}
mbed_official 87:085cde657901 1034 */
mbed_official 87:085cde657901 1035 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
mbed_official 87:085cde657901 1036 #endif /* HAL_NAND_MODULE_ENABLED */
mbed_official 87:085cde657901 1037
mbed_official 87:085cde657901 1038 /**
mbed_official 87:085cde657901 1039 * @}
mbed_official 87:085cde657901 1040 */
mbed_official 87:085cde657901 1041
mbed_official 87:085cde657901 1042 /**
mbed_official 87:085cde657901 1043 * @}
mbed_official 87:085cde657901 1044 */
mbed_official 87:085cde657901 1045
mbed_official 87:085cde657901 1046 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/