• 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 information. \n
16  *
17  * History: \n
18  * 2022-11-15, Create file. \n
19  */
20 #ifndef FLASH_INFORMATION_H
21 #define FLASH_INFORMATION_H
22 
23 /**
24  * @defgroup drivers_driver_flash_config_info Flash Config Info
25  * @ingroup  drivers_driver_flash
26  * @{
27  */
28 #include "flash_mxic_config.h"
29 #include "flash_others_config.h"
30 #include "flash_winbond_config.h"
31 #include "flash_dosilicon_config.h"
32 #include "flash_gigadevice_config.h"
33 
34 static const flash_cmd_exe_t g_w25q64_lock_image_region_cmd[] = {
35     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_QUAD, 1, { FLASH_WREN_CMD } },         /* Write enable. */
36     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_QUAD, 2, { 0x01, 0x1C } },             /* Write status reg1. */
37     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_QUAD, 3, { FLASH_RDSR1_CMD, 0, 0 } },  /* Wait config done. */
38     { FLASH_CMD_TYPE_END,        HAL_SPI_FRAME_FORMAT_MAX_NUM,    0, { 0 } }
39 };
40 
41 static const flash_cmd_exe_t g_w25q64_unlock_image_region_cmd[] = {
42     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_QUAD, 1, { FLASH_WREN_CMD } },         /* Write enable. */
43     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_QUAD, 2, { 0x01, 0x00 } },             /* Write status reg1. */
44     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_QUAD, 3, { FLASH_RDSR1_CMD, 0, 0 } },  /* Wait config done. */
45     { FLASH_CMD_TYPE_END,        HAL_SPI_FRAME_FORMAT_MAX_NUM,    0, { 0 } }
46 };
47 
48 /**
49  * @if Eng
50  * @brief  Flash adaptation table.
51  * @else
52  * @brief  flash 适配表。
53  * @endif
54  */
55 typedef struct flash_device_parameter {
56     uint32_t manufacturer_id;                               /*!< @if Eng Flash manufacturer id.
57                                                                  @else Flash 制造id。@endif */
58     uint32_t flash_size;                                    /*!< @if Eng Flash size.
59                                                                  @else Flash 大小。@endif */
60     uint8_t enter_xip;                                      /*!< @if Eng Enter xip cmd.
61                                                                  @else 进xip命令。@endif */
62     uint8_t exit_xip;                                       /*!< @if Eng Exit xip cmd.
63                                                                  @else 退xip命令。@endif */
64     uint8_t read_dummy_clk;                                 /*!< @if Eng Read dummy cycle
65                                                                  @else 读虚拟字节。@endif */
66     uint8_t security_reg_cmd;                               /*!< @if Eng Security reg cmd.
67                                                                  @else 安全寄存器命令。@endif */
68     uint8_t suspend_cmd;                                    /*!< @if Eng Suspend cmd.
69                                                                  @else 休眠命令。@endif */
70     uint8_t resume_cmd;                                     /*!< @if Eng Resume cmd.
71                                                                  @else 唤醒命令。@endif */
72     flash_cmd_exe_t *enter_qspi_mode_cmd;                   /*!< @if Eng Enter qspi mode cmd.
73                                                                  @else 进qspi模式命令。@endif */
74     flash_cmd_exe_t *enter_xip_mode_cmd;                    /*!< @if Eng Enter xip mode wait cycle.
75                                                                  @else 进xip模式命令。@endif */
76     flash_qspi_xip_config_t *enter_xip_mode_config;         /*!< @if Eng Enter xip mode config.
77                                                                  @else 进xip模式配置。@endif */
78 } flash_device_parameter_t;
79 
80 static const flash_device_parameter_t g_flash_device_parameter[FLASH_MANUFACTURER_MAX] = {
81     { FLASH_MANUFACTURER_MXIC_MX25R32,          FLASH_SIZE_4MB,  0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
82       g_mxic_mx25rxx_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25rxx_config },
83     { FLASH_MANUFACTURER_MXIC_MX25R64,          FLASH_SIZE_8MB,  0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
84       g_mxic_mx25rxx_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25rxx_config },
85     { FLASH_MANUFACTURER_MXIC_MX25U64,          FLASH_SIZE_8MB,  0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
86       g_mxic_mx25uxx_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25uxx_config },
87     { FLASH_MANUFACTURER_MXIC_MX25U128,         FLASH_SIZE_16MB, 0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
88       g_mxic_mx25uxx_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25uxx_config },
89     { FLASH_MANUFACTURER_WINBOND_W25Q32,        FLASH_SIZE_4MB,  0x20, 0xFF, WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
90       g_winbond_w25qxx_enter_qspi_mode_cmd,       NULL,                               &g_winbond_w25qxx_config },
91     { FLASH_MANUFACTURER_WINBOND_W25Q64,        FLASH_SIZE_8MB,  0x20, 0xFF, WAIT_CYCLES_4, 0x35, 0x75, 0x7A,
92       g_winbond_w25qxx_enter_qspi_mode_cmd,       NULL,                               &g_winbond_w25qxx_config },
93     { FLASH_MANUFACTURER_WINBOND_W25Q128,       FLASH_SIZE_16MB, 0x20, 0xFF, WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
94       g_winbond_w25qxx_enter_qspi_mode_cmd,       NULL,                               &g_winbond_w25qxx_config },
95     { FLASH_MANUFACTURER_WINBOND_W25Q128JW,     FLASH_SIZE_16MB, 0x20, 0xFF, WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
96       g_winbond_w25qxx_enter_qspi_mode_cmd,       NULL,                               &g_winbond_w25qxx_config },
97     { FLASH_MANUFACTURER_WINBOND_W25Q256,       FLASH_SIZE_32MB, 0x20, 0xFF, WAIT_CYCLES_2, 0x05, 0x75, 0x7A,
98       g_winbond_w25q256_enter_qspi_mode_cmd,      NULL,                               &g_winbond_w25q256_config },
99     { FLASH_MANUFACTURER_MICRON_MT25QU128,      FLASH_SIZE_16MB, 0x0,  0x10, WAIT_CYCLES_2, 0x70, 0x75, 0x7A,
100       g_micro_mt25qu128_enter_qspi_mode_cmd,      g_micro_mt25qu128_enter_xip_mode_cmd, &g_micro_mt25qu128_config },
101     { FLASH_MANUFACTURER_MICRON_MT25QU256,      FLASH_SIZE_32MB, 0x0,  0x10, WAIT_CYCLES_4, 0x70, 0x75, 0x7A,
102       g_micro_mt25qu256_enter_qspi_mode_cmd,      g_micro_mt25qu256_enter_xip_mode_cmd, &g_micro_mt25qu256_config },
103     { FLASH_MANUFACTURER_GIGADEVICE_GD25WQ64,   FLASH_SIZE_8MB,  0x20, 0x0,  WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
104       g_gigadevice_gd25wq64_enter_qspi_mode_cmd,  NULL,                               &g_gigadevice_gd25wq64_config },
105     { FLASH_MANUFACTURER_GIGADEVICE_GD25LE64EX, FLASH_SIZE_8MB,  0x20, 0x0,  WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
106       g_gigadevice_gd25wq64_enter_qspi_mode_cmd,  NULL,                               &g_gigadevice_gd25le64_config },
107     { FLASH_MANUFACTURER_GIGADEVICE_GD25LX128,  FLASH_SIZE_16MB, 0x20, 0x0,  WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
108       g_gigadevice_gd25lq128_enter_qspi_mode_cmd, NULL,                               &g_gigadevice_gd25lx_config },
109     { FLASH_MANUFACTURER_GIGADEVICE_GD25LQ256,  FLASH_SIZE_32MB, 0x20, 0x0,  WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
110       g_gigadevice_gd25lq256_enter_qspi_mode_cmd, NULL,                               &g_gigadevice_gd25lq256_config },
111     { FLASH_MANUFACTURER_DOSILICON_FM25M64,     FLASH_SIZE_8MB,  0xA0, 0x00, WAIT_CYCLES_2, 0x35, 0x75, 0x7A,
112       g_dosilicon_fm25m64_enter_qspi_mode_cmd,    NULL,                               &g_dosilicon_fm25m64_config },
113     { FLASH_MANUFACTURER_GIGADEVICE_GD25LQ32D,  FLASH_SIZE_4MB,  0x20, 0x0,  WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
114       g_gigadevice_gd25lq32d_enter_qspi_mode_cmd, NULL,                               &g_gigadevice_gd25lx_config },
115     { FLASH_MANUFACTURER_DOSILICON_FM25M4AA,    FLASH_SIZE_16MB, 0xA0, 0x00, WAIT_CYCLES_2, 0x35, 0x75, 0x7A,
116       g_dosilicon_fm25m64_enter_qspi_mode_cmd,    NULL,                               &g_dosilicon_fm25m4aa_config },
117     { FLASH_MANUFACTURER_PUYA_P25Q32LX,         FLASH_SIZE_32MB, 0x20, 0xFF, WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
118       g_puya_p25q32lc_enter_qspi_mode_cmd,        NULL,                               &g_puya_p25q32lc_config },
119     { FLASH_MANUFACTURER_ADESTO_AT25SL128A,     FLASH_SIZE_16MB, 0xA0, 0x00, WAIT_CYCLES_2, 0x35, 0x75, 0x7A,
120       g_adesto_at25sl128a_enter_qspi_mode_cmd,    NULL,                               &g_adesto_at25sl128a_config },
121     { FLASH_MANUFACTURER_MXIC_MX25U32,          FLASH_SIZE_4MB,  0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
122       g_mxic_mx25u32_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25u32_config },
123     { FLASH_MANUFACTURER_MXIC_MX25U12843,       FLASH_SIZE_16MB, 0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
124       g_mxic_mx25uxx_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25uxx_config },
125     { FLASH_MANUFACTURER_ELITE_EN25SX128A,      FLASH_SIZE_16MB, 0x20, 0x0, WAIT_CYCLES_4,  0x05, 0x75, 0x7A,
126       g_mxic_en25sxxa_enter_qspi_mode_cmd,        NULL,                               &g_mxic_en25sxxa_config },
127     { FLASH_MANUFACTURER_DOSILICON_DS25M4AB,    FLASH_SIZE_16MB, 0x20, 0xFF, WAIT_CYCLES_4,  0x05, 0x75, 0x7A,
128       g_dosilicon_ds25m4ab_enter_qspi_mode_cmd,   NULL,                               &g_dosilicon_ds25m4ab_config },
129     { FLASH_MANUFACTURER_ELITE_EN25S32A,        FLASH_SIZE_4MB, 0x20, 0x0, WAIT_CYCLES_4,  0x05, 0x75, 0x7A,
130       g_mxic_en25sxxa_enter_qspi_mode_cmd,        NULL,                               &g_mxic_en25sxxa_config },
131     { FLASH_MANUFACTURER_XTX_XT25Q64D,         FLASH_SIZE_8MB, 0x20, 0x0, WAIT_CYCLES_6,  0x35, 0x75, 0x7A,
132       g_xtx_xt25qxxd_enter_qspi_mode_cmd,         NULL,                               &g_xtx_xt25qxxd_config },
133     { FLASH_MANUFACTURER_XTX_XT25Q128D,         FLASH_SIZE_16MB, 0x20, 0x0, WAIT_CYCLES_6,  0x35, 0x75, 0x7A,
134       g_xtx_xt25qxxd_enter_qspi_mode_cmd,         NULL,                               &g_xtx_xt25qxxd_config },
135     { FLASH_MANUFACTURER_PUYA_P25Q64SL,         FLASH_SIZE_8MB, 0x20, 0xFF, WAIT_CYCLES_4, 0x05, 0x75, 0x7A,
136       g_puya_p25q32lc_enter_qspi_mode_cmd,        NULL,                               &g_puya_p25q32lc_config },
137     { FLASH_MANUFACTURER_MXIC_MX25U256,         FLASH_SIZE_32MB,  0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
138       g_mxic_mx25uxx_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25uxx_config },
139     { FLASH_MANUFACTURER_MXIC_MX25R80,          FLASH_SIZE_8MB,  0xA5, 0xAA, WAIT_CYCLES_4, 0x2B, 0xB0, 0x30,
140       g_mxic_mx25rxx_enter_qspi_mode_cmd,         NULL,                               &g_mxic_mx25rxx_config },
141 };
142 
143 static const uint32_t g_xip_use_cmd_mode[] = {
144     FLASH_MANUFACTURER_GIGADEVICE_GD25LX128,
145     FLASH_MANUFACTURER_GIGADEVICE_GD25LQ32D,
146     FLASH_MANUFACTURER_GIGADEVICE_GD25LE64EX,
147     FLASH_MANUFACTURER_GIGADEVICE_GD25WQ64,
148     FLASH_MANUFACTURER_DOSILICON_FM25M4AA,
149     FLASH_MANUFACTURER_PUYA_P25Q32LX,
150     FLASH_MANUFACTURER_ADESTO_AT25SL128A,
151     FLASH_MANUFACTURER_MXIC_MX25U32,
152     FLASH_MANUFACTURER_ELITE_EN25SX128A,
153     FLASH_MANUFACTURER_DOSILICON_FM25M64,
154     FLASH_MANUFACTURER_ELITE_EN25S32A,
155     FLASH_MANUFACTURER_DOSILICON_DS25M4AB,
156     FLASH_MANUFACTURER_PUYA_P25Q64SL,
157 };
158 
159 static flash_cmd_exe_t g_winbond_w25qxx_set_qe_cmd[] = {
160     /* Check QE bit. */
161     { FLASH_CMD_TYPE_CHECK,      HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
162     /* Write enable. */
163     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_STANDARD, 1, { FLASH_WREN_CMD } },
164     /* Write status register-2 to 0x2, set QE bit. */
165     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_STANDARD, 2, { 0x31, 0x02 } },
166     /* Wait until the configuration is complete. */
167     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR1_CMD, 0, 0 } },
168     /* Check QE bit. */
169     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
170     /* The END command, will not be executed and need return. */
171     { FLASH_CMD_TYPE_END,        HAL_SPI_FRAME_FORMAT_MAX_NUM,   0, { 0 } }
172 };
173 
174 static flash_cmd_exe_t g_dosilicon_fm25m64_set_qe_cmd[] = {
175     /* Check QE bit. */
176     { FLASH_CMD_TYPE_CHECK,      HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
177     /* Write enable. */
178     { FLASH_CMD_TYPE_CMD, HAL_SPI_FRAME_FORMAT_STANDARD, 1, { FLASH_WREN_CMD } },
179     /* Write status register-2 to 0x2, set QE bit. */
180     { FLASH_CMD_TYPE_CMD, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { 0x01, 0x00, 0x02 } },
181     /* Wait until the configuration is complete. */
182     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR1_CMD, 0, 0 } },
183     /* Check QE bit. */
184     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
185     /* The END command, will not be executed and need return. */
186     { FLASH_CMD_TYPE_END, HAL_SPI_FRAME_FORMAT_MAX_NUM,   0, { 0 } }
187 };
188 
189 static flash_cmd_exe_t g_winbond_en25sx128a_set_qe_cmd[] = {
190     /* Check QE bit. */
191     { FLASH_CMD_TYPE_CHECK,      HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
192     /* Write enable. */
193     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_STANDARD, 1, { FLASH_WREN_CMD } },
194     /* Write status register-2 to 0x2, set QE bit. */
195     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_STANDARD, 2, { 0x31, 0x02 } },
196     /* Wait until the configuration is complete. */
197     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR1_CMD, 0, 0 } },
198     /* Check QE bit. */
199     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
200     /* The END command, will not be executed and need return. */
201     { FLASH_CMD_TYPE_END,        HAL_SPI_FRAME_FORMAT_MAX_NUM,   0, { 0 } }
202 };
203 
204 static flash_cmd_exe_t g_xtx_xt25q128d_set_qe_cmd[] = {
205     /* Check QE bit. */
206     { FLASH_CMD_TYPE_CHECK,      HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
207     /* Write enable. */
208     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_STANDARD, 1, { FLASH_WREN_CMD } },
209     /* Write status register-2 to 0x2, set QE bit. */
210     { FLASH_CMD_TYPE_CMD,        HAL_SPI_FRAME_FORMAT_STANDARD, 2, { 0x31, 0x02 } },
211     /* Wait until the configuration is complete. */
212     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR1_CMD, 0, 0 } },
213     /* Check QE bit. */
214     { FLASH_CMD_TYPE_PROCESSING, HAL_SPI_FRAME_FORMAT_STANDARD, 3, { FLASH_RDSR2_CMD, 0x1, 0x2 } },
215     /* The END command, will not be executed and need return. */
216     { FLASH_CMD_TYPE_END,        HAL_SPI_FRAME_FORMAT_MAX_NUM,   0, { 0 } }
217 };
218 
219 static const flash_qe_config_t g_flash_need_set_qe[] = {
220     {FLASH_MANUFACTURER_WINBOND_W25Q32,      g_winbond_w25qxx_set_qe_cmd},
221     {FLASH_MANUFACTURER_WINBOND_W25Q64,      g_winbond_w25qxx_set_qe_cmd},
222     {FLASH_MANUFACTURER_WINBOND_W25Q128,     g_winbond_w25qxx_set_qe_cmd},
223     {FLASH_MANUFACTURER_WINBOND_W25Q128JW,   g_winbond_w25qxx_set_qe_cmd},
224     {FLASH_MANUFACTURER_DOSILICON_FM25M64,   g_dosilicon_fm25m64_set_qe_cmd},
225     {FLASH_MANUFACTURER_DOSILICON_FM25M4AA,  g_dosilicon_fm25m64_set_qe_cmd},
226     {FLASH_MANUFACTURER_DOSILICON_DS25M4AB,  g_winbond_w25qxx_set_qe_cmd},
227     {FLASH_MANUFACTURER_ELITE_EN25SX128A,    g_winbond_en25sx128a_set_qe_cmd},
228     {FLASH_MANUFACTURER_XTX_XT25Q128D,       g_xtx_xt25q128d_set_qe_cmd},
229 };
230 
231 #define FLASH_WIP                (bit(0))
232 #define FLASH_WEL                (bit(1))
233 #define FLASH_MXIC_SUSPEND       (bit(2) | bit(3))
234 #define FLASH_MICRON_SUSPEND     (bit(7))
235 #define FLASH_WINBOND_SUSPEND    (bit(7))
236 #define FLASH_GIGADEVICE_SUSPEND (bit(0))
237 #define FLASH_DOSILICON_SUSPEND  (bit(7))
238 
239 /**
240   * @}
241   */
242 #endif