Ich habe das mal ausprobiert, weil es mich interessiert hat.
Mein Beispiel bezieht sich aber auf die Micropython-Firmware, die hinten dran noch eine Partition erstellt, auf der die Programme gespeichert werden. D.h. dort darf man auch nichts überschreiben.
Um mir Zeit zu sparen, habe ich einen ESP32S3 mit 16 MiB SPIFLASH verwendet, aber nur eine Firmware geflasht, die insgesamt 4 MiB belegt. Also 2 MiB Firmware + 2 MiB Partition.
Anstatt die Firmware zu verändern, flasht man einfach die Daten beim entsprechenden Offset. Ich habe z.B. einen Offset von 5 MiB gewählt, was in hexadezimaler Schreibweise folgendes ergibt: 0x500000
Geschrieben habe ich die Datei lokal auf dem PC mit diesem Script:
Code: Alles auswählen
from pathlib import Path
def write_data(file, *str_values, fixed_size=16):
with file.open("wb") as fd:
for str_value in str_values:
data = bytearray(fixed_size)
raw_value = str_value.encode("utf8")
data[0: len(raw_value)] = raw_value
fd.write(data)
data_file = Path.home().joinpath("Desktop", "data.bin")
write_data(
data_file,
"123",
"456",
"789",
"abc",
"def",
)
Befehl zum Flashen der Datei (unter Windows):
Code: Alles auswählen
py -m esptool --port COM3 --baud 460800 write_flash 0x500000 .\Desktop\data.bin
Der Code auf dem ESP32S3 (Micropython):
Code: Alles auswählen
import esp
# muss noch in den SPIFLASH passen,
# darf aber nicht die Firmware oder eine Partition überschreiben
# Ich habe z.B. einen ESP32S3 damit getestet
# Der hat 16 MiB SPIFLASH.
# Als Firmware habe ich eine fertige Variante genommen, die nur eine 2 MiB Partition anlegt.
# Die Firmware selbst befindet sich im ersten 2 MiB-Segment.
# D.h. ich muss die Daten nach einem Offset von 4 MiB schreiben
magic_offset = 0x500000
data = bytearray(80)
esp.flash_read(magic_offset, data)
wifi_ssid = bytes(data[0:16].rstrip(b"\0"))
wifi_password = bytes(data[16:32].rstrip(b"\0"))
cloud_id = bytes(data[32:48].rstrip(b"\0"))
cloud_user = bytes(data[48:64].rstrip(b"\0"))
cloud_password = bytes(data[64:80].rstrip(b"\0"))
print("Data:", data)
print()
print("SSID:", wifi_ssid)
print("Passwort:", wifi_password)
print("ID:", cloud_id)
print("Klaut User:", cloud_user)
print("Klaut Password", cloud_password)
Ich vermute, dass Nullbytes die tatsächliche Länge des Strings bestimmen. Die SSID muss maximal 8 Zeichen lang sein. Eine SSID darf maximal 32 Zeichen lang sein.
Ausgabe:
MPY: soft reboot
Data: bytearray(b'123\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00456\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00789\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00abc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00def\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
SSID: b'123'
Passwort: b'456'
ID: b'789'
Klaut User: b'abc'
Klaut Password b'def'
MicroPython v1.24.0-preview.66.gf60c71d13 on 2024-06-25; Generic ESP32S3 module with Octal-SPIRAM with ESP32S3
Type "help()" for more information.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server