1 #ifndef _BFLB_FLASH_H
2 #define _BFLB_FLASH_H
3 
4 #include "bflb_core.h"
5 #include "bflb_sflash.h"
6 
7 /** @addtogroup LHAL
8   * @{
9   */
10 
11 /** @addtogroup FLASH
12   * @{
13   */
14 
15 /** @defgroup FLASH_IOMODE flash iomode definition
16   * @{
17   */
18 #define FLASH_IOMODE_NIO 0 /*!< Normal IO mode define */
19 #define FLASH_IOMODE_DO  1 /*!< Dual Output mode define */
20 #define FLASH_IOMODE_QO  2 /*!< Quad Output mode define */
21 #define FLASH_IOMODE_DIO 3 /*!< Dual IO mode define */
22 #define FLASH_IOMODE_QIO 4 /*!< Quad IO mode define */
23 /**
24   * @}
25   */
26 
27 /** @defgroup FLASH_AES_KEY_TYPE flash aes key type definition
28   * @{
29   */
30 #define FLASH_AES_KEY_128BITS        0
31 #define FLASH_AES_KEY_192BITS        2
32 #define FLASH_AES_KEY_256BITS        1
33 #define FLASH_AES_KEY_DOUBLE_128BITS 3
34 /**
35   * @}
36   */
37 
38 #if defined(BL602) || defined(BL702) || defined(BL702L)
39 #define FLASH_XIP_BASE (0x23000000)
40 #elif defined(BL616) || defined(BL628)
41 #define FLASH_XIP_BASE (0xA0000000)
42 #elif defined(BL808) || defined(BL606P)
43 #define FLASH_XIP_BASE (0x58000000)
44 #endif
45 
46 struct bflb_flash_aes_config_s {
47     uint8_t region;
48     uint8_t region_enable;
49     uint8_t lock_enable;
50     const uint8_t *key;
51     uint8_t keybits;
52     uint8_t *iv;
53     uint32_t start_addr;
54     uint32_t end_addr;
55 };
56 
57 #ifdef __cplusplus
58 extern "C" {
59 #endif
60 
61 /**
62  * @brief Initialize flash.
63  *
64  * @return Zero on success; a negated errno value on failure
65  */
66 int bflb_flash_init(void);
67 
68 #if defined(BL616) || defined(BL606P) || defined(BL808)
69 /**
70  * @brief flash_set_cmds
71  *
72  * @return None
73  */
74 void bflb_flash_set_cmds(spi_flash_cfg_type *p_flash_cfg);
75 #endif
76 
77 /**
78  * @brief Get flash jedec id.
79  *
80  * @return uint32_t
81  */
82 uint32_t bflb_flash_get_jedec_id(void);
83 
84 /**
85  * @brief Get flash config.
86  *
87  * @param [out] cfg_addr pointer to save config
88  * @param [in] len flash config size
89  */
90 void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len);
91 
92 /**
93  * @brief Set flash iomode.
94  *
95  * @param [in] iomode flash iomode, use @ref FLASH_IOMODE
96  */
97 void bflb_flash_set_iomode(uint8_t iomode);
98 
99 /**
100  * @brief Get flash image offset.
101  *
102  * @return flash image offset
103  */
104 uint32_t bflb_flash_get_image_offset(void);
105 
106 /**
107  * @brief Erase flash with sectors.
108  *
109  * @param [in] addr
110  * @param [in] len
111  * @return Zero on success; a negated errno value on failure
112  */
113 int bflb_flash_erase(uint32_t addr, uint32_t len);
114 
115 /**
116  * @brief Write data into flash.
117  *
118  * @param [in] addr flash physical address
119  * @param [in] data pointer to data buffer
120  * @param [in] len length of data
121  * @return Zero on success; a negated errno value on failure
122  */
123 int bflb_flash_write(uint32_t addr, uint8_t *data, uint32_t len);
124 
125 /**
126  * @brief Read data from flash.
127  *
128  * @param [in] addr flash physical address
129  * @param [out] data pointer to data buffer
130  * @param [in] len length of data
131  * @return Zero on success; a negated errno value on failure
132  */
133 int bflb_flash_read(uint32_t addr, uint8_t *data, uint32_t len);
134 
135 /**
136  * @brief Config flash cache.
137  *
138  * @param [in] cont_read enable or not continuous read mode.
139  * @param [in] cache_enable enable cache or not
140  * @param [in] cache_way_disable ways of cache to disable
141  * @param [in] flash_offset flash image offset
142  * @return Zero on success; a negated errno value on failure
143  */
144 int bflb_flash_set_cache(uint8_t cont_read, uint8_t cache_enable, uint8_t cache_way_disable, uint32_t flash_offset);
145 
146 /**
147  * @brief Initialize flash aes controller.
148  *
149  * @param [in] config pointer to flash aes config.
150  */
151 void bflb_flash_aes_init(struct bflb_flash_aes_config_s *config);
152 
153 /**
154  * @brief Enable flash decrypt with aes.
155  *
156  */
157 void bflb_flash_aes_enable(void);
158 
159 /**
160  * @brief Disable flash decrypt with aes.
161  *
162  */
163 void bflb_flash_aes_disable(void);
164 
165 #ifdef __cplusplus
166 }
167 #endif
168 
169 /**
170   * @}
171   */
172 
173 /**
174   * @}
175   */
176 
177 #endif