summaryrefslogtreecommitdiff
path: root/bsp/CME_M7/StdPeriph_Driver/inc/cmem7_flash.h
blob: 05e79b1a1d9facfa2bcec7ca4ede823689522b6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/**
    *****************************************************************************
    * @file     cmem7_flash.h
    *
    * @brief    CMEM7 flash controller source file
    *
    *
    * @version  V1.0
    * @date     3. September 2013
    *
    * @note
    *
    *****************************************************************************
    * @attention
    *
    * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
    * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
    * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
    * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
    * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
    * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
    *
    * <h2><center>&copy; COPYRIGHT 2013 Capital-micro </center></h2>
    *****************************************************************************
    */

#ifndef __CMEM7_FLASH_H
#define __CMEM7_FLASH_H

#ifdef __cplusplus
 extern "C" {
#endif

#include "cmem7.h"
#include "cmem7_conf.h"

/** @defgroup FLASH_PROTECT_MODE
  * @{
  */
#define FLASH_PROTECT_MODE_SW           0       /*!< The Status Register can be written to after a Write
                                                     Enable command.(Default) */
#define FLASH_PROTECT_MODE_HW           1       /*!< WP pin decides if the Status Register can be written
                                                     WP#=0, the Status Register locked
                                                                                                       WP#=1, the Status Register is unlocked and can be written to
                                                     after a Write Enable command */
#define FLASH_PROTECT_MODE_POWERDOWN    2               /*!< Status Register is protected and can not be written to again
                                                     until the next Power-Down, Power-Up cycle */
#define FLASH_PROTECT_MODE_OTP          3       /*!< Status Register is permanently protected */

#define IS_FLASH_PROTECT_MODE(MODE)     (((MODE) == FLASH_PROTECT_MODE_SW) || \
                                         ((MODE) == FLASH_PROTECT_MODE_HW) || \
                                         ((MODE) == FLASH_PROTECT_MODE_POWERDOWN) || \
                                         ((MODE) == FLASH_PROTECT_MODE_OTP))
/**
  * @}
  */

/** @defgroup FLASH_PROTECT_REGION
  * @{
  */
#define FLASH_PROTECT_REGION_NONE       0x00    /*!< no region is protected */
#define FLASH_PROTECT_REGION_UP_64K     0x01    /*!< region(0F0000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_UP_128K    0x02    /*!< region(0E0000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_UP_256K    0x03    /*!< region(0C0000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_UP_512K    0x04    /*!< region(080000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_64K    0x09    /*!< region(000000H-00FFFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_128K   0x0A    /*!< region(000000H-01FFFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_256K   0x0B    /*!< region(000000H-03FFFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_512K   0x0C    /*!< region(000000H-07FFFFH) is protected */
#define FLASH_PROTECT_REGION_ALL        0x0D    /*!< region(000000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_UP_4K      0x11    /*!< region(0FF000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_UP_8K      0x12    /*!< region(0FE000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_UP_16K     0x13    /*!< region(0FC000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_UP_32K     0x14    /*!< region(0F8000H-0FFFFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_4K     0x19    /*!< region(000000H-000FFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_8K     0x1A    /*!< region(000000H-001FFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_16K    0x1B    /*!< region(000000H-003FFFH) is protected */
#define FLASH_PROTECT_REGION_LOW_32K    0x1C    /*!< region(000000H-007FFFH) is protected */

#define IS_FLASH_PROTECT_REGION(REGION) (((REGION) == FLASH_PROTECT_REGION_NONE) || \
                                         ((REGION) == FLASH_PROTECT_REGION_UP_64K) || \
                                         ((REGION) == FLASH_PROTECT_REGION_UP_128K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_UP_256K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_UP_512K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_LOW_64K) || \
                                         ((REGION) == FLASH_PROTECT_REGION_LOW_128K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_LOW_256K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_LOW_512K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_ALL) || \
                                         ((REGION) == FLASH_PROTECT_REGION_UP_4K) || \
                                         ((REGION) == FLASH_PROTECT_REGION_UP_8K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_UP_16K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_UP_32K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_LOW_4K) || \
                                         ((REGION) == FLASH_PROTECT_REGION_LOW_8K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_LOW_16K) || \
                                                                                 ((REGION) == FLASH_PROTECT_REGION_LOW_32K))
/**
  * @}
  */

