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