mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
jaerts
Date:
Tue Dec 22 13:22:16 2015 +0000
Revision:
637:ed69428d4850
Parent:
610:813dcc80987e
Add very shady LPC1768 CAN Filter implementation

Who changed what in which revision?

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