1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-12 01:53:07 +03:00

flash-size agnostic builds (#6690)

* flash: mapping definition by sketch at runtime depending on flash chip size and user configuration
This commit is contained in:
david gauchard
2022-02-10 18:25:18 +01:00
committed by GitHub
parent 3027acaf11
commit f60defc3d3
22 changed files with 552 additions and 542 deletions

View File

@ -792,15 +792,15 @@ boards = collections.OrderedDict([
( '.menu.BoardModel.primo', 'Primo' ),
( '.menu.BoardModel.primo.build.board', 'ESP8266_ARDUINO_PRIMO' ),
( '.menu.BoardModel.primo.build.variant', 'arduino_spi' ),
( '.menu.BoardModel.primo.build.extra_flags', '-DF_CRYSTAL=40000000 -DESP8266' ),
( '.menu.BoardModel.primo.build.extra_flags', '-DF_CRYSTAL=40000000' ),
( '.menu.BoardModel.unowifideved', 'Uno WiFi' ),
( '.menu.BoardModel.unowifideved.build.board', 'ESP8266_ARDUINO_UNOWIFI' ),
( '.menu.BoardModel.unowifideved.build.variant', 'arduino_uart' ),
( '.menu.BoardModel.unowifideved.build.extra_flags=-DF_CRYSTAL', '40000000 -DESP8266' ),
( '.menu.BoardModel.unowifideved.build.extra_flags=-DF_CRYSTAL', '40000000' ),
( '.menu.BoardModel.starottodeved', 'Star OTTO' ),
( '.menu.BoardModel.starottodeved.build.variant', 'arduino_uart' ),
( '.menu.BoardModel.starottodeved.build.board', 'ESP8266_ARDUINO_STAR_OTTO' ),
( '.menu.BoardModel.starottodeved.build.extra_flags', '-DF_CRYSTAL=40000000 -DESP8266' ),
( '.menu.BoardModel.starottodeved.build.extra_flags', '-DF_CRYSTAL=40000000' ),
]),
'macro': [
'resetmethod_ck',
@ -949,7 +949,6 @@ boards = collections.OrderedDict([
'opts': {
'.build.board': 'ESP8266_SONOFF_SV',
'.build.variant': 'itead',
'.build.extra_flags': '-DESP8266',
'.build.flash_size': '1M',
'.menu.BoardModel.sonoffSV': 'ITEAD Sonoff SV',
'.menu.BoardModel.sonoffSV.build.board': 'ESP8266_SONOFF_SV',
@ -1072,7 +1071,7 @@ macros = {
'crystalfreq_menu': collections.OrderedDict([
( '.menu.CrystalFreq.26', '26 MHz' ),
( '.menu.CrystalFreq.40', '40 MHz' ),
( '.menu.CrystalFreq.40.build.extra_flags', '-DF_CRYSTAL=40000000 -DESP8266' ),
( '.menu.CrystalFreq.40.build.extra_flags', '-DF_CRYSTAL=40000000' ),
]),
'flashfreq_menu': collections.OrderedDict([
@ -1372,7 +1371,7 @@ def all_debug ():
################################################################
# flash size
def flash_map (flashsize_kb, fs_kb = 0):
def flash_map (flashsize_kb, fs_kb = 0, conf_name = ''):
# mapping:
# flash | reserved | empty | spiffs | eeprom | rf-cal | sdk-wifi-settings
@ -1403,7 +1402,7 @@ def flash_map (flashsize_kb, fs_kb = 0):
fs_blocksize = 8192
# Adjust FS_end to be a multiple of the block size
fs_end = fs_blocksize * (int)((fs_end - fs_start)/fs_blocksize) + fs_start;
fs_end = fs_blocksize * (int)((fs_end - fs_start)/fs_blocksize) + fs_start
max_ota_size = min(max_upload_size, fs_start / 2) # =(max_upload_size+empty_size)/2
strsize = str(int(flashsize_kb / 1024)) + 'M' if (flashsize_kb >= 1024) else str(flashsize_kb) + 'K'
@ -1417,12 +1416,13 @@ def flash_map (flashsize_kb, fs_kb = 0):
d = collections.OrderedDict([
( menu, strsize + 'B (FS:' + desc + ' OTA:~%iKB)' % (max_ota_size / 1024)),
( menub + 'flash_size', strsize ),
( menub + 'flash_size_bytes', "0x%X" % (flashsize_kb * 1024)),
#( menub + 'flash_size_bytes', "0x%X" % (flashsize_kb * 1024)),
( menub + 'flash_ld', ld ),
( menub + 'spiffs_pagesize', '256' ),
( menu + '.upload.maximum_size', "%i" % max_upload_size ),
#( menu + '.upload.maximum_size', "%i" % max_upload_size ),
( menub + 'rfcal_addr', "0x%X" % rfcal_addr)
])
if fs_kb > 0:
d.update(collections.OrderedDict([
( menub + 'spiffs_start', "0x%05X" % fs_start ),
@ -1430,6 +1430,10 @@ def flash_map (flashsize_kb, fs_kb = 0):
( menub + 'spiffs_blocksize', "%i" % fs_blocksize ),
]))
#d.update(collections.OrderedDict([
# ( menub + 'eeprom_start', "0x%05X" % eeprom_start ),
# ]))
if ldshow:
if ldgen:
@ -1450,6 +1454,16 @@ def flash_map (flashsize_kb, fs_kb = 0):
else:
page = 0x100
if not conf_name == '':
if not conf_name in c_flash_map:
c_flash_map[conf_name] = collections.OrderedDict([])
c_flash_map[conf_name][flashsize_kb] = \
'.eeprom_start = ' + hex(spi + eeprom_start) + ', ' \
+ '.fs_start = ' + hex(spi + fs_start) + ', ' \
+ '.fs_end = ' + hex(spi + fs_end) + ', ' \
+ '.fs_block_size = ' + hex(fs_blocksize)+ ', ' \
+ '.fs_page_size = ' + hex(page) + ', ' \
print("/* Flash Split for %s chips */" % strsize)
print("/* sketch @0x%X (~%dKB) (%dB) */" % (spi, (max_upload_size / 1024), max_upload_size))
empty_size = fs_start - max_upload_size
@ -1469,15 +1483,15 @@ def flash_map (flashsize_kb, fs_kb = 0):
print(" irom0_0_seg : org = 0x40201010, len = 0x%x" % max_upload_size)
print("}")
print("")
print("PROVIDE ( _FS_start = 0x%08X );" % (0x40200000 + fs_start))
print("PROVIDE ( _FS_end = 0x%08X );" % (0x40200000 + fs_end))
print("PROVIDE ( _FS_start = 0x%08X );" % (spi + fs_start))
print("PROVIDE ( _FS_end = 0x%08X );" % (spi + fs_end))
print("PROVIDE ( _FS_page = 0x%X );" % page)
print("PROVIDE ( _FS_block = 0x%X );" % fs_blocksize)
print("PROVIDE ( _EEPROM_start = 0x%08x );" % (0x40200000 + eeprom_start))
print("PROVIDE ( _EEPROM_start = 0x%08x );" % (spi + eeprom_start))
# Re-add deprecated symbols pointing to the same address as the new standard ones
print("/* The following symbols are DEPRECATED and will be REMOVED in a future release */")
print("PROVIDE ( _SPIFFS_start = 0x%08X );" % (0x40200000 + fs_start))
print("PROVIDE ( _SPIFFS_end = 0x%08X );" % (0x40200000 + fs_end))
print("PROVIDE ( _SPIFFS_start = 0x%08X );" % (spi + fs_start))
print("PROVIDE ( _SPIFFS_end = 0x%08X );" % (spi + fs_end))
print("PROVIDE ( _SPIFFS_page = 0x%X );" % page)
print("PROVIDE ( _SPIFFS_block = 0x%X );" % fs_blocksize)
print("")
@ -1498,44 +1512,101 @@ def all_flash_map ():
f8m = collections.OrderedDict([])
f16m = collections.OrderedDict([])
# flash(KB) spiffs(KB)
global c_flash_map
c_flash_map = collections.OrderedDict([])
f1m.update( flash_map( 1024, 64 ))
# flash(KB) spiffs(KB) confname(C)
f1m.update( flash_map( 1024, 64, 'OTA_FS' ))
f1m.update( flash_map( 1024, 128 ))
f1m.update( flash_map( 1024, 144 ))
f1m.update( flash_map( 1024, 160 ))
f1m.update( flash_map( 1024, 192 ))
f1m.update( flash_map( 1024, 256 ))
f1m.update( flash_map( 1024, 512 ))
f1m.update( flash_map( 1024))
f1m.update( flash_map( 1024, 512, 'MAX_FS' ))
f1m.update( flash_map( 1024, 0, 'NO_FS' ))
f2m.update( flash_map( 2*1024, 64 ))
f2m.update( flash_map( 2*1024, 128 ))
f2m.update( flash_map( 2*1024, 256 ))
f2m.update( flash_map( 2*1024, 256, 'OTA_FS' ))
f2m.update( flash_map( 2*1024, 512 ))
f2m.update( flash_map( 2*1024, 1024 ))
f2m.update( flash_map( 2*1024))
f2m.update( flash_map( 2*1024, 1024, 'MAX_FS' ))
f2m.update( flash_map( 2*1024, 0, 'NO_FS' ))
f4m.update( flash_map( 4*1024, 2*1024 ))
f4m.update( flash_map( 4*1024, 3*1024 ))
f4m.update( flash_map( 4*1024, 2*1024, 'OTA_FS' ))
f4m.update( flash_map( 4*1024, 3*1024, 'MAX_FS' ))
f4m.update( flash_map( 4*1024, 1024 ))
f4m.update( flash_map( 4*1024))
f4m.update( flash_map( 4*1024, 0, 'NO_FS' ))
f8m.update( flash_map( 8*1024, 6*1024 ))
f8m.update( flash_map( 8*1024, 7*1024 ))
f8m.update( flash_map( 8*1024, 6*1024, 'OTA_FS' ))
f8m.update( flash_map( 8*1024, 7*1024, 'MAX_FS' ))
f8m.update( flash_map( 8*1024, 0, 'NO_FS' ))
f16m.update(flash_map( 16*1024, 14*1024 ))
f16m.update(flash_map( 16*1024, 15*1024 ))
f16m.update(flash_map( 16*1024, 14*1024, 'OTA_FS' ))
f16m.update(flash_map( 16*1024, 15*1024, 'MAX_FS' ))
f16m.update(flash_map( 16*1024, 0, 'NO_FS' ))
f512.update(flash_map( 512, 32 ))
f512.update(flash_map( 512, 32, 'OTA_FS' ))
f512.update(flash_map( 512, 64 ))
f512.update(flash_map( 512, 128 ))
f512.update(flash_map( 512))
f512.update(flash_map( 512, 128, 'MAX_FS' ))
f512.update(flash_map( 512, 0, 'NO_FS' ))
if ldgen:
print("generated: ldscripts (in %s)" % lddir)
if ldshow:
if ldgen:
realstdout = sys.stdout
sys.stdout = open('cores/esp8266/FlashMap.h', 'w')
define = '\n'
define += '// - do not edit - autogenerated by boards.txt.py\n'
define += '\n'
define += '#ifndef __FLASH_MAP_H\n'
define += '#define __FLASH_MAP_H\n'
define += '\n'
define += '#include <stdint.h>\n'
define += '#include <stddef.h>\n'
define += '\n'
define += 'typedef struct\n'
define += '{\n'
define += ' uint32_t eeprom_start;\n'
define += ' uint32_t fs_start;\n'
define += ' uint32_t fs_end;\n'
define += ' uint32_t fs_block_size;\n'
define += ' uint32_t fs_page_size;\n'
define += ' uint32_t flash_size_kb;\n'
define += '} flash_map_s;\n'
define += '\n'
define += '/*\n'
define += ' Following definitions map the above structure, one per line.\n'
define += ' FLASH_MAP_* is a user choice in sketch:\n'
define += ' `FLASH_MAP_SETUP_CONFIG(FLASH_MAP_OTA_FS)`\n'
define += ' Configuration is made at boot with detected flash chip size (last argument 512..16384)\n'
define += ' Other values are defined from `tools/boards.txt.py`.\n'
define += '*/\n'
for i in c_flash_map:
define += '\n#define FLASH_MAP_' + i + ' \\\n { \\\n'
for d in c_flash_map[i]:
define += ' { ' + c_flash_map[i][d] + '.flash_size_kb = ' + str(d) + ' }, \\\n'
define += ' }\n'
define += '\n#endif // __FLASH_MAP_H\n'
print(define)
if ldgen:
sys.stdout.close()
sys.stdout = realstdout
print("generated: flash map config file (in cores/esp8266/FlashMap.h)")
return {
'autoflash': {
'.menu.eesz.autoflash': 'Mapping defined by Hardware and Sketch',
'.menu.eesz.autoflash.build.flash_size': '16M',
'.menu.eesz.autoflash.build.flash_ld': 'eagle.flash.auto.ld',
'.menu.eesz.autoflash.build.extra_flags': '-DFLASH_MAP_SUPPORT=1',
'.menu.eesz.autoflash.upload.maximum_size': '1044464',
},
'512K': f512,
'1M': f1m,
'2M': f2m,
@ -1551,7 +1622,7 @@ def led (name, default, ledList):
led = collections.OrderedDict([
('.menu.led.' + str(default), str(default)),
('.menu.led.' + str(default) + '.build.led', '-DLED_BUILTIN=' + str(default)),
]);
])
for i in ledList: # Make range incluside of max (16), since there are really 16 GPIOS not 15
if not i == default:
led.update(
@ -1666,7 +1737,7 @@ def all_boards ():
sortedrequiredfirst = requiredboards + [ item for item in boardlistsortedbydisplayedname if item not in requiredboards ]
for id in sortedrequiredfirst:
if id not in boards:
missingboards += [ id ];
missingboards += [ id ]
continue
print('##############################################################')
@ -1692,6 +1763,8 @@ def all_boards ():
else:
macrolist += speeds[default_speed]
macrolist += [ 'autoflash' ]
for block in macrolist:
for optname in macros[block]:
if not ('opts' in board) or not (optname in board['opts']):