Skip to content

Commit

Permalink
esp32: Create .uf2 binaries for S2 and S3 chips.
Browse files Browse the repository at this point in the history
The name of the filesystem partition is updated to support "ffat", as used
by TinyUF2.

Signed-off-by: Damien George <damien@micropython.org>
  • Loading branch information
dpgeorge committed Feb 2, 2022
1 parent 59b6099 commit 71b3ce3
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 4 deletions.
5 changes: 3 additions & 2 deletions ports/esp32/Makefile
Expand Up @@ -36,8 +36,9 @@ all:
$(BUILD)/sdkconfig \
$(BUILD)/bootloader/bootloader.bin \
$(BUILD)/partition_table/partition-table.bin \
$(BUILD)/micropython.bin \
$(BUILD)/firmware.bin
$(BUILD)/micropython.bin \
$(BUILD)/firmware.bin \
$(BUILD)/micropython.uf2

$(BUILD)/bootloader/bootloader.bin $(BUILD)/partition_table/partition-table.bin $(BUILD)/micropython.bin: FORCE

Expand Down
31 changes: 29 additions & 2 deletions ports/esp32/makeimg.py
Expand Up @@ -10,15 +10,29 @@
OFFSET_PARTITIONS_DEFAULT = 0x8000


def load_sdkconfig_hex_value(filename, value, default):
def load_sdkconfig_value(filename, value, default):
value = "CONFIG_" + value + "="
with open(filename, "r") as f:
for line in f:
if line.startswith(value):
return int(line.split("=", 1)[1], 16)
return line.split("=", 1)[1]
return default


def load_sdkconfig_hex_value(filename, value, default):
value = load_sdkconfig_value(filename, value, None)
if value is None:
return default
return int(value, 16)


def load_sdkconfig_str_value(filename, value, default):
value = load_sdkconfig_value(filename, value, None)
if value is None:
return default
return value.strip().strip('"')


def load_partition_table(filename):
with open(filename, "rb") as f:
return gen_esp32part.PartitionTable.from_binary(f.read())
Expand All @@ -30,8 +44,10 @@ def load_partition_table(filename):
arg_partitions_bin = sys.argv[3]
arg_application_bin = sys.argv[4]
arg_output_bin = sys.argv[5]
arg_output_uf2 = sys.argv[6]

# Load required sdkconfig values.
idf_target = load_sdkconfig_str_value(arg_sdkconfig, "IDF_TARGET", "").upper()
offset_bootloader = load_sdkconfig_hex_value(
arg_sdkconfig, "BOOTLOADER_OFFSET_IN_FLASH", OFFSET_BOOTLOADER_DEFAULT
)
Expand Down Expand Up @@ -85,3 +101,14 @@ def load_partition_table(filename):
)
sys.exit(1)
print("%-22s% 8d" % ("total", cur_offset))

# Generate .uf2 file if the SoC has native USB.
if idf_target in ("ESP32S2", "ESP32S3"):
sys.path.append(os.path.join(os.path.dirname(__file__), "../../tools"))
import uf2conv

families = uf2conv.load_families()
uf2conv.appstartaddr = 0
uf2conv.familyid = families[idf_target]
with open(arg_application_bin, "rb") as fin, open(arg_output_uf2, "wb") as fout:
fout.write(uf2conv.convert_to_uf2(fin.read()))
3 changes: 3 additions & 0 deletions ports/esp32/modules/flashbdev.py
@@ -1,4 +1,7 @@
from esp32 import Partition

# MicroPython's partition table uses "vfs", TinyUF2 uses "ffat".
bdev = Partition.find(Partition.TYPE_DATA, label="vfs")
if not bdev:
bdev = Partition.find(Partition.TYPE_DATA, label="ffat")
bdev = bdev[0] if bdev else None

0 comments on commit 71b3ce3

Please sign in to comment.