source: rtems/c/src/lib/libbsp/arm/stm32f7x/hal/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_nor.c @ c20847a5

5
Last change on this file since c20847a5 was c20847a5, checked in by Isaac Gutekunst <isaac.gutekunst@…>, on 09/16/15 at 13:16:02

Add STM32F7 HAL Files

These files originated as:

+ STC32CubeF7 V1.1.0 from http://www.st.com/web/en/catalog/tools/PF261909

  • Property mode set to 100644
File size: 31.2 KB
Line 
1/**
2  ******************************************************************************
3  * @file    stm32f7xx_hal_nor.c
4  * @author  MCD Application Team
5  * @version V1.0.1
6  * @date    25-June-2015
7  * @brief   NOR HAL module driver.
8  *          This file provides a generic firmware to drive NOR memories mounted
9  *          as external device.
10  *
11  @verbatim
12  ==============================================================================
13                     ##### How to use this driver #####
14  ==============================================================================
15    [..]
16      This driver is a generic layered driver which contains a set of APIs used to
17      control NOR flash memories. It uses the FMC layer functions to interface
18      with NOR devices. This driver is used as follows:
19
20      (+) NOR flash memory configuration sequence using the function HAL_NOR_Init()
21          with control and timing parameters for both normal and extended mode.
22
23      (+) Read NOR flash memory manufacturer code and device IDs using the function
24          HAL_NOR_Read_ID(). The read information is stored in the NOR_ID_TypeDef
25          structure declared by the function caller.
26
27      (+) Access NOR flash memory by read/write data unit operations using the functions
28          HAL_NOR_Read(), HAL_NOR_Program().
29
30      (+) Perform NOR flash erase block/chip operations using the functions
31          HAL_NOR_Erase_Block() and HAL_NOR_Erase_Chip().
32
33      (+) Read the NOR flash CFI (common flash interface) IDs using the function
34          HAL_NOR_Read_CFI(). The read information is stored in the NOR_CFI_TypeDef
35          structure declared by the function caller.
36
37      (+) You can also control the NOR device by calling the control APIs HAL_NOR_WriteOperation_Enable()/
38          HAL_NOR_WriteOperation_Disable() to respectively enable/disable the NOR write operation
39
40      (+) You can monitor the NOR device HAL state by calling the function
41          HAL_NOR_GetState()
42    [..]
43     (@) This driver is a set of generic APIs which handle standard NOR flash operations.
44         If a NOR flash device contains different operations and/or implementations,
45         it should be implemented separately.
46
47     *** NOR HAL driver macros list ***
48     =============================================
49     [..]
50       Below the list of most used macros in NOR HAL driver.
51
52      (+) NOR_WRITE : NOR memory write data to specified address
53
54  @endverbatim
55  ******************************************************************************
56  * @attention
57  *
58  * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
59  *
60  * Redistribution and use in source and binary forms, with or without modification,
61  * are permitted provided that the following conditions are met:
62  *   1. Redistributions of source code must retain the above copyright notice,
63  *      this list of conditions and the following disclaimer.
64  *   2. Redistributions in binary form must reproduce the above copyright notice,
65  *      this list of conditions and the following disclaimer in the documentation
66  *      and/or other materials provided with the distribution.
67  *   3. Neither the name of STMicroelectronics nor the names of its contributors
68  *      may be used to endorse or promote products derived from this software
69  *      without specific prior written permission.
70  *
71  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
72  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
73  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
74  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
75  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
76  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
77  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
78  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
79  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
80  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
81  *
82  ******************************************************************************
83  */
84
85/* Includes ------------------------------------------------------------------*/
86#include "stm32f7xx_hal.h"
87
88/** @addtogroup STM32F7xx_HAL_Driver
89  * @{
90  */
91
92/** @defgroup NOR NOR
93  * @brief NOR driver modules
94  * @{
95  */
96#ifdef HAL_NOR_MODULE_ENABLED
97
98/* Private typedef -----------------------------------------------------------*/
99/* Private define ------------------------------------------------------------*/
100
101/** @defgroup NOR_Private_Defines NOR Private Defines
102  * @{
103  */
104
105/* Constants to define address to set to write a command */
106#define NOR_CMD_ADDRESS_FIRST                 (uint16_t)0x0555
107#define NOR_CMD_ADDRESS_FIRST_CFI             (uint16_t)0x0055
108#define NOR_CMD_ADDRESS_SECOND                (uint16_t)0x02AA
109#define NOR_CMD_ADDRESS_THIRD                 (uint16_t)0x0555
110#define NOR_CMD_ADDRESS_FOURTH                (uint16_t)0x0555
111#define NOR_CMD_ADDRESS_FIFTH                 (uint16_t)0x02AA
112#define NOR_CMD_ADDRESS_SIXTH                 (uint16_t)0x0555
113
114/* Constants to define data to program a command */
115#define NOR_CMD_DATA_READ_RESET               (uint16_t)0x00F0
116#define NOR_CMD_DATA_FIRST                    (uint16_t)0x00AA
117#define NOR_CMD_DATA_SECOND                   (uint16_t)0x0055
118#define NOR_CMD_DATA_AUTO_SELECT              (uint16_t)0x0090
119#define NOR_CMD_DATA_PROGRAM                  (uint16_t)0x00A0
120#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD   (uint16_t)0x0080
121#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH  (uint16_t)0x00AA
122#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH   (uint16_t)0x0055
123#define NOR_CMD_DATA_CHIP_ERASE               (uint16_t)0x0010
124#define NOR_CMD_DATA_CFI                      (uint16_t)0x0098
125
126#define NOR_CMD_DATA_BUFFER_AND_PROG          (uint8_t)0x25
127#define NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM  (uint8_t)0x29
128#define NOR_CMD_DATA_BLOCK_ERASE              (uint8_t)0x30
129
130/* Mask on NOR STATUS REGISTER */
131#define NOR_MASK_STATUS_DQ5                   (uint16_t)0x0020
132#define NOR_MASK_STATUS_DQ6                   (uint16_t)0x0040
133
134/**
135  * @}
136  */
137
138/* Private macro -------------------------------------------------------------*/
139/* Private variables ---------------------------------------------------------*/
140/* Private functions ---------------------------------------------------------*/
141/* Exported functions --------------------------------------------------------*/
142/** @defgroup NOR_Exported_Functions NOR Exported Functions
143  * @{
144  */
145
146/** @defgroup NOR_Exported_Functions_Group1 Initialization and de-initialization functions
147  * @brief    Initialization and Configuration functions
148  *
149  @verbatim
150  ==============================================================================
151           ##### NOR Initialization and de_initialization functions #####
152  ==============================================================================
153  [..]
154    This section provides functions allowing to initialize/de-initialize
155    the NOR memory
156
157@endverbatim
158  * @{
159  */
160
161/**
162  * @brief  Perform the NOR memory Initialization sequence
163  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
164  *                the configuration information for NOR module.
165  * @param  Timing: pointer to NOR control timing structure
166  * @param  ExtTiming: pointer to NOR extended mode timing structure
167  * @retval HAL status
168  */
169HAL_StatusTypeDef HAL_NOR_Init(NOR_HandleTypeDef *hnor, FMC_NORSRAM_TimingTypeDef *Timing, FMC_NORSRAM_TimingTypeDef *ExtTiming)
170{
171  /* Check the NOR handle parameter */
172  if(hnor == NULL)
173  {
174     return HAL_ERROR;
175  }
176
177  if(hnor->State == HAL_NOR_STATE_RESET)
178  {
179    /* Allocate lock resource and initialize it */
180    hnor->Lock = HAL_UNLOCKED;
181    /* Initialize the low level hardware (MSP) */
182    HAL_NOR_MspInit(hnor);
183  }
184
185  /* Initialize NOR control Interface */
186  FMC_NORSRAM_Init(hnor->Instance, &(hnor->Init));
187
188  /* Initialize NOR timing Interface */
189  FMC_NORSRAM_Timing_Init(hnor->Instance, Timing, hnor->Init.NSBank);
190
191  /* Initialize NOR extended mode timing Interface */
192  FMC_NORSRAM_Extended_Timing_Init(hnor->Extended, ExtTiming, hnor->Init.NSBank, hnor->Init.ExtendedMode);
193
194  /* Enable the NORSRAM device */
195  __FMC_NORSRAM_ENABLE(hnor->Instance, hnor->Init.NSBank);
196
197  /* Check the NOR controller state */
198  hnor->State = HAL_NOR_STATE_READY;
199
200  return HAL_OK;
201}
202
203/**
204  * @brief  Perform NOR memory De-Initialization sequence
205  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
206  *                the configuration information for NOR module.
207  * @retval HAL status
208  */
209HAL_StatusTypeDef HAL_NOR_DeInit(NOR_HandleTypeDef *hnor)
210{
211  /* De-Initialize the low level hardware (MSP) */
212  HAL_NOR_MspDeInit(hnor);
213
214  /* Configure the NOR registers with their reset values */
215  FMC_NORSRAM_DeInit(hnor->Instance, hnor->Extended, hnor->Init.NSBank);
216
217  /* Update the NOR controller state */
218  hnor->State = HAL_NOR_STATE_RESET;
219
220  /* Release Lock */
221  __HAL_UNLOCK(hnor);
222
223  return HAL_OK;
224}
225
226/**
227  * @brief  NOR MSP Init
228  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
229  *                the configuration information for NOR module.
230  * @retval None
231  */
232__weak void HAL_NOR_MspInit(NOR_HandleTypeDef *hnor)
233{
234  /* NOTE : This function Should not be modified, when the callback is needed,
235            the HAL_NOR_MspInit could be implemented in the user file
236   */
237}
238
239/**
240  * @brief  NOR MSP DeInit
241  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
242  *                the configuration information for NOR module.
243  * @retval None
244  */
245__weak void HAL_NOR_MspDeInit(NOR_HandleTypeDef *hnor)
246{
247  /* NOTE : This function Should not be modified, when the callback is needed,
248            the HAL_NOR_MspDeInit could be implemented in the user file
249   */
250}
251
252/**
253  * @brief  NOR MSP Wait for Ready/Busy signal
254  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
255  *                the configuration information for NOR module.
256  * @param  Timeout: Maximum timeout value
257  * @retval None
258  */
259__weak void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout)
260{
261  /* NOTE : This function Should not be modified, when the callback is needed,
262            the HAL_NOR_MspWait could be implemented in the user file
263   */
264}
265
266/**
267  * @}
268  */
269
270/** @defgroup NOR_Exported_Functions_Group2 Input and Output functions
271  * @brief    Input Output and memory control functions
272  *
273  @verbatim
274  ==============================================================================
275                ##### NOR Input and Output functions #####
276  ==============================================================================
277  [..]
278    This section provides functions allowing to use and control the NOR memory
279
280@endverbatim
281  * @{
282  */
283
284/**
285  * @brief  Read NOR flash IDs
286  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
287  *                the configuration information for NOR module.
288  * @param  pNOR_ID : pointer to NOR ID structure
289  * @retval HAL status
290  */
291HAL_StatusTypeDef HAL_NOR_Read_ID(NOR_HandleTypeDef *hnor, NOR_IDTypeDef *pNOR_ID)
292{
293  uint32_t deviceaddress = 0;
294
295  /* Process Locked */
296  __HAL_LOCK(hnor);
297
298  /* Check the NOR controller state */
299  if(hnor->State == HAL_NOR_STATE_BUSY)
300  {
301     return HAL_BUSY;
302  }
303
304  /* Select the NOR device address */
305  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
306  {
307    deviceaddress = NOR_MEMORY_ADRESS1;
308  }
309  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
310  {
311    deviceaddress = NOR_MEMORY_ADRESS2;
312  }
313  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
314  {
315    deviceaddress = NOR_MEMORY_ADRESS3;
316  }
317  else /* FMC_NORSRAM_BANK4 */
318  {
319    deviceaddress = NOR_MEMORY_ADRESS4;
320  }
321
322  /* Update the NOR controller state */
323  hnor->State = HAL_NOR_STATE_BUSY;
324
325  /* Send read ID command */
326  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST);
327  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND);
328  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_AUTO_SELECT);
329
330  /* Read the NOR IDs */
331  pNOR_ID->Manufacturer_Code = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, MC_ADDRESS);
332  pNOR_ID->Device_Code1      = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, DEVICE_CODE1_ADDR);
333  pNOR_ID->Device_Code2      = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, DEVICE_CODE2_ADDR);
334  pNOR_ID->Device_Code3      = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, DEVICE_CODE3_ADDR);
335
336  /* Check the NOR controller state */
337  hnor->State = HAL_NOR_STATE_READY;
338
339  /* Process unlocked */
340  __HAL_UNLOCK(hnor);
341
342  return HAL_OK;
343}
344
345/**
346  * @brief  Returns the NOR memory to Read mode.
347  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
348  *                the configuration information for NOR module.
349  * @retval HAL status
350  */
351HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor)
352{
353  uint32_t deviceaddress = 0;
354
355  /* Process Locked */
356  __HAL_LOCK(hnor);
357
358  /* Check the NOR controller state */
359  if(hnor->State == HAL_NOR_STATE_BUSY)
360  {
361     return HAL_BUSY;
362  }
363
364  /* Select the NOR device address */
365  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
366  {
367    deviceaddress = NOR_MEMORY_ADRESS1;
368  }
369  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
370  {
371    deviceaddress = NOR_MEMORY_ADRESS2;
372  }
373  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
374  {
375    deviceaddress = NOR_MEMORY_ADRESS3;
376  }
377  else /* FMC_NORSRAM_BANK4 */
378  {
379    deviceaddress = NOR_MEMORY_ADRESS4;
380  }
381
382  NOR_WRITE(deviceaddress, NOR_CMD_DATA_READ_RESET);
383
384  /* Check the NOR controller state */
385  hnor->State = HAL_NOR_STATE_READY;
386
387  /* Process unlocked */
388  __HAL_UNLOCK(hnor);
389
390  return HAL_OK;
391}
392
393/**
394  * @brief  Read data from NOR memory
395  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
396  *                the configuration information for NOR module.
397  * @param  pAddress: pointer to Device address
398  * @param  pData : pointer to read data
399  * @retval HAL status
400  */
401HAL_StatusTypeDef HAL_NOR_Read(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData)
402{
403  uint32_t deviceaddress = 0;
404
405  /* Process Locked */
406  __HAL_LOCK(hnor);
407
408  /* Check the NOR controller state */
409  if(hnor->State == HAL_NOR_STATE_BUSY)
410  {
411     return HAL_BUSY;
412  }
413
414  /* Select the NOR device address */
415  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
416  {
417    deviceaddress = NOR_MEMORY_ADRESS1;
418  }
419  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
420  {
421    deviceaddress = NOR_MEMORY_ADRESS2;
422  }
423  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
424  {
425    deviceaddress = NOR_MEMORY_ADRESS3;
426  }
427  else /* FMC_NORSRAM_BANK4 */
428  {
429    deviceaddress = NOR_MEMORY_ADRESS4;
430  }
431
432  /* Update the NOR controller state */
433  hnor->State = HAL_NOR_STATE_BUSY;
434
435  /* Send read data command */
436  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST);
437  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND);
438  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_READ_RESET);
439
440  /* Read the data */
441  *pData = *(__IO uint32_t *)(uint32_t)pAddress;
442
443  /* Check the NOR controller state */
444  hnor->State = HAL_NOR_STATE_READY;
445
446  /* Process unlocked */
447  __HAL_UNLOCK(hnor);
448
449  return HAL_OK;
450}
451
452/**
453  * @brief  Program data to NOR memory
454  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
455  *                the configuration information for NOR module.
456  * @param  pAddress: Device address
457  * @param  pData : pointer to the data to write
458  * @retval HAL status
459  */
460HAL_StatusTypeDef HAL_NOR_Program(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData)
461{
462  uint32_t deviceaddress = 0;
463
464  /* Process Locked */
465  __HAL_LOCK(hnor);
466
467  /* Check the NOR controller state */
468  if(hnor->State == HAL_NOR_STATE_BUSY)
469  {
470     return HAL_BUSY;
471  }
472
473  /* Select the NOR device address */
474  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
475  {
476    deviceaddress = NOR_MEMORY_ADRESS1;
477  }
478  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
479  {
480    deviceaddress = NOR_MEMORY_ADRESS2;
481  }
482  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
483  {
484    deviceaddress = NOR_MEMORY_ADRESS3;
485  }
486  else /* FMC_NORSRAM_BANK4 */
487  {
488    deviceaddress = NOR_MEMORY_ADRESS4;
489  }
490
491  /* Update the NOR controller state */
492  hnor->State = HAL_NOR_STATE_BUSY;
493
494  /* Send program data command */
495  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST);
496  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND);
497  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_PROGRAM);
498
499  /* Write the data */
500  NOR_WRITE(pAddress, *pData);
501
502  /* Check the NOR controller state */
503  hnor->State = HAL_NOR_STATE_READY;
504
505  /* Process unlocked */
506  __HAL_UNLOCK(hnor);
507
508  return HAL_OK;
509}
510
511/**
512  * @brief  Reads a half-word buffer from the NOR memory.
513  * @param  hnor: pointer to the NOR handle
514  * @param  uwAddress: NOR memory internal address to read from.
515  * @param  pData: pointer to the buffer that receives the data read from the
516  *         NOR memory.
517  * @param  uwBufferSize : number of Half word to read.
518  * @retval HAL status
519  */
520HAL_StatusTypeDef HAL_NOR_ReadBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, uint32_t uwBufferSize)
521{
522  uint32_t deviceaddress = 0;
523
524  /* Process Locked */
525  __HAL_LOCK(hnor);
526
527  /* Check the NOR controller state */
528  if(hnor->State == HAL_NOR_STATE_BUSY)
529  {
530     return HAL_BUSY;
531  }
532
533  /* Select the NOR device address */
534  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
535  {
536    deviceaddress = NOR_MEMORY_ADRESS1;
537  }
538  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
539  {
540    deviceaddress = NOR_MEMORY_ADRESS2;
541  }
542  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
543  {
544    deviceaddress = NOR_MEMORY_ADRESS3;
545  }
546  else /* FMC_NORSRAM_BANK4 */
547  {
548    deviceaddress = NOR_MEMORY_ADRESS4;
549  }
550
551  /* Update the NOR controller state */
552  hnor->State = HAL_NOR_STATE_BUSY;
553
554  /* Send read data command */
555  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST);
556  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND);
557  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_READ_RESET);
558
559  /* Read buffer */
560  while( uwBufferSize > 0)
561  {
562    *pData++ = *(__IO uint16_t *)uwAddress;
563    uwAddress += 2;
564    uwBufferSize--;
565  }
566
567  /* Check the NOR controller state */
568  hnor->State = HAL_NOR_STATE_READY;
569
570  /* Process unlocked */
571  __HAL_UNLOCK(hnor);
572
573  return HAL_OK;
574}
575
576/**
577  * @brief  Writes a half-word buffer to the NOR memory. This function must be used
578            only with S29GL128P NOR memory.
579  * @param  hnor: pointer to the NOR handle
580  * @param  uwAddress: NOR memory internal start write address
581  * @param  pData: pointer to source data buffer.
582  * @param  uwBufferSize: Size of the buffer to write
583  * @retval HAL status
584  */
585HAL_StatusTypeDef HAL_NOR_ProgramBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, uint32_t uwBufferSize)
586{
587  uint16_t * p_currentaddress = (uint16_t *)NULL;
588  uint16_t * p_endaddress = (uint16_t *)NULL;
589  uint32_t lastloadedaddress = 0, deviceaddress = 0;
590
591  /* Process Locked */
592  __HAL_LOCK(hnor);
593
594  /* Check the NOR controller state */
595  if(hnor->State == HAL_NOR_STATE_BUSY)
596  {
597     return HAL_BUSY;
598  }
599
600  /* Select the NOR device address */
601  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
602  {
603    deviceaddress = NOR_MEMORY_ADRESS1;
604  }
605  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
606  {
607    deviceaddress = NOR_MEMORY_ADRESS2;
608  }
609  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
610  {
611    deviceaddress = NOR_MEMORY_ADRESS3;
612  }
613  else /* FMC_NORSRAM_BANK4 */
614  {
615    deviceaddress = NOR_MEMORY_ADRESS4;
616  }
617
618  /* Update the NOR controller state */
619  hnor->State = HAL_NOR_STATE_BUSY;
620
621  /* Initialize variables */
622  p_currentaddress  = (uint16_t*)((uint32_t)(uwAddress));
623  p_endaddress      = p_currentaddress + (uwBufferSize-1);
624  lastloadedaddress = (uint32_t)(uwAddress);
625
626  /* Issue unlock command sequence */
627  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST);
628  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND);
629
630  /* Write Buffer Load Command */
631  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, uwAddress), NOR_CMD_DATA_BUFFER_AND_PROG);
632  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, uwAddress), (uwBufferSize - 1));
633
634  /* Load Data into NOR Buffer */
635  while(p_currentaddress <= p_endaddress)
636  {
637    /* Store last loaded address & data value (for polling) */
638     lastloadedaddress = (uint32_t)p_currentaddress;
639
640    NOR_WRITE(p_currentaddress, *pData++);
641
642    p_currentaddress ++;
643  }
644
645  NOR_WRITE((uint32_t)(lastloadedaddress), NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM);
646
647  /* Check the NOR controller state */
648  hnor->State = HAL_NOR_STATE_READY;
649
650  /* Process unlocked */
651  __HAL_UNLOCK(hnor);
652
653  return HAL_OK;
654
655}
656
657/**
658  * @brief  Erase the specified block of the NOR memory
659  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
660  *                the configuration information for NOR module.
661  * @param  BlockAddress : Block to erase address
662  * @param  Address: Device address
663  * @retval HAL status
664  */
665HAL_StatusTypeDef HAL_NOR_Erase_Block(NOR_HandleTypeDef *hnor, uint32_t BlockAddress, uint32_t Address)
666{
667  uint32_t deviceaddress = 0;
668
669  /* Process Locked */
670  __HAL_LOCK(hnor);
671
672  /* Check the NOR controller state */
673  if(hnor->State == HAL_NOR_STATE_BUSY)
674  {
675     return HAL_BUSY;
676  }
677
678  /* Select the NOR device address */
679  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
680  {
681    deviceaddress = NOR_MEMORY_ADRESS1;
682  }
683  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
684  {
685    deviceaddress = NOR_MEMORY_ADRESS2;
686  }
687  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
688  {
689    deviceaddress = NOR_MEMORY_ADRESS3;
690  }
691  else /* FMC_NORSRAM_BANK4 */
692  {
693    deviceaddress = NOR_MEMORY_ADRESS4;
694  }
695
696  /* Update the NOR controller state */
697  hnor->State = HAL_NOR_STATE_BUSY;
698
699  /* Send block erase command sequence */
700  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST);
701  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND);
702  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD);
703  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FOURTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH);
704  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIFTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH);
705  NOR_WRITE((uint32_t)(BlockAddress + Address), NOR_CMD_DATA_BLOCK_ERASE);
706
707  /* Check the NOR memory status and update the controller state */
708  hnor->State = HAL_NOR_STATE_READY;
709
710  /* Process unlocked */
711  __HAL_UNLOCK(hnor);
712
713  return HAL_OK;
714
715}
716
717/**
718  * @brief  Erase the entire NOR chip.
719  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
720  *                the configuration information for NOR module.
721  * @param  Address : Device address
722  * @retval HAL status
723  */
724HAL_StatusTypeDef HAL_NOR_Erase_Chip(NOR_HandleTypeDef *hnor, uint32_t Address)
725{
726  uint32_t deviceaddress = 0;
727
728  /* Process Locked */
729  __HAL_LOCK(hnor);
730
731  /* Check the NOR controller state */
732  if(hnor->State == HAL_NOR_STATE_BUSY)
733  {
734     return HAL_BUSY;
735  }
736
737  /* Select the NOR device address */
738  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
739  {
740    deviceaddress = NOR_MEMORY_ADRESS1;
741  }
742  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
743  {
744    deviceaddress = NOR_MEMORY_ADRESS2;
745  }
746  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
747  {
748    deviceaddress = NOR_MEMORY_ADRESS3;
749  }
750  else /* FMC_NORSRAM_BANK4 */
751  {
752    deviceaddress = NOR_MEMORY_ADRESS4;
753  }
754
755  /* Update the NOR controller state */
756  hnor->State = HAL_NOR_STATE_BUSY;
757
758  /* Send NOR chip erase command sequence */
759  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST);
760  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND);
761  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD);
762  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FOURTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH);
763  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIFTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH);
764  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SIXTH), NOR_CMD_DATA_CHIP_ERASE);
765
766  /* Check the NOR memory status and update the controller state */
767  hnor->State = HAL_NOR_STATE_READY;
768
769  /* Process unlocked */
770  __HAL_UNLOCK(hnor);
771
772  return HAL_OK;
773}
774
775/**
776  * @brief  Read NOR flash CFI IDs
777  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
778  *                the configuration information for NOR module.
779  * @param  pNOR_CFI : pointer to NOR CFI IDs structure
780  * @retval HAL status
781  */
782HAL_StatusTypeDef HAL_NOR_Read_CFI(NOR_HandleTypeDef *hnor, NOR_CFITypeDef *pNOR_CFI)
783{
784  uint32_t deviceaddress = 0;
785
786  /* Process Locked */
787  __HAL_LOCK(hnor);
788
789  /* Check the NOR controller state */
790  if(hnor->State == HAL_NOR_STATE_BUSY)
791  {
792     return HAL_BUSY;
793  }
794
795  /* Select the NOR device address */
796  if (hnor->Init.NSBank == FMC_NORSRAM_BANK1)
797  {
798    deviceaddress = NOR_MEMORY_ADRESS1;
799  }
800  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2)
801  {
802    deviceaddress = NOR_MEMORY_ADRESS2;
803  }
804  else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3)
805  {
806    deviceaddress = NOR_MEMORY_ADRESS3;
807  }
808  else /* FMC_NORSRAM_BANK4 */
809  {
810    deviceaddress = NOR_MEMORY_ADRESS4;
811  }
812
813  /* Update the NOR controller state */
814  hnor->State = HAL_NOR_STATE_BUSY;
815
816  /* Send read CFI query command */
817  NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST_CFI), NOR_CMD_DATA_CFI);
818
819  /* read the NOR CFI information */
820  pNOR_CFI->CFI_1 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI1_ADDRESS);
821  pNOR_CFI->CFI_2 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI2_ADDRESS);
822  pNOR_CFI->CFI_3 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI3_ADDRESS);
823  pNOR_CFI->CFI_4 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI4_ADDRESS);
824
825  /* Check the NOR controller state */
826  hnor->State = HAL_NOR_STATE_READY;
827
828  /* Process unlocked */
829  __HAL_UNLOCK(hnor);
830
831  return HAL_OK;
832}
833
834/**
835  * @}
836  */
837
838/** @defgroup NOR_Exported_Functions_Group3 NOR Control functions
839 *  @brief   management functions
840 *
841@verbatim
842  ==============================================================================
843                        ##### NOR Control functions #####
844  ==============================================================================
845  [..]
846    This subsection provides a set of functions allowing to control dynamically
847    the NOR interface.
848
849@endverbatim
850  * @{
851  */
852
853/**
854  * @brief  Enables dynamically NOR write operation.
855  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
856  *                the configuration information for NOR module.
857  * @retval HAL status
858  */
859HAL_StatusTypeDef HAL_NOR_WriteOperation_Enable(NOR_HandleTypeDef *hnor)
860{
861  /* Process Locked */
862  __HAL_LOCK(hnor);
863
864  /* Enable write operation */
865  FMC_NORSRAM_WriteOperation_Enable(hnor->Instance, hnor->Init.NSBank);
866
867  /* Update the NOR controller state */
868  hnor->State = HAL_NOR_STATE_READY;
869
870  /* Process unlocked */
871  __HAL_UNLOCK(hnor);
872
873  return HAL_OK;
874}
875
876/**
877  * @brief  Disables dynamically NOR write operation.
878  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
879  *                the configuration information for NOR module.
880  * @retval HAL status
881  */
882HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor)
883{
884  /* Process Locked */
885  __HAL_LOCK(hnor);
886
887  /* Update the SRAM controller state */
888  hnor->State = HAL_NOR_STATE_BUSY;
889
890  /* Disable write operation */
891  FMC_NORSRAM_WriteOperation_Disable(hnor->Instance, hnor->Init.NSBank);
892
893  /* Update the NOR controller state */
894  hnor->State = HAL_NOR_STATE_PROTECTED;
895
896  /* Process unlocked */
897  __HAL_UNLOCK(hnor);
898
899  return HAL_OK;
900}
901
902/**
903  * @}
904  */
905
906/** @defgroup NOR_Exported_Functions_Group4 NOR State functions
907 *  @brief   Peripheral State functions
908 *
909@verbatim
910  ==============================================================================
911                      ##### NOR State functions #####
912  ==============================================================================
913  [..]
914    This subsection permits to get in run-time the status of the NOR controller
915    and the data flow.
916
917@endverbatim
918  * @{
919  */
920
921/**
922  * @brief  return the NOR controller state
923  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
924  *                the configuration information for NOR module.
925  * @retval NOR controller state
926  */
927HAL_NOR_StateTypeDef HAL_NOR_GetState(NOR_HandleTypeDef *hnor)
928{
929  return hnor->State;
930}
931
932/**
933  * @brief  Returns the NOR operation status.
934  * @param  hnor: pointer to a NOR_HandleTypeDef structure that contains
935  *                the configuration information for NOR module.
936  * @param  Address: Device address
937  * @param  Timeout: NOR programming Timeout
938  * @retval NOR_Status: The returned value can be: HAL_NOR_STATUS_SUCCESS, HAL_NOR_STATUS_ERROR
939  *         or HAL_NOR_STATUS_TIMEOUT
940  */
941HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Address, uint32_t Timeout)
942{
943  HAL_NOR_StatusTypeDef status = HAL_NOR_STATUS_ONGOING;
944  uint16_t tmpSR1 = 0, tmpSR2 = 0;
945  uint32_t tickstart = 0;
946
947  /* Poll on NOR memory Ready/Busy signal ------------------------------------*/
948  HAL_NOR_MspWait(hnor, Timeout);
949
950  /* Get the NOR memory operation status -------------------------------------*/
951
952  /* Get tick */
953  tickstart = HAL_GetTick();
954  while((status != HAL_NOR_STATUS_SUCCESS ) && (status != HAL_NOR_STATUS_TIMEOUT))
955  {
956    /* Check for the Timeout */
957    if(Timeout != HAL_MAX_DELAY)
958    {
959      if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
960      {
961        status = HAL_NOR_STATUS_TIMEOUT;
962      }
963    }
964
965    /* Read NOR status register (DQ6 and DQ5) */
966    tmpSR1 = *(__IO uint16_t *)Address;
967    tmpSR2 = *(__IO uint16_t *)Address;
968
969    /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS  */
970    if((tmpSR1 & NOR_MASK_STATUS_DQ6) == (tmpSR2 & NOR_MASK_STATUS_DQ6))
971    {
972      return HAL_NOR_STATUS_SUCCESS ;
973    }
974
975    if((tmpSR1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5)
976    {
977      status = HAL_NOR_STATUS_ONGOING;
978    }
979
980    tmpSR1 = *(__IO uint16_t *)Address;
981    tmpSR2 = *(__IO uint16_t *)Address;
982
983    /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS  */
984    if((tmpSR1 & NOR_MASK_STATUS_DQ6) == (tmpSR2 & NOR_MASK_STATUS_DQ6))
985    {
986      return HAL_NOR_STATUS_SUCCESS;
987    }
988    if((tmpSR1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5)
989    {
990      return HAL_NOR_STATUS_ERROR;
991    }
992  }
993
994  /* Return the operation status */
995  return status;
996}
997
998/**
999  * @}
1000  */
1001
1002/**
1003  * @}
1004  */
1005#endif /* HAL_NOR_MODULE_ENABLED */
1006/**
1007  * @}
1008  */
1009
1010/**
1011  * @}
1012  */
1013
1014/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Note: See TracBrowser for help on using the repository browser.