1 /* 2 * This file is part of the Serial Flash Universal Driver Library. 3 * 4 * Copyright (c) 2016-2018, Armink, <armink.ztl@gmail.com> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining 7 * a copy of this software and associated documentation files (the 8 * 'Software'), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sublicense, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be 15 * included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 21 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 * Function: It is the flash types and specification macro definition head file for this library. 26 * Created on: 2016-06-09 27 */ 28 29 #ifndef _SFUD_FLASH_DEF_H_ 30 #define _SFUD_FLASH_DEF_H_ 31 32 #include <stdint.h> 33 #include <sfud_cfg.h> 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /** 40 * flash program(write) data mode 41 */ 42 enum sfud_write_mode { 43 SFUD_WM_PAGE_256B = 1 << 0, /**< write 1 to 256 bytes per page */ 44 SFUD_WM_BYTE = 1 << 1, /**< byte write */ 45 SFUD_WM_AAI = 1 << 2, /**< auto address increment */ 46 SFUD_WM_DUAL_BUFFER = 1 << 3, /**< dual-buffer write, like AT45DB series */ 47 }; 48 49 /* manufacturer information */ 50 typedef struct { 51 char *name; 52 uint8_t id; 53 } sfud_mf; 54 55 /* flash chip information */ 56 typedef struct { 57 char *name; /**< flash chip name */ 58 uint8_t mf_id; /**< manufacturer ID */ 59 uint8_t type_id; /**< memory type ID */ 60 uint8_t capacity_id; /**< capacity ID */ 61 uint32_t capacity; /**< flash capacity (bytes) */ 62 uint16_t write_mode; /**< write mode @see sfud_write_mode */ 63 uint32_t erase_gran; /**< erase granularity (bytes) */ 64 uint8_t erase_gran_cmd; /**< erase granularity size block command */ 65 } sfud_flash_chip; 66 67 #ifdef SFUD_USING_QSPI 68 /* QSPI flash chip's extended information compared with SPI flash */ 69 typedef struct { 70 uint8_t mf_id; /**< manufacturer ID */ 71 uint8_t type_id; /**< memory type ID */ 72 uint8_t capacity_id; /**< capacity ID */ 73 uint8_t read_mode; /**< supported read mode on this qspi flash chip */ 74 } sfud_qspi_flash_ext_info; 75 #endif 76 77 /* SFUD support manufacturer JEDEC ID */ 78 #define SFUD_MF_ID_CYPRESS 0x01 79 #define SFUD_MF_ID_FUJITSU 0x04 80 #define SFUD_MF_ID_EON 0x1C 81 #define SFUD_MF_ID_ATMEL 0x1F 82 #define SFUD_MF_ID_MICRON 0x20 83 #define SFUD_MF_ID_AMIC 0x37 84 #define SFUD_MF_ID_NOR_MEM 0x52 85 #define SFUD_MF_ID_SANYO 0x62 86 #define SFUD_MF_ID_INTEL 0x89 87 #define SFUD_MF_ID_ESMT 0x8C 88 #define SFUD_MF_ID_FUDAN 0xA1 89 #define SFUD_MF_ID_HYUNDAI 0xAD 90 #define SFUD_MF_ID_SST 0xBF 91 #define SFUD_MF_ID_MACRONIX 0xC2 92 #define SFUD_MF_ID_GIGADEVICE 0xC8 93 #define SFUD_MF_ID_ISSI 0xD5 94 #define SFUD_MF_ID_WINBOND 0xEF 95 96 /* SFUD supported manufacturer information table */ 97 #define SFUD_MF_TABLE \ 98 { \ 99 {"Cypress", SFUD_MF_ID_CYPRESS}, \ 100 {"Fujitsu", SFUD_MF_ID_FUJITSU}, \ 101 {"EON", SFUD_MF_ID_EON}, \ 102 {"Atmel", SFUD_MF_ID_ATMEL}, \ 103 {"Micron", SFUD_MF_ID_MICRON}, \ 104 {"AMIC", SFUD_MF_ID_AMIC}, \ 105 {"Sanyo", SFUD_MF_ID_SANYO}, \ 106 {"Intel", SFUD_MF_ID_INTEL}, \ 107 {"ESMT", SFUD_MF_ID_ESMT}, \ 108 {"Fudan", SFUD_MF_ID_FUDAN}, \ 109 {"Hyundai", SFUD_MF_ID_HYUNDAI}, \ 110 {"SST", SFUD_MF_ID_SST}, \ 111 {"GigaDevice", SFUD_MF_ID_GIGADEVICE}, \ 112 {"ISSI", SFUD_MF_ID_ISSI}, \ 113 {"Winbond", SFUD_MF_ID_WINBOND}, \ 114 {"Macronix", SFUD_MF_ID_MACRONIX}, \ 115 {"NOR-MEM", SFUD_MF_ID_NOR_MEM}, \ 116 } 117 118 #ifdef SFUD_USING_FLASH_INFO_TABLE 119 /* SFUD supported flash chip information table. If the flash not support JEDEC JESD216 standard, 120 * then the SFUD will find the flash chip information by this table. You can add other flash to here then 121 * notice me for update it. The configuration information name and index reference the sfud_flash_chip structure. 122 * | name | mf_id | type_id | capacity_id | capacity | write_mode | erase_gran | erase_gran_cmd | 123 */ 124 #define SFUD_FLASH_CHIP_TABLE \ 125 { \ 126 {"AT45DB161E", SFUD_MF_ID_ATMEL, 0x26, 0x00, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_DUAL_BUFFER, 512, 0x81}, \ 127 {"W25Q40BV", SFUD_MF_ID_WINBOND, 0x40, 0x13, 512L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 128 {"W25X40CL", SFUD_MF_ID_WINBOND, 0x30, 0x13, 512L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 129 {"W25X16AV", SFUD_MF_ID_WINBOND, 0x30, 0x15, 2L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 130 {"W25Q16BV", SFUD_MF_ID_WINBOND, 0x40, 0x15, 2L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 131 {"W25Q32BV", SFUD_MF_ID_WINBOND, 0x40, 0x16, 4L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 132 {"W25Q64CV", SFUD_MF_ID_WINBOND, 0x40, 0x17, 8L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 133 {"W25Q64DW", SFUD_MF_ID_WINBOND, 0x60, 0x17, 8L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 134 {"W25Q128BV", SFUD_MF_ID_WINBOND, 0x40, 0x18, 16L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 135 {"W25Q256FV", SFUD_MF_ID_WINBOND, 0x40, 0x19, 32L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 136 {"SST25VF080B", SFUD_MF_ID_SST, 0x25, 0x8E, 1L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20}, \ 137 {"SST25VF016B", SFUD_MF_ID_SST, 0x25, 0x41, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20}, \ 138 {"M25P32", SFUD_MF_ID_MICRON, 0x20, 0x16, 4L*1024L*1024L, SFUD_WM_PAGE_256B, 64L*1024L, 0xD8}, \ 139 {"M25P80", SFUD_MF_ID_MICRON, 0x20, 0x14, 1L*1024L*1024L, SFUD_WM_PAGE_256B, 64L*1024L, 0xD8}, \ 140 {"M25P40", SFUD_MF_ID_MICRON, 0x20, 0x13, 512L*1024L, SFUD_WM_PAGE_256B, 64L*1024L, 0xD8}, \ 141 {"EN25Q32B", SFUD_MF_ID_EON, 0x30, 0x16, 4L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 142 {"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 143 {"GD25Q16B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x15, 2L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 144 {"GD25Q32C", SFUD_MF_ID_GIGADEVICE, 0x40, 0x16, 4L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 145 {"S25FL216K", SFUD_MF_ID_CYPRESS, 0x40, 0x15, 2L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 146 {"S25FL032P", SFUD_MF_ID_CYPRESS, 0x02, 0x15, 4L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 147 {"A25L080", SFUD_MF_ID_AMIC, 0x30, 0x14, 1L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 148 {"F25L004", SFUD_MF_ID_ESMT, 0x20, 0x13, 512L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20}, \ 149 {"PCT25VF016B", SFUD_MF_ID_SST, 0x25, 0x41, 2L*1024L*1024L, SFUD_WM_BYTE|SFUD_WM_AAI, 4096, 0x20}, \ 150 {"NM25Q128EVB", SFUD_MF_ID_NOR_MEM, 0x21, 0x18, 16L*1024L*1024L, SFUD_WM_PAGE_256B, 4096, 0x20}, \ 151 } 152 #endif /* SFUD_USING_FLASH_INFO_TABLE */ 153 154 #ifdef SFUD_USING_QSPI 155 /* This table saves flash read-fast instructions in QSPI mode, 156 * SFUD can use this table to select the most appropriate read instruction for flash. 157 * | mf_id | type_id | capacity_id | qspi_read_mode | 158 */ 159 #define SFUD_FLASH_EXT_INFO_TABLE \ 160 { \ 161 /* W25Q40BV */ \ 162 {SFUD_MF_ID_WINBOND, 0x40, 0x13, NORMAL_SPI_READ|DUAL_OUTPUT}, \ 163 /* W25Q80JV */ \ 164 {SFUD_MF_ID_WINBOND, 0x40, 0x14, NORMAL_SPI_READ|DUAL_OUTPUT}, \ 165 /* W25Q16BV */ \ 166 {SFUD_MF_ID_WINBOND, 0x40, 0x15, NORMAL_SPI_READ|DUAL_OUTPUT}, \ 167 /* W25Q32BV */ \ 168 {SFUD_MF_ID_WINBOND, 0x40, 0x16, NORMAL_SPI_READ|DUAL_OUTPUT|QUAD_OUTPUT|QUAD_IO}, \ 169 /* W25Q64JV */ \ 170 {SFUD_MF_ID_WINBOND, 0x40, 0x17, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \ 171 /* W25Q128JV */ \ 172 {SFUD_MF_ID_WINBOND, 0x40, 0x18, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \ 173 /* W25Q256FV */ \ 174 {SFUD_MF_ID_WINBOND, 0x40, 0x19, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \ 175 /* EN25Q32B */ \ 176 {SFUD_MF_ID_EON, 0x30, 0x16, NORMAL_SPI_READ|DUAL_OUTPUT|QUAD_IO}, \ 177 /* S25FL216K */ \ 178 {SFUD_MF_ID_CYPRESS, 0x40, 0x15, NORMAL_SPI_READ|DUAL_OUTPUT}, \ 179 /* A25L080 */ \ 180 {SFUD_MF_ID_AMIC, 0x30, 0x14, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO}, \ 181 /* A25LQ64 */ \ 182 {SFUD_MF_ID_AMIC, 0x40, 0x17, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_IO}, \ 183 /* MX25L3206E and KH25L3206E */ \ 184 {SFUD_MF_ID_MACRONIX, 0x20, 0x16, NORMAL_SPI_READ|DUAL_OUTPUT}, \ 185 /* MX25L51245G */ \ 186 {SFUD_MF_ID_MACRONIX, 0x20, 0x1A, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \ 187 /* GD25Q64B */ \ 188 {SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, NORMAL_SPI_READ|DUAL_OUTPUT}, \ 189 /* NM25Q128EVB */ \ 190 {SFUD_MF_ID_NOR_MEM, 0x21, 0x18, NORMAL_SPI_READ|DUAL_OUTPUT|DUAL_IO|QUAD_OUTPUT|QUAD_IO}, \ 191 } 192 #endif /* SFUD_USING_QSPI */ 193 194 #ifdef __cplusplus 195 } 196 #endif 197 198 #endif /* _SFUD_FLASH_DEF_H_ */ 199