1 /**
2     *****************************************************************************
3     * @file     cmem7_flash.h
4     *
5     * @brief    CMEM7 flash controller source file
6     *
7     *
8     * @version  V1.0
9     * @date     3. September 2013
10     *
11     * @note
12     *
13     *****************************************************************************
14     * @attention
15     *
16     * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
17     * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
18     * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
19     * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
20     * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
21     * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
22     *
23     * <h2><center>&copy; COPYRIGHT 2013 Capital-micro </center></h2>
24     *****************************************************************************
25     */
26 
27 #ifndef __CMEM7_FLASH_H
28 #define __CMEM7_FLASH_H
29 
30 #ifdef __cplusplus
31  extern "C" {
32 #endif
33 
34 #include "cmem7.h"
35 #include "cmem7_conf.h"
36 
37 /** @defgroup FLASH_PROTECT_MODE
38   * @{
39   */
40 #define FLASH_PROTECT_MODE_SW           0       /*!< The Status Register can be written to after a Write
41                                                      Enable command.(Default) */
42 #define FLASH_PROTECT_MODE_HW           1       /*!< WP pin decides if the Status Register can be written
43                                                      WP#=0, the Status Register locked
44                                                                                                        WP#=1, the Status Register is unlocked and can be written to
45                                                      after a Write Enable command */
46 #define FLASH_PROTECT_MODE_POWERDOWN    2               /*!< Status Register is protected and can not be written to again
47                                                      until the next Power-Down, Power-Up cycle */
48 #define FLASH_PROTECT_MODE_OTP          3       /*!< Status Register is permanently protected */
49 
50 #define IS_FLASH_PROTECT_MODE(MODE)     (((MODE) == FLASH_PROTECT_MODE_SW) || \
51                                          ((MODE) == FLASH_PROTECT_MODE_HW) || \
52                                          ((MODE) == FLASH_PROTECT_MODE_POWERDOWN) || \
53                                          ((MODE) == FLASH_PROTECT_MODE_OTP))
54 /**
55   * @}
56   */
57 
58 /** @defgroup FLASH_PROTECT_REGION
59   * @{
60   */
61 #define FLASH_PROTECT_REGION_NONE       0x00    /*!< no region is protected */
62 #define FLASH_PROTECT_REGION_UP_64K     0x01    /*!< region(0F0000H-0FFFFFH) is protected */
63 #define FLASH_PROTECT_REGION_UP_128K    0x02    /*!< region(0E0000H-0FFFFFH) is protected */
64 #define FLASH_PROTECT_REGION_UP_256K    0x03    /*!< region(0C0000H-0FFFFFH) is protected */
65 #define FLASH_PROTECT_REGION_UP_512K    0x04    /*!< region(080000H-0FFFFFH) is protected */
66 #define FLASH_PROTECT_REGION_LOW_64K    0x09    /*!< region(000000H-00FFFFH) is protected */
67 #define FLASH_PROTECT_REGION_LOW_128K   0x0A    /*!< region(000000H-01FFFFH) is protected */
68 #define FLASH_PROTECT_REGION_LOW_256K   0x0B    /*!< region(000000H-03FFFFH) is protected */
69 #define FLASH_PROTECT_REGION_LOW_512K   0x0C    /*!< region(000000H-07FFFFH) is protected */
70 #define FLASH_PROTECT_REGION_ALL        0x0D    /*!< region(000000H-0FFFFFH) is protected */
71 #define FLASH_PROTECT_REGION_UP_4K      0x11    /*!< region(0FF000H-0FFFFFH) is protected */
72 #define FLASH_PROTECT_REGION_UP_8K      0x12    /*!< region(0FE000H-0FFFFFH) is protected */
73 #define FLASH_PROTECT_REGION_UP_16K     0x13    /*!< region(0FC000H-0FFFFFH) is protected */
74 #define FLASH_PROTECT_REGION_UP_32K     0x14    /*!< region(0F8000H-0FFFFFH) is protected */
75 #define FLASH_PROTECT_REGION_LOW_4K     0x19    /*!< region(000000H-000FFFH) is protected */
76 #define FLASH_PROTECT_REGION_LOW_8K     0x1A    /*!< region(000000H-001FFFH) is protected */
77 #define FLASH_PROTECT_REGION_LOW_16K    0x1B    /*!< region(000000H-003FFFH) is protected */
78 #define FLASH_PROTECT_REGION_LOW_32K    0x1C    /*!< region(000000H-007FFFH) is protected */
79 
80 #define IS_FLASH_PROTECT_REGION(REGION) (((REGION) == FLASH_PROTECT_REGION_NONE) || \
81                                          ((REGION) == FLASH_PROTECT_REGION_UP_64K) || \
82                                          ((REGION) == FLASH_PROTECT_REGION_UP_128K) || \
83                                                                                  ((REGION) == FLASH_PROTECT_REGION_UP_256K) || \
84                                                                                  ((REGION) == FLASH_PROTECT_REGION_UP_512K) || \
85                                                                                  ((REGION) == FLASH_PROTECT_REGION_LOW_64K) || \
86                                          ((REGION) == FLASH_PROTECT_REGION_LOW_128K) || \
87                                                                                  ((REGION) == FLASH_PROTECT_REGION_LOW_256K) || \
88                                                                                  ((REGION) == FLASH_PROTECT_REGION_LOW_512K) || \
89                                                                                  ((REGION) == FLASH_PROTECT_REGION_ALL) || \
90                                          ((REGION) == FLASH_PROTECT_REGION_UP_4K) || \
91                                          ((REGION) == FLASH_PROTECT_REGION_UP_8K) || \
92                                                                                  ((REGION) == FLASH_PROTECT_REGION_UP_16K) || \
93                                                                                  ((REGION) == FLASH_PROTECT_REGION_UP_32K) || \
94                                                                                  ((REGION) == FLASH_PROTECT_REGION_LOW_4K) || \
95                                          ((REGION) == FLASH_PROTECT_REGION_LOW_8K) || \
96                                                                                  ((REGION) == FLASH_PROTECT_REGION_LOW_16K) || \
97                                                                                  ((REGION) == FLASH_PROTECT_REGION_LOW_32K))
98 /**
99   * @}
100   */
101 
102 /** @defgroup FLASH_READ_MODE
103   * @{
104   */
105 #define FLASH_READ_MODE_NORMAL         0        /*!< normal read, 1 bitwidth, highest freqency is 90MHz */
106 #define FLASH_READ_MODE_FAST           1        /*!< fast read, 1 bitwidth, highest freqency is 120MHz */
107 #define FLASH_READ_MODE_FAST_DUAL      2        /*!< fast read, 2 bitwidth, highest freqency is 120MHz */
108 #define FLASH_READ_MODE_FAST_QUAD      3        /*!< fast read, 4 bitwidth, highest freqency is 90MHz */
109 
110 #define IS_FLASH_READ_MODE(MODE)       (((MODE) == FLASH_READ_MODE_NORMAL) || \
111                                         ((MODE) == FLASH_READ_MODE_FAST) || \
112                                         ((MODE) == FLASH_READ_MODE_FAST_DUAL) || \
113                                                                                 ((MODE) == FLASH_READ_MODE_FAST_QUAD))
114 /**
115   * @}
116   */
117 
118 /**
119   * @brief  UART initialization structure
120     */
121 typedef struct
122 {
123   uint8_t FLASH_ClockDividor;       /*!< flash clock dividor, 2 in n times */
124     uint8_t FLASH_ProtectMode;        /*!< Status Register protection mode */
125     uint8_t FLASH_ProtectRegion;      /*!< flash protection region */
126     BOOL FLASH_QuadEnable;            /*!< if allows Quad operation */
127     void (*FLASH_Wait)(void);         /*!< When the former read or write operation is excuting,
128                                            Flash has to call a callback to wait it finish.
129                                            If null, Flash will wait forever until finish */
130 } FLASH_InitTypeDef;
131 
132 /**
133   * @brief  flash initialization
134   * @note   This function should be called at first before any other interfaces.
135     *                   Users should make sure that doesn't erase or write data in a
136     *                   write-protected region.
137     * @param[in] init A pointer to structure FLASH_InitTypeDef
138   * @retval None
139     */
140 void FLASH_Init(FLASH_InitTypeDef* init);
141 
142 /**
143   * @brief  Get flash status
144   * @param[out] ProtectMode flash protect mode, ref as @ref FLASH_PROTECT_MODE
145   * @param[out] ProtectRegion flash protect region, ref as @ref FLASH_PROTECT_REGION
146     * @param[out] QuadEnable quad speed mode enable bit
147     * @retval None
148     */
149 void FLASH_GetStatus(uint8_t* ProtectMode, uint8_t* ProtectRegion, BOOL* QuadEnable);
150 
151 /**
152   * @brief  Erase a sector, which is 4K bytes large.
153   * @param[in] addr Start address of a sector
154     * @retval None
155     */
156 void FLASH_EraseSector(uint32_t addr);
157 
158 /**
159   * @brief  Erase a block, which is 32K bytes large.
160   * @param[in] addr Start address of a block
161     * @retval None
162     */
163 void FLASH_Erase32kBlock(uint32_t addr);
164 
165 /**
166   * @brief  Erase a block, which is 64K bytes large.
167   * @param[in] addr Start address of a block
168     * @retval None
169     */
170 void FLASH_Erase64kBlock(uint32_t addr);
171 
172 /**
173   * @brief  Erase all chip
174   * @param  None
175     * @retval None
176     */
177 void FLASH_EraseChip(void);
178 
179 /**
180   * @brief  Enable flash power down mode or not
181   * @param[in] enable The bit indicates if flash power down mode is enable or not
182     * @retval None
183     */
184 void FLASH_EnableDeepPowerDown(BOOL enable);
185 
186 /**
187   * @brief  Read data from flash
188     * @param[in] ReadMode Normal or fast read, ref as @ref FLASH_READ_MODE
189     * @param[in] addr Start address to be read
190     * @param[in] size Expected data size to be read
191     * @param[out] data A user-allocated buffer to fetch data to be read
192   * @retval None
193     */
194 void FLASH_Read(uint8_t ReadMode, uint32_t addr, uint16_t size, uint8_t* data);
195 
196 /**
197   * @brief  Write data to flash
198     * @param[in] addr Start address to be read
199     * @param[in] size Expected data size to be read
200     * @param[out] data A pointer to the data to be written
201   * @retval None
202     */
203 void FLASH_Write(uint32_t addr, uint16_t size, uint8_t* data);
204 
205 
206 void flash_WaitInWritting(void) ;
207 
208 void flash_WaitReadFifoNotEmpty(void);
209 
210 uint16_t flash_ReadFifo(uint16_t size, uint8_t* data) ;
211 
212 
213 #ifdef __cplusplus
214 }
215 #endif
216 
217 #endif /* __CMEM7_FLASH_H */
218 
219