Skip to content

Commit 7e072dc

Browse files
authored
Merge pull request #2670 from ANTodorov/smart_spi_detect
rework to use smart SPI flash detection
2 parents 692235b + 4cd914a commit 7e072dc

File tree

4 files changed

+114
-99
lines changed

4 files changed

+114
-99
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
33
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
44

55
## [unreleased][unreleased]
6+
- Changed SPI flash detection to calculate the size instead of table lookup, updated spi_flash_decode.py script with more ICs (@ANTodorov)
67
- Fixed `hf/lf tune` segfault when called from script (@doegox)
78
- Added option to set and get maximum read/write block number using `hf_mf_ultimatecard` script (@piotrva)
89
- Added JEDEC information for SPI flash W25Q64JV (@ANTodorov)

client/pyscripts/spi_flash_decode.py

Lines changed: 107 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,62 +12,118 @@ def color(s, fg=None):
1212
return str(s)
1313

1414
spi = {
15+
0x68:{
16+
"manufacturer": "Boya",
17+
"jedec" : {
18+
0x40: {
19+
0x15: {
20+
"part": "BY25Q16BS",
21+
"size": "16mbits",
22+
"sizeB": "2MB",
23+
},
24+
},
25+
},
26+
},
1527
0x85:{
1628
"manufacturer": "Puya",
17-
0x60: {
18-
0x15: {
19-
"part": "P25Q16H",
20-
"size": "16mbits",
21-
"sizeB": "2MB",
29+
"jedec" : {
30+
0x60: {
31+
0x15: {
32+
"part": "P25Q16H",
33+
"size": "16mbits",
34+
"sizeB": "2MB",
35+
},
36+
0x16: {
37+
"part": "P25Q32H",
38+
"size": "32mbits",
39+
"sizeB": "4MB",
40+
},
41+
0x17: {
42+
"part": "P25Q64H",
43+
"size": "64mbits",
44+
"sizeB": "8MB",
45+
},
2246
},
2347
},
2448
},
2549
0xEF:{
2650
"manufacturer": "Winbond",
27-
0x30: {
28-
0x11: {
29-
"part": "W25X10BV",
30-
"size": "1mbits",
31-
"sizeB": "128KB",
32-
},
33-
0x12: {
34-
"part": "W25X20BV",
35-
"size": "2mbits",
36-
"sizeB": "256KB",
37-
},
38-
0x13: {
39-
"part": "W25X40BV",
40-
"size": "4mbits",
41-
"sizeB": "512KB",
42-
},
43-
},
44-
0x40: {
45-
0x13: {
46-
"part": "W25Q40BV",
47-
"size": "4mbits",
48-
"sizeB": "512KB",
49-
},
50-
0x14: {
51-
"part": "W25Q80BV",
52-
"size": "8mbits",
53-
"sizeB": "1MB",
51+
"jedec" : {
52+
0x30: {
53+
0x11: {
54+
"part": "W25X10BV",
55+
"size": "1mbits",
56+
"sizeB": "128KB",
57+
},
58+
0x12: {
59+
"part": "W25X20BV",
60+
"size": "2mbits",
61+
"sizeB": "256KB",
62+
},
63+
0x13: {
64+
"part": "W25X40BV",
65+
"size": "4mbits",
66+
"sizeB": "512KB",
67+
},
5468
},
55-
0x15: {
56-
"part": "W25Q16BV",
57-
"size": "16mbits",
58-
"sizeB": "2MB",
69+
0x40: {
70+
0x12: {
71+
"part": "W25Q20BV",
72+
"size": "2mbits",
73+
"sizeB": "256KB",
74+
},
75+
0x13: {
76+
"part": "W25Q40BV",
77+
"size": "4mbits",
78+
"sizeB": "512KB",
79+
},
80+
0x14: {
81+
"part": "W25Q80BV",
82+
"size": "8mbits",
83+
"sizeB": "1MB",
84+
},
85+
0x15: {
86+
"part": "W25Q16BV",
87+
"size": "16mbits",
88+
"sizeB": "2MB",
89+
},
90+
0x16: {
91+
"part": "W25Q32BV",
92+
"size": "32mbits",
93+
"sizeB": "4MB",
94+
},
95+
0x17: {
96+
"part": "W25Q64BV",
97+
"size": "64mbits",
98+
"sizeB": "8MB",
99+
},
59100
},
60-
0x16: {
61-
"part": "W25Q32BV",
62-
"size": "32mbits",
63-
"sizeB": "4MB",
64-
},
65-
},
66-
0x70: {
67-
0x22: {
68-
"part": "W25Q02JV-IM",
69-
"size": "2mbits",
70-
"sizeB": "256KB",
101+
0x70: {
102+
0x14: {
103+
"part": "W25Q80JV",
104+
"size": "8mbits",
105+
"sizeB": "1MB",
106+
},
107+
0x15: {
108+
"part": "W25Q16JV",
109+
"size": "16mbits",
110+
"sizeB": "2MB",
111+
},
112+
0x16: {
113+
"part": "W25Q32JV",
114+
"size": "32mbits",
115+
"sizeB": "4MB",
116+
},
117+
0x17: {
118+
"part": "W25Q64JV",
119+
"size": "64mbits",
120+
"sizeB": "8MB",
121+
},
122+
0x22: {
123+
"part": "W25Q02JV-IM",
124+
"size": "2mbits",
125+
"sizeB": "256KB",
126+
},
71127
},
72128
},
73129
},
@@ -90,16 +146,16 @@ def color(s, fg=None):
90146
did_h = did >> 8
91147
did_l = did & 0xff
92148
t = None
93-
149+
print(f"\n JEDEC ID....... 0x{mid:X} / 0x{did:X}")
94150
if mid in spi:
95151

96152
mfr = spi[mid]['manufacturer']
97153

98-
if did_h in spi[mid]:
154+
if did_h in spi[mid]['jedec']:
99155

100-
if did_l in spi[mid][did_h]:
156+
if did_l in spi[mid]['jedec'][did_h]:
101157

102-
t = spi[mid][did_h][did_l]
158+
t = spi[mid]['jedec'][did_h][did_l]
103159
print("\n Manufacturer... " + color(f"{mfr}", fg="green") +
104160
"\n Device......... " + color(f"{t['part']}", fg="green") +
105161
"\n Size........... " + color(f"{t['size']} ({t['sizeB']})", fg="yellow")

common_arm/flashmem.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,6 @@ void Flashmem_print_status(void) {
366366
);
367367
}
368368

369-
Dbprintf(" Device.................. " _YELLOW_("%s"), spi_flash_data.device);
370369
Dbprintf(" Memory size............. " _YELLOW_("%d kB (%d pages * 64k)"), spi_flash_pages64k * 64, spi_flash_pages64k);
371370

372371
uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0};
@@ -442,21 +441,13 @@ bool FlashDetect(void) {
442441
} else {
443442
if (g_dbglevel > 3) Dbprintf("Flash_ReadID failed reading Mfr/Dev (0x90)");
444443
}
445-
// default device is 'unknown'
446-
spi_flash_data.device = SpiFlashTable[0].device;
447-
444+
// Check JEDEC data is valid, compare the reported device types and then calculate the number of pages
445+
// It is covering the most (known) cases of devices but probably there are vendors with different data
446+
// They will be handled when there is such cases
448447
if (ret) {
449-
for (int i = 0; i < ARRAYLEN(SpiFlashTable); i++) {
450-
if (SpiFlashTable[i].manufacturer_id == spi_flash_data.manufacturer_id) {
451-
if (SpiFlashTable[i].jedec_id == spi_flash_data.jedec_id) {
452-
spi_flash_pages64k = SpiFlashTable[i].pages64k;
453-
spi_flash_data.device = SpiFlashTable[i].device;
454-
break;
455-
}
456-
if (SpiFlashTable[i].device_id == spi_flash_data.device_id) {
457-
spi_flash_data.device = SpiFlashTable[i].device;
458-
break;
459-
}
448+
if (spi_flash_data.jedec_id > 0 && spi_flash_data.jedec_id < 0xFFFF) {
449+
if (((spi_flash_data.device_id + 1) & 0x0F) == (spi_flash_data.jedec_id & 0x000F)) {
450+
spi_flash_pages64k = 1 << (spi_flash_data.jedec_id & 0x000F);
460451
}
461452
}
462453
}

common_arm/flashmem.h

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -140,41 +140,8 @@ typedef struct {
140140
uint8_t manufacturer_id;
141141
uint8_t device_id;
142142
uint16_t jedec_id;
143-
uint8_t pages64k;
144-
char *device;
145143
} spi_flash_t;
146144

147-
static const spi_flash_t SpiFlashTable[] = {
148-
// first element is the default of 4 * 64kB pages (256kB)
149-
{ 0x00, 0x00, 0x0000, 4, "unknown" }, // 256k
150-
// Manufacturer: Puya
151-
{ 0x85, 0x14, 0x6015, 32, "P25Q16H" }, // 2048k
152-
// Manufacturer: Winbond
153-
{ 0xEF, 0x00, 0x3012, 4, "W25X20BV" }, // 256k
154-
{ 0xEF, 0x00, 0x3013, 8, "W25X40BV" }, // 512k
155-
156-
{ 0xEF, 0x00, 0x4013, 8, "W25Q40BV" }, // 512k
157-
{ 0xEF, 0x00, 0x4014, 16, "W25Q80BV" }, // 1024k
158-
{ 0xEF, 0x14, 0x4015, 32, "W25Q16BV" }, // 2048k
159-
{ 0xEF, 0x15, 0x4016, 64, "W25Q32BV" }, // 4096k
160-
161-
{ 0xEF, 0x16, 0x7017, 128, "W25Q64JV" }, // 8192k
162-
{ 0xEF, 0x21, 0x7022, 4, "W25Q02JV" },
163-
164-
// identified by Manufacturer /Device ID only
165-
/// Manufacturer: Renesas
166-
{ 0x1F, 0x46, 0x0000, 32, "AT25XE161D" }, // 2048k
167-
{ 0x1F, 0x47, 0x0000, 64, "AT25XE321D" }, // 4096k
168-
// { 0xEF, 0x05, 0x0000, 1, "Winbond!!!" }, // 64k (too small !!!)
169-
{ 0xEF, 0x10, 0x0000, 2, "W25*10BV!" }, // 128k (small !!!)
170-
{ 0xEF, 0x11, 0x0000, 4, "W25*20BV" }, // 256k
171-
{ 0xEF, 0x12, 0x0000, 8, "W25*40BV" }, // 512k
172-
{ 0xEF, 0x13, 0x0000, 16, "W25*80BV" }, // 1024k
173-
{ 0xEF, 0x14, 0x0000, 32, "W25*16*" }, // 2048k
174-
{ 0xEF, 0x15, 0x0000, 64, "W25*32*" }, // 4096k
175-
{ 0xEF, 0x16, 0x0000, 128, "W25*64*" } // 8192k
176-
};
177-
178145
extern uint8_t spi_flash_pages64k;
179146

180147
bool FlashDetect(void);

0 commit comments

Comments
 (0)