Skip to content

Commit 828857d

Browse files
earlephilhowerd-a-v
authored andcommitted
Make SPIFFS be an integer number of blocks (#5989)
* Make SPIFFS be an integer number of blocks boards.txt.py simply calculated the end and start using flash sizes, but in cases where an 8K page was used (>512KB SPIFFS), this could leave a 4K half-block left at the end of SPIFFS. mkspiffs and the SPIFFS code uses integer division to calculate the maximum block number, so it worked fine in practice and the code simply ignored the extra, fractional block. Now actually take block size into account when calculating the end of SPIFFS, ensuring no fractional blocks are passed in. Does not result in data loss on pre-existing SPIFFS filesystems. * Fix the 1m512 case and clean up code Ensure that no SPIFFS_block in the LD files is modified from the original to endure correct backwards compatibility * Factor out common if, clean code * Make boards.py vars "fs_xx" instead of "spiffs_xx"
1 parent adf2b14 commit 828857d

11 files changed

+129
-130
lines changed

boards.txt

+80-80
Large diffs are not rendered by default.

tools/boards.txt.py

+31-32
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,7 @@ def all_debug ():
11611161
################################################################
11621162
# flash size
11631163

1164-
def flash_map (flashsize_kb, spiffs_kb = 0):
1164+
def flash_map (flashsize_kb, fs_kb = 0):
11651165

11661166
# mapping:
11671167
# flash | reserved | empty | spiffs | eeprom | rf-cal | sdk-wifi-settings
@@ -1172,29 +1172,32 @@ def flash_map (flashsize_kb, spiffs_kb = 0):
11721172
eeprom_size_kb = 4
11731173
rfcal_size_kb = 4
11741174
sdkwifi_size_kb = 12
1175-
spiffs_end = (flashsize_kb - sdkwifi_size_kb - rfcal_size_kb - eeprom_size_kb) * 1024
1175+
fs_end = (flashsize_kb - sdkwifi_size_kb - rfcal_size_kb - eeprom_size_kb) * 1024
11761176
rfcal_addr = (flashsize_kb - sdkwifi_size_kb - rfcal_size_kb) * 1024
11771177
if flashsize_kb <= 1024:
1178-
max_upload_size = (flashsize_kb - (spiffs_kb + eeprom_size_kb + rfcal_size_kb + sdkwifi_size_kb)) * 1024 - reserved
1179-
spiffs_start = spiffs_end - spiffs_kb * 1024
1180-
spiffs_blocksize = 4096
1178+
max_upload_size = (flashsize_kb - (fs_kb + eeprom_size_kb + rfcal_size_kb + sdkwifi_size_kb)) * 1024 - reserved
1179+
fs_start = fs_end - fs_kb * 1024
11811180
else:
11821181
max_upload_size = 1024 * 1024 - reserved
1183-
spiffs_start = (flashsize_kb - spiffs_kb) * 1024
1184-
if spiffs_kb < 512:
1185-
spiffs_blocksize = 4096
1186-
else:
1187-
spiffs_blocksize = 8192
1182+
fs_start = (flashsize_kb - fs_kb) * 1024
1183+
1184+
if fs_kb < 512:
1185+
fs_blocksize = 4096
1186+
else:
1187+
fs_blocksize = 8192
11881188

1189-
max_ota_size = min(max_upload_size, spiffs_start / 2) # =(max_upload_size+empty_size)/2
1189+
# Adjust SPIFFS_end to be a multiple of the block size
1190+
fs_end = fs_blocksize * (int)((fs_end - fs_start)/fs_blocksize) + fs_start;
1191+
1192+
max_ota_size = min(max_upload_size, fs_start / 2) # =(max_upload_size+empty_size)/2
11901193
strsize = str(int(flashsize_kb / 1024)) + 'M' if (flashsize_kb >= 1024) else str(flashsize_kb) + 'K'
1191-
strspiffs = str(int(spiffs_kb / 1024)) + 'M' if (spiffs_kb >= 1024) else str(spiffs_kb) + 'K'
1192-
strspiffs_strip = str(int(spiffs_kb / 1024)) + 'M' if (spiffs_kb >= 1024) else str(spiffs_kb) if (spiffs_kb > 0) else ''
1194+
strfs = str(int(fs_kb / 1024)) + 'M' if (fs_kb >= 1024) else str(fs_kb) + 'K'
1195+
strfs_strip = str(int(fs_kb / 1024)) + 'M' if (fs_kb >= 1024) else str(fs_kb) if (fs_kb > 0) else ''
11931196

1194-
ld = 'eagle.flash.' + strsize.lower() + strspiffs_strip.lower() + '.ld'
1195-
menu = '.menu.eesz.' + strsize + strspiffs_strip
1197+
ld = 'eagle.flash.' + strsize.lower() + strfs_strip.lower() + '.ld'
1198+
menu = '.menu.eesz.' + strsize + strfs_strip
11961199
menub = menu + '.build.'
1197-
desc = 'no' if (spiffs_kb == 0) else strspiffs + 'B'
1200+
desc = 'no' if (fs_kb == 0) else strfs + 'B'
11981201
d = collections.OrderedDict([
11991202
( menu, strsize + 'B (FS:' + desc + ' OTA:~%iKB)' % (max_ota_size / 1024)),
12001203
( menub + 'flash_size', strsize ),
@@ -1204,11 +1207,11 @@ def flash_map (flashsize_kb, spiffs_kb = 0):
12041207
( menu + '.upload.maximum_size', "%i" % max_upload_size ),
12051208
( menub + 'rfcal_addr', "0x%X" % rfcal_addr)
12061209
])
1207-
if spiffs_kb > 0:
1210+
if fs_kb > 0:
12081211
d.update(collections.OrderedDict([
1209-
( menub + 'spiffs_start', "0x%05X" % spiffs_start ),
1210-
( menub + 'spiffs_end', "0x%05X" % spiffs_end ),
1211-
( menub + 'spiffs_blocksize', "%i" % spiffs_blocksize ),
1212+
( menub + 'spiffs_start', "0x%05X" % fs_start ),
1213+
( menub + 'spiffs_end', "0x%05X" % fs_end ),
1214+
( menub + 'spiffs_blocksize', "%i" % fs_blocksize ),
12121215
]))
12131216

12141217
if ldshow:
@@ -1224,23 +1227,19 @@ def flash_map (flashsize_kb, spiffs_kb = 0):
12241227
realstdout = sys.stdout
12251228
sys.stdout = open(lddir + ld, 'w')
12261229

1227-
if spiffs_kb == 0:
1228-
spiffs_start = spiffs_end
1230+
if fs_kb == 0:
1231+
fs_start = fs_end
12291232
page = 0
1230-
block = 0
1231-
elif spiffs_kb < 0x80000 / 1024:
1232-
page = 0x100
1233-
block = 0x1000
1233+
fs_blocksize = 0
12341234
else:
12351235
page = 0x100
1236-
block = 0x2000
12371236

12381237
print("/* Flash Split for %s chips */" % strsize)
12391238
print("/* sketch @0x%X (~%dKB) (%dB) */" % (spi, (max_upload_size / 1024), max_upload_size))
1240-
empty_size = spiffs_start - max_upload_size
1239+
empty_size = fs_start - max_upload_size
12411240
if empty_size > 0:
12421241
print("/* empty @0x%X (~%dKB) (%dB) */" % (spi + max_upload_size, empty_size / 1024, empty_size))
1243-
print("/* spiffs @0x%X (~%dKB) (%dB) */" % (spi + spiffs_start, ((spiffs_end - spiffs_start) / 1024), spiffs_end - spiffs_start))
1242+
print("/* spiffs @0x%X (~%dKB) (%dB) */" % (spi + fs_start, ((fs_end - fs_start) / 1024), fs_end - fs_start))
12441243
print("/* eeprom @0x%X (%dKB) */" % (spi + rfcal_addr - eeprom_size_kb * 1024, eeprom_size_kb))
12451244
print("/* rfcal @0x%X (%dKB) */" % (spi + rfcal_addr, rfcal_size_kb))
12461245
print("/* wifi @0x%X (%dKB) */" % (spi + rfcal_addr + rfcal_size_kb * 1024, sdkwifi_size_kb))
@@ -1253,10 +1252,10 @@ def flash_map (flashsize_kb, spiffs_kb = 0):
12531252
print(" irom0_0_seg : org = 0x40201010, len = 0x%x" % max_upload_size)
12541253
print("}")
12551254
print("")
1256-
print("PROVIDE ( _FS_start = 0x%08X );" % (0x40200000 + spiffs_start))
1257-
print("PROVIDE ( _FS_end = 0x%08X );" % (0x40200000 + spiffs_end))
1255+
print("PROVIDE ( _FS_start = 0x%08X );" % (0x40200000 + fs_start))
1256+
print("PROVIDE ( _FS_end = 0x%08X );" % (0x40200000 + fs_end))
12581257
print("PROVIDE ( _FS_page = 0x%X );" % page)
1259-
print("PROVIDE ( _FS_block = 0x%X );" % block)
1258+
print("PROVIDE ( _FS_block = 0x%X );" % fs_blocksize)
12601259
print("")
12611260
print('INCLUDE "local.eagle.app.v6.common.ld"')
12621261

tools/sdk/ld/eagle.flash.16m14m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 16M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~1028KB) (1052688B) */
4-
/* spiffs @0x40400000 (~14316KB) (14659584B) */
4+
/* spiffs @0x40400000 (~14312KB) (14655488B) */
55
/* eeprom @0x411FB000 (4KB) */
66
/* rfcal @0x411FC000 (4KB) */
77
/* wifi @0x411FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40400000 );
18-
PROVIDE ( _FS_end = 0x411FB000 );
18+
PROVIDE ( _FS_end = 0x411FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.16m15m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 16M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~4KB) (4112B) */
4-
/* spiffs @0x40300000 (~15340KB) (15708160B) */
4+
/* spiffs @0x40300000 (~15336KB) (15704064B) */
55
/* eeprom @0x411FB000 (4KB) */
66
/* rfcal @0x411FC000 (4KB) */
77
/* wifi @0x411FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40300000 );
18-
PROVIDE ( _FS_end = 0x411FB000 );
18+
PROVIDE ( _FS_end = 0x411FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.2m1m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 2M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~4KB) (4112B) */
4-
/* spiffs @0x40300000 (~1004KB) (1028096B) */
4+
/* spiffs @0x40300000 (~1000KB) (1024000B) */
55
/* eeprom @0x403FB000 (4KB) */
66
/* rfcal @0x403FC000 (4KB) */
77
/* wifi @0x403FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40300000 );
18-
PROVIDE ( _FS_end = 0x403FB000 );
18+
PROVIDE ( _FS_end = 0x403FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.2m512.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 2M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~516KB) (528400B) */
4-
/* spiffs @0x40380000 (~492KB) (503808B) */
4+
/* spiffs @0x40380000 (~488KB) (499712B) */
55
/* eeprom @0x403FB000 (4KB) */
66
/* rfcal @0x403FC000 (4KB) */
77
/* wifi @0x403FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40380000 );
18-
PROVIDE ( _FS_end = 0x403FB000 );
18+
PROVIDE ( _FS_end = 0x403FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.4m1m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 4M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~2052KB) (2101264B) */
4-
/* spiffs @0x40500000 (~1004KB) (1028096B) */
4+
/* spiffs @0x40500000 (~1000KB) (1024000B) */
55
/* eeprom @0x405FB000 (4KB) */
66
/* rfcal @0x405FC000 (4KB) */
77
/* wifi @0x405FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40500000 );
18-
PROVIDE ( _FS_end = 0x405FB000 );
18+
PROVIDE ( _FS_end = 0x405FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.4m2m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 4M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~1028KB) (1052688B) */
4-
/* spiffs @0x40400000 (~2028KB) (2076672B) */
4+
/* spiffs @0x40400000 (~2024KB) (2072576B) */
55
/* eeprom @0x405FB000 (4KB) */
66
/* rfcal @0x405FC000 (4KB) */
77
/* wifi @0x405FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40400000 );
18-
PROVIDE ( _FS_end = 0x405FB000 );
18+
PROVIDE ( _FS_end = 0x405FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.4m3m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 4M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~4KB) (4112B) */
4-
/* spiffs @0x40300000 (~3052KB) (3125248B) */
4+
/* spiffs @0x40300000 (~3048KB) (3121152B) */
55
/* eeprom @0x405FB000 (4KB) */
66
/* rfcal @0x405FC000 (4KB) */
77
/* wifi @0x405FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40300000 );
18-
PROVIDE ( _FS_end = 0x405FB000 );
18+
PROVIDE ( _FS_end = 0x405FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.8m6m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 8M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~1028KB) (1052688B) */
4-
/* spiffs @0x40400000 (~6124KB) (6270976B) */
4+
/* spiffs @0x40400000 (~6120KB) (6266880B) */
55
/* eeprom @0x409FB000 (4KB) */
66
/* rfcal @0x409FC000 (4KB) */
77
/* wifi @0x409FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40400000 );
18-
PROVIDE ( _FS_end = 0x409FB000 );
18+
PROVIDE ( _FS_end = 0x409FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

tools/sdk/ld/eagle.flash.8m7m.ld

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Flash Split for 8M chips */
22
/* sketch @0x40200000 (~1019KB) (1044464B) */
33
/* empty @0x402FEFF0 (~4KB) (4112B) */
4-
/* spiffs @0x40300000 (~7148KB) (7319552B) */
4+
/* spiffs @0x40300000 (~7144KB) (7315456B) */
55
/* eeprom @0x409FB000 (4KB) */
66
/* rfcal @0x409FC000 (4KB) */
77
/* wifi @0x409FD000 (12KB) */
@@ -15,7 +15,7 @@ MEMORY
1515
}
1616

1717
PROVIDE ( _FS_start = 0x40300000 );
18-
PROVIDE ( _FS_end = 0x409FB000 );
18+
PROVIDE ( _FS_end = 0x409FA000 );
1919
PROVIDE ( _FS_page = 0x100 );
2020
PROVIDE ( _FS_block = 0x2000 );
2121

0 commit comments

Comments
 (0)