Skip to content

Commit b8ee938

Browse files
authored
Merge pull request #8985 from iNavFlight/mmosca-m25p16-cleanup
Cleanup m25p16 flash detection code
2 parents 813bbad + c48d11b commit b8ee938

File tree

1 file changed

+81
-61
lines changed

1 file changed

+81
-61
lines changed

src/main/drivers/flash_m25p16.c

Lines changed: 81 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,72 @@
4242

4343
#define W25Q256_INSTRUCTION_ENTER_4BYTE_ADDRESS_MODE 0xB7
4444

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}};
61111

62112
// The timeout we expect between being able to issue page program instructions
63113
#define DEFAULT_TIMEOUT_MILLIS 6
@@ -167,54 +217,24 @@ static bool m25p16_readIdentification(void)
167217
// Manufacturer, memory type, and capacity
168218
chipID = (in[1] << 16) | (in[2] << 8) | (in[3]);
169219

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;
215234
}
216235

217236
geometry.flashType = FLASH_TYPE_NOR;
237+
geometry.pageSize = M25P16_PAGESIZE;
218238
geometry.sectorSize = geometry.pagesPerSector * geometry.pageSize;
219239
geometry.totalSize = geometry.sectorSize * geometry.sectors;
220240

0 commit comments

Comments
 (0)