/** @defgroup FLASH_READ_MODE
  * @{
  */
#define FLASH_READ_MODE_NORMAL         0        /*!< normal read, 1 bitwidth, highest freqency is 90MHz */
#define FLASH_READ_MODE_FAST           1        /*!< fast read, 1 bitwidth, highest freqency is 120MHz */
#define FLASH_READ_MODE_FAST_DUAL      2        /*!< fast read, 2 bitwidth, highest freqency is 120MHz */
#define FLASH_READ_MODE_FAST_QUAD      3        /*!< fast read, 4 bitwidth, highest freqency is 90MHz */

#define IS_FLASH_READ_MODE(MODE)       (((MODE) == FLASH_READ_MODE_NORMAL) || \
                                        ((MODE) == FLASH_READ_MODE_FAST) || \
                                        ((MODE) == FLASH_READ_MODE_FAST_DUAL) || \
                                                                                ((MODE) == FLASH_READ_MODE_FAST_QUAD))
/**
  * @}
  */

/**
  * @brief  UART initialization structure
    */
typedef struct
{
  uint8_t FLASH_ClockDividor;       /*!< flash clock dividor, 2 in n times */
    uint8_t FLASH_ProtectMode;        /*!< Status Register protection mode */
    uint8_t FLASH_ProtectRegion;      /*!< flash protection region */
    BOOL FLASH_QuadEnable;            /*!< if allows Quad operation */
    void (*FLASH_Wait)(void);         /*!< When the former read or write operation is excuting,
                                           Flash has to call a callback to wait it finish.
                                           If null, Flash will wait forever until finish */
} FLASH_InitTypeDef;

/**
  * @brief  flash initialization
  * @note   This function should be called at first before any other interfaces.
    *                   Users should make sure that doesn't erase or write data in a
    *                   write-protected region.
    * @param[in] init A pointer to structure FLASH_InitTypeDef
  * @retval None
    */
void FLASH_Init(FLASH_InitTypeDef* init);

/**
  * @brief  Get flash status
  * @param[out] ProtectMode flash protect mode, ref as @ref FLASH_PROTECT_MODE
  * @param[out] ProtectRegion flash protect region, ref as @ref FLASH_PROTECT_REGION
    * @param[out] QuadEnable quad speed mode enable bit
    * @retval None
    */
void FLASH_GetStatus(uint8_t* ProtectMode, uint8_t* ProtectRegion, BOOL* QuadEnable);

/**
  * @brief  Erase a sector, which is 4K bytes large.
  * @param[in] addr Start address of a sector
    * @retval None
    */
void FLASH_EraseSector(uint32_t addr);

/**
  * @brief  Erase a block, which is 32K bytes large.
  * @param[in] addr Start address of a block
    * @retval None
    */
void FLASH_Erase32kBlock(uint32_t addr);

/**
  * @brief  Erase a block, which is 64K bytes large.
  * @param[in] addr Start address of a block
    * @retval None
    */
void FLASH_Erase64kBlock(uint32_t addr);

/**
  * @brief  Erase all chip
  * @param  None
    * @retval None
    */
void FLASH_EraseChip(void);

/**
  * @brief  Enable flash power down mode or not
  * @param[in] enable The bit indicates if flash power down mode is enable or not
    * @retval None
    */
void FLASH_EnableDeepPowerDown(BOOL enable);

/**
  * @brief  Read data from flash
    * @param[in] ReadMode Normal or fast read, ref as @ref FLASH_READ_MODE
    * @param[in] addr Start address to be read
    * @param[in] size Expected data size to be read
    * @param[out] data A user-allocated buffer to fetch data to be read
  * @retval None
    */
void FLASH_Read(uint8_t ReadMode, uint32_t addr, uint16_t size, uint8_t* data);

/**
  * @brief  Write data to flash
    * @param[in] addr Start address to be read
    * @param[in] size Expected data size to be read
    * @param[out] data A pointer to the data to be written
  * @retval None
    */
void FLASH_Write(uint32_t addr, uint16_t size, uint8_t* data);


void flash_WaitInWritting(void) ;

void flash_WaitReadFifoNotEmpty(void);

uint16_t flash_ReadFifo(uint16_t size, uint8_t* data) ;


#ifdef __cplusplus
}
#endif

#endif /* __CMEM7_FLASH_H */