• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  *
15  * Description: Provides flash common Configuration information. \n
16  *
17  * History: \n
18  * 2022-11-15, Create file. \n
19  */
20 #ifndef FLASH_COMMON_CONFIG_H
21 #define FLASH_COMMON_CONFIG_H
22 
23 /**
24  * @defgroup drivers_driver_flash_common_config Flash Common Config
25  * @ingroup  drivers_driver_flash
26  * @{
27  */
28 #include "stdbool.h"
29 #include "spi.h"
30 
31 #define WAIT_CYCLES_0  0x0
32 #define WAIT_CYCLES_1  0x1
33 #define WAIT_CYCLES_2  0x2
34 #define WAIT_CYCLES_3  0x3
35 #define WAIT_CYCLES_4  0x4
36 #define WAIT_CYCLES_5  0x5
37 #define WAIT_CYCLES_6  0x6
38 #define WAIT_CYCLES_7  0x7
39 #define WAIT_CYCLES_8  0x8
40 #define WAIT_CYCLES_9  0x9
41 #define WAIT_CYCLES_10 0x0A
42 
43 /* Flash cmd define. */
44 #define FLASH_WREN_CMD  0x06
45 #define FLASH_WRDI_CMD  0x04
46 #define FLASH_RDID_CMD  0x9F
47 #define FLASH_RDSR1_CMD 0x05
48 #define FLASH_WRSR1_CMD 0x01
49 #define FLASH_RDSR2_CMD 0x35
50 #define FLASH_WRSR2_CMD 0x31
51 #define FLASH_RDSR3_CMD 0x15
52 #define FLASH_WRSR3_CMD 0x11
53 #define FLASH_SE_CMD    0x20
54 #define FLASH_BE_CMD    0xD8
55 #define FLASH_BE32K_CMD 0x52
56 #define FLASH_CE_CMD    0xC7
57 #define FLASH_DUMMY_CMD 0xC0
58 #define FLASH_PP_CMD    0x02
59 #define FLASH_4PP_CMD   0x38
60 #define FLASH_DP_CMD    0xB9
61 #define FLASH_RDP_CMD   0xAB
62 #define FLASH_RD_CMD    0x03
63 #define FLASH_FRD_CMD   0x0B
64 #define FLASH_QRD_CMD   0xEB
65 #define FLASH_RSTEN_CMD 0x66
66 #define FLASH_RST_CMD   0x99
67 #define FLASH_RDB_CMD   0xAB
68 /* Manufacturer ID + Device ID, Device id can track manufacturer info. */
69 #define FLASH_MSID_CMD  0x90
70 #define FLASH_UQID_CMD  0x4B
71 
72 #define FLASH_DATA_ONE_BYTE 0
73 #define FLASH_DUMMY         0x0
74 
75 #define FLASH_XIP_TRANS_2_BYTE 0x1
76 #define FLASH_XIP_TRANS_8_BYTE 0x7
77 
78 #define FLASH_QSPI_TRANSMIT_DMA_ENABLE  1
79 #define FLASH_QSPI_TRANSMIT_DMA_DISABLE 2
80 
81 #define FLASH_WRITE_MAX_TRANS_CNT 0x100
82 #define FLASH_CMD_LENGTH_4_BYTE 4
83 #define MANUFACTURE_ID_LENGTH 3
84 #define DEVICE_ID_LENGTH 2
85 
86 /* Define flash manufacturer id. */
87 #define FLASH_MANUFACTURER_MXIC_MX25R80          0x1428C2
88 #define FLASH_MANUFACTURER_MXIC_MX25R32          0x1628C2
89 #define FLASH_MANUFACTURER_MXIC_MX25R64          0x1728C2
90 #define FLASH_MANUFACTURER_MXIC_MX25U64          0x3725C2
91 #define FLASH_MANUFACTURER_MXIC_MX25U128         0x3825C2
92 #define FLASH_MANUFACTURER_MXIC_MX25U12843       0xC22538
93 /* Flash ID is same, but the unique ID is different, and unique ID(0xE9) needs to add cmd at xip mode. */
94 #define FLASH_MANUFACTURER_WINBOND_W25Q32        0x1660EF
95 /* Flash ID is same, but the unique ID is different, and unique ID(0xEC) needs to add cmd at xip mode. */
96 #define FLASH_MANUFACTURER_WINBOND_W25Q64        0x1760EF
97 /* Flash ID is same, but the unique ID is different, and unique ID(NULL) needs to add cmd at xip mode. */
98 #define FLASH_MANUFACTURER_WINBOND_W25Q128       0x1860EF
99 #define FLASH_MANUFACTURER_WINBOND_W25Q128JW     0x1880EF
100 #define FLASH_MANUFACTURER_WINBOND_W25Q256       0x1960EF
101 #define FLASH_MANUFACTURER_MICRON_MT25QU128      0x18BB20
102 #define FLASH_MANUFACTURER_MICRON_MT25QU256      0x19BB20
103 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
104 #define FLASH_MANUFACTURER_GIGADEVICE_GD25WQ64   0x1765C8
105 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
106 #define FLASH_MANUFACTURER_GIGADEVICE_GD25LE64EX 0x1760C8    /* EX represents E3IG and ESIG. */
107 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode */
108 #define FLASH_MANUFACTURER_GIGADEVICE_GD25LX128  0x1860C8    /* LX represents LB and LE. */
109 #define FLASH_MANUFACTURER_GIGADEVICE_GD25LQ256  0x1960C8
110 #define FLASH_MANUFACTURER_DOSILICON_FM25M64     0x1743F8
111 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
112 #define FLASH_MANUFACTURER_GIGADEVICE_GD25LQ32D  0x1660C8
113 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
114 #define FLASH_MANUFACTURER_DOSILICON_FM25M4AA    0x1842F8
115 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
116 #define FLASH_MANUFACTURER_PUYA_P25Q32LX         0x166085    /* LX represents L and LC. */
117 #define FLASH_MANUFACTURER_PUYA_P25Q64SL         0x176085
118 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
119 #define FLASH_MANUFACTURER_ADESTO_AT25SL128A     0x18421F
120 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
121 #define FLASH_MANUFACTURER_MXIC_MX25U32          0x3625C2
122 #define FLASH_MANUFACTURER_MXIC_MX25U256         0x3925C2
123 #define FLASH_MANUFACTURER_ELITE_EN25SX128A      0x18781C
124 /* Need to add cmd at xip mode, so it can enter sleep and exit sleep mode. */
125 #define FLASH_MANUFACTURER_DOSILICON_DS25M4AB    0x1842E5
126 #define FLASH_MANUFACTURER_ELITE_EN25S32A        0x16381C
127 #define FLASH_MANUFACTURER_XTX_XT25Q64D          0x17600B
128 #define FLASH_MANUFACTURER_XTX_XT25Q128D         0x18600B
129 
130 #define FLASH_CMD_LEN_MAX     4
131 
132 #define addr_unalign(Addr, Boundary) ((Addr) & ((Boundary) - 1))
133 #define addr_unalign_4b(Addr) addr_unalign((Addr), 4)
134 
135 #define FLASH_SIZE_4MB  0x400000
136 #define FLASH_SIZE_8MB  0x800000
137 #define FLASH_SIZE_16MB 0x1000000
138 #define FLASH_SIZE_32MB 0x2000000
139 
140 #define FLASH_PAGE_SIZE 4096
141 
142 #define FLASH_BLOCK_32K_SIZE 0x8000
143 #define FLASH_BLOCK_64K_SIZE 0x10000
144 
145 #define FLASH_W25Q64JWBYIQ_UNIQUE_ID 0xEC
146 #define FLASH_W25Q32JWBYIQ_UNIQUE_ID 0xE9
147 #define FLASH_W25Q128JWBYIQ_UNIQUE_ID 0xEB
148 
149 
150 static const uint32_t g_flash_need_cmd_unique_id[] = { FLASH_W25Q32JWBYIQ_UNIQUE_ID,
151                                                        FLASH_W25Q64JWBYIQ_UNIQUE_ID,
152                                                        FLASH_W25Q128JWBYIQ_UNIQUE_ID };
153 
154 static const uint32_t g_winbond_flash_manufact_id[] = { FLASH_MANUFACTURER_WINBOND_W25Q32,
155                                                         FLASH_MANUFACTURER_WINBOND_W25Q64,
156                                                         FLASH_MANUFACTURER_WINBOND_W25Q128 };
157 
158 /**
159  * @if Eng
160  * @brief  supported flash.
161  * @else
162  * @brief  支持的flash。
163  * @endif
164  */
165 typedef enum flash_support_manufacturer {
166     FLASH_MXIC_MX25R32,
167     FLASH_MXIC_MX25R64,
168     FLASH_MXIC_MX25U64,
169     FLASH_MXIC_MX25U128,
170     FLASH_WINBOND_W25Q32,
171     FLASH_WINBOND_W25Q64,
172     FLASH_WINBOND_W25Q128,
173     FLASH_WINBOND_W25Q128JW,
174     FLASH_WINBOND_W25Q256,
175     FLASH_MICRON_MT25QU128,
176     FLASH_MICRON_MT25QU256,
177     FLASH_GIGADEVICE_GD25WQ64,
178     FLASH_GIGADEVICE_GD25LE64E,
179     FLASH_GIGADEVICE_GD25LB128,
180     FLASH_GIGADEVICE_GD25LQ256,
181     FLASH_DOSILICON_FM25M64,
182     FLASH_GIGADEVICE_GD25LQ32D,
183     FLASH_DOSILICON_FM25M4AA,
184     FLASH_PUYA_P25Q32LC,
185     FLASH_ADESTO_AT25SL128A,
186     FLASH_MXIC_MX25U32,
187     FLASH_MXIC_MX25U12843,
188     FLASH_ELITE_EN25SX128A,
189     FLASH_DOSILICON_DS25M4AB,
190     FLASH_ELITE_EN25S32A,
191     FLASH_XTX_XT25Q64D,
192     FLASH_XTX_XT25Q128D,
193     FLASH_PUYA_P25Q64SL,
194     FLASH_MXIC_MX25U256,
195     FLASH_MXIC_MX25R80,
196     FLASH_MANUFACTURER_MAX
197 } flash_support_manufacturer_t;
198 
199 /**
200  * @brief  Flash cmd type.
201  */
202 typedef enum flash_cmd_type {
203     FLASH_CMD_TYPE_CMD,
204     FLASH_CMD_TYPE_PROCESSING,
205     FLASH_CMD_TYPE_CHECK,
206     FLASH_CMD_TYPE_END
207 } flash_cmd_type_t;
208 
209 /**
210  * @if Eng
211  * @brief  Flash cmd.
212  * @else
213  * @brief  Flash 命令。
214  * @endif
215  */
216 typedef struct flash_cmd_exe {
217     flash_cmd_type_t cmd_type;                              /*!< @if Eng Flash cmd type.
218                                                                  @else Flash 命令模式。@endif */
219     hal_spi_frame_format_t spi_frf_mode;                    /*!< @if Eng Flash spi trans mode.
220                                                                  @else Flash使用的spi传输模式。@endif */
221     uint8_t cmd_len;                                        /*!< @if Eng cmd length.
222                                                                  @else 命令长度。@endif */
223     uint8_t cmd[FLASH_CMD_LEN_MAX];                         /*!< @if Eng cmd.
224                                                                  @else 命令数组。@endif */
225 } flash_cmd_exe_t;
226 
227 /**
228  * @if Eng
229  * @brief  Flash qspi xip config.
230  * @else
231  * @brief  Flash进出xip配置。
232  * @endif
233  */
234 typedef struct flash_qspi_xip_config {
235     uint32_t enter_xip_before_wait_cycles_config;           /*!< @if Eng Before enter xip mode wait cycle.
236                                                                  @else 进xip模式前的等待周期。@endif */
237     uint32_t enter_xip_before_inst_l;                       /*!< @if Eng Before enter xip mode inst len.
238                                                                  @else 进xip模式前的指令长度。@endif */
239     uint32_t enter_xip_before_addr_l;                       /*!< @if Eng Before enter xip mode addr len.
240                                                                  @else 进xip模式前的地址长度。@endif */
241     uint32_t enter_xip_before_trans_type;                   /*!< @if Eng Before enter xip mode trans type.
242                                                                  @else 进xip模式前的传输方式。@endif */
243     uint32_t enter_xip_after_wait_cycles_config;            /*!< @if Eng After enter xip mode wait cycle.
244                                                                  @else 进xip模式后的等待周期。@endif */
245     uint32_t enter_xip_after_inst_l;                        /*!< @if Eng After enter xip mode inst len.
246                                                                  @else 进xip模式后的指令长度。@endif */
247     uint32_t enter_xip_after_addr_l;                        /*!< @if Eng After enter xip mode addr len.
248                                                                  @else 进xip模式后的地址长度。@endif */
249     uint32_t enter_xip_after_trans_type;                    /*!< @if Eng After enter xip mode trans type.
250                                                                  @else 进xip模式后的传输方式。@endif */
251     bool enter_xip_after_enable_32bit_addr;                 /*!< @if Eng Whether to enable 32bit_addr.
252                                                                  @else 进xip模式后是否需要使能32位地址。@endif */
253     bool enter_xip_after_enable_wrap;                       /*!< @if Eng Whether to enable wrap.
254                                                                  @else 进xip模式后是否需要使能数据包装。@endif */
255 } flash_qspi_xip_config_t;
256 
257 /**
258  * @if Eng
259  * @brief  Flash qspi enable config.
260  * @else
261  * @brief  Flash  qspi使能配置。
262  * @endif
263  */
264 typedef struct flash_qe_config {
265     uint32_t manufacturer_id;                           /*!< @if Eng Flash manufacturer id.
266                                                              @else Flash 制造 id。@endif */
267     flash_cmd_exe_t *flash_set_qe_cmd;                  /*!< @if Eng Flash set qspi enable cmd
268                                                              @else Flash qspi 使能命令。@endif */
269 } flash_qe_config_t;
270 
271 /**
272  * @if Eng
273  * @brief  The basic configuration for flash.
274  * @else
275  * @brief  Flash基础配置。
276  * @endif
277  */
278 typedef struct flash_cfg {
279     uint32_t                            isinit;                     /*!< @if Eng Flash is init.
280                                                                          @else Flash 是否初始化。@endif */
281     uint32_t                            qspi_isinit;                /*!< @if Eng Flash qspi is init.
282                                                                          @else Flash qspi是否初始化。@endif */
283     flash_support_manufacturer_t        flash_manufacturer;         /*!< @if Eng Flash manufacturer id index.
284                                                                          @else Flash id 索引。@endif */
285     uint32_t                            unique_id;                  /*!< @if Eng Flash unique id.
286                                                                          @else Flash 唯一 id。@endif */
287     spi_bus_t                           bus;                        /*!< @if Eng Flash spi bus.
288                                                                          @else Flash 使用的 spi bus。@endif */
289     hal_spi_frame_format_t              mode;                       /*!< @if Eng Flash trans mode.
290                                                                          @else Flash 传输模式。@endif */
291     bool                                is_xip;                     /*!< @if Eng Flash is use xip.
292                                                                          @else Flash 使用xip。@endif */
293     bool                                need_cmd_at_xip_mode;       /*!< @if Eng Flash need cmd at xip mode.
294                                                                          @else Flash 需要xip命令。@endif */
295     spi_attr_t                          attr;                       /*!< @if Eng Flash spi attr.
296                                                                          @else Flash spi 基础配置。@endif */
297     spi_extra_attr_t                    extra_attr;                 /*!< @if Eng Flash spi extra attr.
298                                                                          @else Flash spi 拓展配置。@endif */
299 } flash_cfg_t;
300 
301 /**
302   * @}
303   */
304 #endif
305