mirror of https://github.com/arendst/Tasmota.git
Resize FS to max at initial boot
This commit is contained in:
parent
2523a29da3
commit
5e03066883
|
@ -506,6 +506,105 @@ class Partition
|
||||||
self.otadata.save()
|
self.otadata.save()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Internal: returns which flash sector contains the partition definition
|
||||||
|
# Returns 0 or 1, or `nil` if something went wrong
|
||||||
|
# Note: partition flash sector vary from ESP32 to ESP32C3/S3
|
||||||
|
static def get_flash_definition_sector()
|
||||||
|
import flash
|
||||||
|
for i:0..1
|
||||||
|
var offset = i * 0x1000
|
||||||
|
if flash.read(offset, 1) == bytes('E9') return offset end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: returns the maximum flash size possible
|
||||||
|
# Returns max flash size ok kB
|
||||||
|
def get_max_flash_size_k()
|
||||||
|
var flash_size_k = tasmota.memory()['flash']
|
||||||
|
var flash_size_real_k = tasmota.memory().find("flash_real", flash_size_k)
|
||||||
|
if (flash_size_k != flash_size_real_k) && self.get_flash_definition_sector() != nil
|
||||||
|
flash_size_k = flash_size_real_k # try to expand the flash size definition
|
||||||
|
end
|
||||||
|
return flash_size_k
|
||||||
|
end
|
||||||
|
|
||||||
|
# Internal: returns the unallocated flash size (in kB) beyond the file-system
|
||||||
|
# this indicates that the file-system can be extended (although erased at the same time)
|
||||||
|
def get_unallocated_k()
|
||||||
|
var last_slot = self.slots[-1]
|
||||||
|
if last_slot.is_spiffs()
|
||||||
|
# verify that last slot is filesystem
|
||||||
|
var flash_size_k = self.get_max_flash_size_k()
|
||||||
|
var partition_end_k = (last_slot.start + last_slot.sz) / 1024 # last kb used for fs
|
||||||
|
if partition_end_k < flash_size_k
|
||||||
|
return flash_size_k - partition_end_k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
#- ---------------------------------------------------------------------- -#
|
||||||
|
#- Resize flash definition if needed
|
||||||
|
#- ---------------------------------------------------------------------- -#
|
||||||
|
def resize_max_flash_size_k()
|
||||||
|
var flash_size_k = tasmota.memory()['flash']
|
||||||
|
var flash_size_real_k = tasmota.memory().find("flash_real", flash_size_k)
|
||||||
|
var flash_definition_sector = self.get_flash_definition_sector()
|
||||||
|
if (flash_size_k != flash_size_real_k) && flash_definition_sector != nil
|
||||||
|
import flash
|
||||||
|
import string
|
||||||
|
|
||||||
|
flash_size_k = flash_size_real_k # try to expand the flash size definition
|
||||||
|
|
||||||
|
var flash_def = flash.read(flash_definition_sector, 4)
|
||||||
|
var size_before = flash_def[3]
|
||||||
|
|
||||||
|
var flash_size_code
|
||||||
|
var flash_size_real_m = flash_size_real_k / 1024 # size in MB
|
||||||
|
if flash_size_real_m == 1 flash_size_code = 0x00
|
||||||
|
elif flash_size_real_m == 2 flash_size_code = 0x10
|
||||||
|
elif flash_size_real_m == 4 flash_size_code = 0x20
|
||||||
|
elif flash_size_real_m == 8 flash_size_code = 0x30
|
||||||
|
elif flash_size_real_m == 16 flash_size_code = 0x40
|
||||||
|
end
|
||||||
|
|
||||||
|
if flash_size_code != nil
|
||||||
|
# apply the update
|
||||||
|
var old_def = flash_def[3]
|
||||||
|
flash_def[3] = (flash_def[3] & 0x0F) | flash_size_code
|
||||||
|
flash.write(flash_definition_sector, flash_def)
|
||||||
|
tasmota.log(string.format("UPL: changing flash definition from 0x02X to 0x%02X", old_def, flash_def[3]), 3)
|
||||||
|
else
|
||||||
|
raise "internal_error", "wrong flash size "+str(flash_size_real_m)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called at first boot
|
||||||
|
# Try to expand FS to max of flash size
|
||||||
|
def resize_fs_to_max()
|
||||||
|
import string
|
||||||
|
try
|
||||||
|
var unallocated = self.get_unallocated_k()
|
||||||
|
if unallocated <= 0 return nil end
|
||||||
|
|
||||||
|
tasmota.log(string.format("BRY: Trying to expand FS by %i kB", unallocated), 2)
|
||||||
|
|
||||||
|
self.resize_max_flash_size_k() # resize if needed
|
||||||
|
# since unallocated succeeded, we know the last slot is FS
|
||||||
|
var fs_slot = self.slots[-1]
|
||||||
|
fs_slot.sz += unallocated * 1024
|
||||||
|
self.save()
|
||||||
|
self.invalidate_spiffs() # erase SPIFFS or data is corrupt
|
||||||
|
|
||||||
|
# restart
|
||||||
|
tasmota.global.restart_flag = 2
|
||||||
|
tasmota.log("BRY: Successfully resized FS, restarting", 2)
|
||||||
|
except .. as e, m
|
||||||
|
tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
#- invalidate SPIFFS partition to force format at next boot -#
|
#- invalidate SPIFFS partition to force format at next boot -#
|
||||||
#- we simply erase the first byte of the first 2 blocks in the SPIFFS partition -#
|
#- we simply erase the first byte of the first 2 blocks in the SPIFFS partition -#
|
||||||
def invalidate_spiffs()
|
def invalidate_spiffs()
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -43,6 +43,14 @@ const char berry_prog[] =
|
||||||
"def log(m,l) tasmota.log(m,l) end "
|
"def log(m,l) tasmota.log(m,l) end "
|
||||||
"def load(f) return tasmota.load(f) end "
|
"def load(f) return tasmota.load(f) end "
|
||||||
|
|
||||||
|
// try to resize FS to max at first boot
|
||||||
|
// "tasmota.log('>>> bootcount=' + str(tasmota.settings.bootcount), 2) "
|
||||||
|
"if tasmota.settings.bootcount == 0 "
|
||||||
|
"import partition_core "
|
||||||
|
"var p = partition_core.Partition() "
|
||||||
|
"p.resize_fs_to_max() "
|
||||||
|
"end "
|
||||||
|
|
||||||
#ifdef USE_AUTOCONF
|
#ifdef USE_AUTOCONF
|
||||||
// autoconf
|
// autoconf
|
||||||
"import autoconf "
|
"import autoconf "
|
||||||
|
|
Loading…
Reference in New Issue