From 4d40e55edf666feee214f5f11a34acd839a1d2fe Mon Sep 17 00:00:00 2001 From: iosabi Date: Sun, 11 Apr 2021 02:37:56 +0200 Subject: [PATCH] esptool: Allow to pass the partition table CSV. The partition table of the device in the esp8266 and esp32 based boards was set to a default table with one "factory" partition with exactly the size of the compiled firmware. This is problematic if we want to update the device on the field. This patch allows to set the `PARTITION_TABLE_CSV` variable from the Makefile to a .csv file with a custom partition table, for example this could be set to a partition table with two ota entries, or with a single factory entry but of a known fixed size. --- makefiles/tools/esptool.inc.mk | 47 ++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/makefiles/tools/esptool.inc.mk b/makefiles/tools/esptool.inc.mk index a863cb845f..566797fc4b 100644 --- a/makefiles/tools/esptool.inc.mk +++ b/makefiles/tools/esptool.inc.mk @@ -9,11 +9,18 @@ BOOTLOADER_BIN = bootloader$(BOOTLOADER_COLOR)$(BOOTLOADER_INFO).bin ESPTOOL ?= $(RIOTTOOLS)/esptool/esptool.py -# The ELFFILE is the base one used for flashing -FLASHFILE ?= $(ELFFILE) +# The ELFFILE is defined by default in $(RIOTBASE)/Makefile.include but only +# after the $(PROGRAMMER).inc.mk file is included, so we need ELFFILE defined +# earlier. This is used to create new make rules in this file (based on +# FLASHFILE) and can't be deferred. +ELFFILE ?= $(BINDIR)/$(APPLICATION).elf +FLASHFILE ?= $(ELFFILE).bin -# Convert .elf to .bin before flashing -FLASHDEPS += esp-image-convert +# Convert .elf and .csv to .bin files at build time, but make them available for +# tests at flash time. These can't be added to FLASHDEPS because they depend on +# on ELFFILE and would trigger a rebuild with "flash-only". +BUILD_FILES += $(FLASHFILE) $(BINDIR)/partitions.bin +TEST_EXTRA_FILES += $(FLASHFILE) $(BINDIR)/partitions.bin # flasher configuration ifneq (,$(filter esp_qemu,$(USEMODULE))) @@ -28,22 +35,30 @@ else FFLAGS += --flash_mode $(FLASH_MODE) --flash_freq $(FLASH_FREQ) FFLAGS += $(BOOTLOADER_POS) $(RIOTCPU)/$(CPU)/bin/$(BOOTLOADER_BIN) FFLAGS += 0x8000 $(BINDIR)/partitions.bin - FFLAGS += 0x10000 $(FLASHFILE).bin + FFLAGS += 0x10000 $(FLASHFILE) endif -.PHONY: esp-image-convert esp-qemu -# prepare image to flash: convert .elf to .bin -esp-image-convert: +# This is the binary that ends up programmed in the flash. +$(ELFFILE).bin: $(ELFFILE) $(Q)$(ESPTOOL) --chip $(FLASH_CHIP) elf2image --flash_mode $(FLASH_MODE) \ --flash_size $(FLASH_SIZE)MB --flash_freq $(FLASH_FREQ) $(FLASH_OPTS) \ - -o $(FLASHFILE).bin $(FLASHFILE) + -o $@ $< + +# Default partition table with no OTA. Can be replaced with a custom partition +# table setting PARTITION_TABLE_CSV. +PARTITION_TABLE_CSV ?= $(BINDIR)/partitions.csv + +$(BINDIR)/partitions.csv: $(FLASHFILE) $(Q)printf "\n" > $(BINDIR)/partitions.csv - $(Q)printf "nvs, data, nvs, 0x9000, 0x6000\n" >> $(BINDIR)/partitions.csv - $(Q)printf "phy_init, data, phy, 0xf000, 0x1000\n" >> $(BINDIR)/partitions.csv - $(Q)printf "factory, app, factory, 0x10000, " >> $(BINDIR)/partitions.csv - $(Q)ls -l $(FLASHFILE).bin | awk '{ print $$5 }' >> $(BINDIR)/partitions.csv - $(Q)python3 $(RIOTTOOLS)/esptool/gen_esp32part.py --verify \ - $(BINDIR)/partitions.csv $(BINDIR)/partitions.bin + $(Q)printf "nvs, data, nvs, 0x9000, 0x6000\n" >> $@ + $(Q)printf "phy_init, data, phy, 0xf000, 0x1000\n" >> $@ + $(Q)printf "factory, app, factory, 0x10000, " >> $@ + $(Q)ls -l $< | awk '{ print $$5 }' >> $@ + +$(BINDIR)/partitions.bin: $(PARTITION_TABLE_CSV) + $(Q)python3 $(RIOTTOOLS)/esptool/gen_esp32part.py --verify $< $@ + +.PHONY: esp-qemu esp-qemu: $(Q)dd if=/dev/zero bs=1M count=$(FLASH_SIZE) | \ @@ -53,7 +68,7 @@ esp-qemu: head -c $$((0x8000)) | \ cat - $(BINDIR)/partitions.bin tmp.bin | \ head -c $$((0x10000)) | \ - cat - $(FLASHFILE).bin tmp.bin | \ + cat - $(FLASHFILE) tmp.bin | \ head -c $(FLASH_SIZE)MB > $(BINDIR)/$(CPU)flash.bin && rm tmp.bin ifeq (esp32,$(CPU_FAM)) $(Q)cp $(RIOTCPU)/$(CPU)/bin/rom_0x3ff90000_0x00010000.bin $(BINDIR)/rom1.bin