|
42 | 42 |
|
43 | 43 | #define W25Q256_INSTRUCTION_ENTER_4BYTE_ADDRESS_MODE 0xB7
|
44 | 44 |
|
45 |
| -// Format is manufacturer, memory type, then capacity |
46 |
| -#define JEDEC_ID_MACRONIX_MX25L3206E 0xC22016 |
47 |
| -#define JEDEC_ID_MACRONIX_MX25L6406E 0xC22017 |
48 |
| -#define JEDEC_ID_MACRONIX_MX25L25635E 0xC22019 |
49 |
| -#define JEDEC_ID_MICRON_M25P16 0x202015 |
50 |
| -#define JEDEC_ID_MICRON_N25Q064 0x20BA17 |
51 |
| -#define JEDEC_ID_MICRON_N25Q128 0x20ba18 |
52 |
| -#define JEDEC_ID_WINBOND_W25Q16 0xEF4015 |
53 |
| -#define JEDEC_ID_WINBOND_W25Q64 0xEF4017 |
54 |
| -#define JEDEC_ID_WINBOND_W25Q128 0xEF4018 |
55 |
| -#define JEDEC_ID_WINBOND_W25Q256 0xEF4019 |
56 |
| -#define JEDEC_ID_SPANSION_S25FL116 0x014015 |
57 |
| -#define JEDEC_ID_EON_W25Q64 0x1C3017 |
58 |
| -#define JEDEC_ID_CYPRESS_S25FL128L 0x016018 |
59 |
| -#define JEDEC_ID_WINBOND_W25Q128_2 0xEF7018 |
60 |
| - |
| 45 | +struct { |
| 46 | + uint32_t jedecID; |
| 47 | + flashSector_t sectors; |
| 48 | + uint16_t pagesPerSector; |
| 49 | +} m25p16FlashConfig[] = { |
| 50 | + // Macronix MX25L3206E |
| 51 | + // Datasheet: https://docs.rs-online.com/5c85/0900766b814ac6f9.pdf |
| 52 | + {0xC22016, 64, 256}, |
| 53 | + // Macronix MX25L6406E |
| 54 | + // Datasheet: https://www.macronix.com/Lists/Datasheet/Attachments/7370/MX25L6406E,%203V,%2064Mb,%20v1.9.pdf |
| 55 | + {0xC22017, 128, 256}, |
| 56 | + // Macronix MX25L25635E |
| 57 | + // Datasheet: https://www.macronix.com/Lists/Datasheet/Attachments/7331/MX25L25635E,%203V,%20256Mb,%20v1.3.pdf |
| 58 | + {0xC22019, 512, 256}, |
| 59 | + // Micron M25P16 |
| 60 | + // Datasheet: https://www.micron.com/-/media/client/global/documents/products/data-sheet/nor-flash/serial-nor/m25p/m25p16.pdf |
| 61 | + {0x202015, 32, 256}, |
| 62 | + // Micron N25Q064 |
| 63 | + // Datasheet: https://www.micron.com/-/media/client/global/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_64a_3v_65nm.pdf |
| 64 | + {0x20BA17, 128, 256}, |
| 65 | + // Micron N25Q128 |
| 66 | + // Datasheet: https://www.micron.com/-/media/client/global/documents/products/data-sheet/nor-flash/serial-nor/n25q/n25q_128mb_1_8v_65nm.pdf |
| 67 | + {0x20ba18, 256, 256}, |
| 68 | + // Winbond W25Q80 |
| 69 | + // Datasheet: https://www.winbond.com/resource-files/w25q80dv%20dl_revh_10022015.pdf |
| 70 | + {0xEF4014, 16, 256}, |
| 71 | + // Winbond W25Q16 |
| 72 | + // Datasheet: https://www.winbond.com/resource-files/w25q16dv_revi_nov1714_web.pdf |
| 73 | + {0xEF4015, 32, 256}, |
| 74 | + // Winbond W25X32 |
| 75 | + // Datasheet: https://www.winbond.com/resource-files/w25x32a_revb_080709.pdf |
| 76 | + {0xEF3016, 64, 256}, |
| 77 | + // Winbond W25Q32 |
| 78 | + // Datasheet: https://www.winbond.com/resource-files/w25q32jv%20dtr%20revf%2002242017.pdf?__locale=zh_TW |
| 79 | + {0xEF4016, 64, 256}, |
| 80 | + // Winbond W25Q64 |
| 81 | + // Datasheet: https://www.winbond.com/resource-files/w25q64jv%20spi%20%20%20revc%2006032016%20kms.pdf |
| 82 | + {0xEF4017, 128, 256}, // W25Q64JV-IQ/JQ |
| 83 | + {0xEF7017, 128, 256}, // W25Q64JV-IM/JM* |
| 84 | + // Winbond W25Q128 |
| 85 | + // Datasheet: https://www.winbond.com/resource-files/w25q128fv%20rev.l%2008242015.pdf |
| 86 | + {0xEF4018, 256, 256}, |
| 87 | + // Zbit ZB25VQ128 |
| 88 | + // Datasheet: http://zbitsemi.com/upload/file/20201010/20201010174048_82182.pdf |
| 89 | + {0x5E4018, 256, 256}, |
| 90 | + // Winbond W25Q128_DTR |
| 91 | + // Datasheet: https://www.winbond.com/resource-files/w25q128jv%20dtr%20revb%2011042016.pdf |
| 92 | + {0xEF7018, 256, 256}, |
| 93 | + // Winbond W25Q256 |
| 94 | + // Datasheet: https://www.winbond.com/resource-files/w25q256jv%20spi%20revb%2009202016.pdf |
| 95 | + {0xEF4019, 512, 256}, |
| 96 | + // Cypress S25FL064L |
| 97 | + // Datasheet: https://www.cypress.com/file/316661/download |
| 98 | + {0x016017, 128, 256}, |
| 99 | + // Cypress S25FL128L |
| 100 | + // Datasheet: https://www.cypress.com/file/316171/download |
| 101 | + {0x016018, 256, 256}, |
| 102 | + // BergMicro W25Q32 |
| 103 | + // Datasheet: https://www.winbond.com/resource-files/w25q32jv%20dtr%20revf%2002242017.pdf?__locale=zh_TW |
| 104 | + {0xE04016, 1024, 16}, |
| 105 | + // JEDEC_ID_EON_W25Q64 |
| 106 | + {0x1C3017, 128, 256}, |
| 107 | + // JEDEC_ID_SPANSION_S25FL116 |
| 108 | + {0x014015, 32, 256 }, |
| 109 | + // End of list |
| 110 | + {0x000000, 0, 0}}; |
61 | 111 |
|
62 | 112 | // The timeout we expect between being able to issue page program instructions
|
63 | 113 | #define DEFAULT_TIMEOUT_MILLIS 6
|
@@ -167,54 +217,24 @@ static bool m25p16_readIdentification(void)
|
167 | 217 | // Manufacturer, memory type, and capacity
|
168 | 218 | chipID = (in[1] << 16) | (in[2] << 8) | (in[3]);
|
169 | 219 |
|
170 |
| - // All supported chips use the same pagesize of 256 bytes |
171 |
| - |
172 |
| - switch (chipID) { |
173 |
| - case JEDEC_ID_MICRON_M25P16: |
174 |
| - case JEDEC_ID_SPANSION_S25FL116: |
175 |
| - case JEDEC_ID_WINBOND_W25Q16: |
176 |
| - geometry.sectors = 32; |
177 |
| - geometry.pagesPerSector = 256; |
178 |
| - break; |
179 |
| - |
180 |
| - case JEDEC_ID_MACRONIX_MX25L3206E: |
181 |
| - geometry.sectors = 64; |
182 |
| - geometry.pagesPerSector = 256; |
183 |
| - break; |
184 |
| - |
185 |
| - case JEDEC_ID_MICRON_N25Q064: |
186 |
| - case JEDEC_ID_WINBOND_W25Q64: |
187 |
| - case JEDEC_ID_MACRONIX_MX25L6406E: |
188 |
| - case JEDEC_ID_EON_W25Q64: |
189 |
| - geometry.sectors = 128; |
190 |
| - geometry.pagesPerSector = 256; |
191 |
| - break; |
192 |
| - |
193 |
| - case JEDEC_ID_MICRON_N25Q128: |
194 |
| - case JEDEC_ID_WINBOND_W25Q128: |
195 |
| - case JEDEC_ID_CYPRESS_S25FL128L: |
196 |
| - case JEDEC_ID_WINBOND_W25Q128_2: |
197 |
| - geometry.sectors = 256; |
198 |
| - geometry.pagesPerSector = 256; |
199 |
| - break; |
200 |
| - |
201 |
| - case JEDEC_ID_WINBOND_W25Q256: |
202 |
| - case JEDEC_ID_MACRONIX_MX25L25635E: |
203 |
| - geometry.sectors = 512; |
204 |
| - geometry.pagesPerSector = 256; |
205 |
| - break; |
206 |
| - |
207 |
| - default: |
208 |
| - // Unsupported chip or not an SPI NOR flash |
209 |
| - geometry.sectors = 0; |
210 |
| - geometry.pagesPerSector = 0; |
211 |
| - |
212 |
| - geometry.sectorSize = 0; |
213 |
| - geometry.totalSize = 0; |
214 |
| - return false; |
| 220 | + geometry.sectors = 0; |
| 221 | + geometry.pagesPerSector = 0; |
| 222 | + geometry.sectorSize = 0; |
| 223 | + geometry.totalSize = 0; |
| 224 | + |
| 225 | + for(int i = 0; m25p16FlashConfig[i].jedecID != 0; ++i) { |
| 226 | + if(m25p16FlashConfig[i].jedecID == chipID) { |
| 227 | + geometry.sectors = m25p16FlashConfig[i].sectors; |
| 228 | + geometry.pagesPerSector = m25p16FlashConfig[i].pagesPerSector; |
| 229 | + } |
| 230 | + } |
| 231 | + |
| 232 | + if(geometry.sectors == 0) { |
| 233 | + return false; |
215 | 234 | }
|
216 | 235 |
|
217 | 236 | geometry.flashType = FLASH_TYPE_NOR;
|
| 237 | + geometry.pageSize = M25P16_PAGESIZE; |
218 | 238 | geometry.sectorSize = geometry.pagesPerSector * geometry.pageSize;
|
219 | 239 | geometry.totalSize = geometry.sectorSize * geometry.sectors;
|
220 | 240 |
|
|
0 commit comments