]> granicus.if.org Git - esp-idf/commitdiff
partition_table: Check configured flash size fits in partition table
authorAngus Gratton <angus@espressif.com>
Fri, 20 Apr 2018 06:57:15 +0000 (16:57 +1000)
committerAngus Gratton <gus@projectgus.com>
Wed, 25 Apr 2018 23:51:55 +0000 (09:51 +1000)
Check happens at build time, so flash size config may need to be changed.

Also fixes MD5_OPT undefined warning, closes https://github.com/espressif/esp-idf/issues/1867

components/partition_table/Makefile.projbuild
components/partition_table/gen_esp32part.py
examples/storage/wear_levelling/sdkconfig.defaults
examples/system/console/sdkconfig.defaults
tools/ci/test_build_system.sh

index d1b7acdaa9408bef7fcacb80e547a71ab263eef1..339b0afc21c0f2fb568c6eb9a9879bb9b3cfd0b8 100644 (file)
@@ -8,12 +8,20 @@
 #
 .PHONY: partition_table partition_table-flash partition_table-clean
 
+MD5_OPT :=
 ifneq ("$(CONFIG_PARTITION_TABLE_MD5)", "y")
-MD5_OPT ?= "--disable-md5sum"
+MD5_OPT := "--disable-md5sum"
 endif
 
-# NB: gen_esp32part.py lives in the sdk/bin/ dir not component dir
-GEN_ESP32PART := $(PYTHON) $(COMPONENT_PATH)/gen_esp32part.py -q $(MD5_OPT)
+FLASHSIZE_OPT :=
+ifneq ("$(CONFIG_ESPTOOLPY_FLASHSIZE)", "")
+FLASHSIZE_OPT := --flash-size $(CONFIG_ESPTOOLPY_FLASHSIZE)
+endif
+
+GEN_ESP32PART := $(PYTHON) $(COMPONENT_PATH)/gen_esp32part.py -q $(MD5_OPT) $(FLASHSIZE_OPT)
+
+undefine FLASHSIZE_OPT  # we don't need these any more, so take them out of global scope
+undefine MD5_OPT
 
 # Has a matching value in bootloader_support esp_flash_partitions.h
 PARTITION_TABLE_OFFSET := 0x8000
index a8607f360ccd56af55f37148d2de3f56b921384b..275976b741f0897d4b5dafeb98e3f1ce7ac1bfb0 100755 (executable)
@@ -114,6 +114,16 @@ class PartitionTable(list):
                 raise InputError("Partition at 0x%x overlaps 0x%x-0x%x" % (p.offset, last.offset, last.offset+last.size-1))
             last = p
 
+    def flash_size(self):
+        """ Return the size that partitions will occupy in flash
+            (ie the offset the last partition ends at)
+        """
+        try:
+            last = sorted(self, reverse=True)[0]
+        except IndexError:
+            return 0  # empty table!
+        return last.offset + last.size
+
     @classmethod
     def from_binary(cls, b):
         md5 = hashlib.md5();
@@ -350,6 +360,8 @@ def main():
     global md5sum
     parser = argparse.ArgumentParser(description='ESP32 partition table utility')
 
+    parser.add_argument('--flash-size', help='Optional flash size limit, checks partition table fits in flash',
+                        nargs='?', choices=[ '1MB', '2MB', '4MB', '8MB', '16MB' ])
     parser.add_argument('--disable-md5sum', help='Disable md5 checksum for the partition table', default=False, action='store_true')
     parser.add_argument('--verify', '-v', help='Verify partition table fields', default=True, action='store_false')
     parser.add_argument('--quiet', '-q', help="Don't print status messages to stderr", action='store_true')
@@ -377,6 +389,14 @@ def main():
         status("Verifying table...")
         table.verify()
 
+    if args.flash_size:
+        size_mb = int(args.flash_size.replace("MB", ""))
+        size = size_mb * 1024 * 1024  # flash memory uses honest megabytes!
+        table_size = table.flash_size()
+        if size < table_size:
+            raise InputError("Partitions defined in '%s' occupy %.1fMB of flash (%d bytes) which does not fit in configured flash size %dMB. Change the flash size in menuconfig under the 'Serial Flasher Config' menu." %
+                             (args.input.name, table_size / 1024.0 / 1024.0, table_size, size_mb))
+
     if input_is_binary:
         output = table.to_csv()
         with sys.stdout if args.output == '-' else open(args.output, 'w') as f:
index f30f322c623fa73971a2bedc9e19e3f28468255a..b09d670fdbaea3d54a7401714091eaf52ce3e6f5 100644 (file)
@@ -3,3 +3,4 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv"
 CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000
 CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv"
 CONFIG_APP_OFFSET=0x10000
+CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
index cb3bc34517067222c1dc5ddb7948cfaa645ee10a..ebec830649903377ac218d628aec021e9e324d26 100644 (file)
@@ -15,3 +15,6 @@ CONFIG_APP_OFFSET=0x10000
 # Enable FreeRTOS stats formatting functions, needed for 'tasks' command
 CONFIG_FREERTOS_USE_TRACE_FACILITY=y
 CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y
+
+CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
+
index b654d5a7d5904779c40a191e43422a16b04306cd..e5ae4ea9f30bbce14e8e5d2fc660b89d9e2754fe 100755 (executable)
@@ -226,6 +226,14 @@ function run_tests()
     [ -f ${IDF_PATH}/.gitmodules_backup ] && mv ${IDF_PATH}/.gitmodules_backup ${IDF_PATH}/.gitmodules
     export PATH=$OLD_PATH
 
+    print_status "Build fails if partitions don't fit in flash"
+    cp sdkconfig sdkconfig.bak
+    sed -i "s/CONFIG_ESPTOOLPY_FLASHSIZE.\+//" sdkconfig  # remove all flashsize config
+    echo "CONFIG_ESPTOOLPY_FLASHSIZE_1MB=y" >> sdkconfig     # introduce undersize flash
+    make defconfig || failure "Failed to reconfigure with smaller flash"
+    ( make 2>&1 | grep "does not fit in configured flash size 1MB" ) || failure "Build didn't fail with expected flash size failure message"
+    mv sdkconfig.bak sdkconfig
+
     print_status "All tests completed"
     if [ -n "${FAILURES}" ]; then
         echo "Some failures were detected:"