diff --git a/builder/main.py b/builder/main.py index 0c97670..1c8f997 100644 --- a/builder/main.py +++ b/builder/main.py @@ -144,12 +144,27 @@ def _update_max_upload_size(env): if p["type"] in ("0", "app") } - # One of the `factory` or `ota_0` partitions is used to determine available memory - # size. If both partitions are set, we should prefer the `factory`, but there are - # cases (e.g. Adafruit's `partitions-4MB-tinyuf2.csv`) that uses the `factory` - # partition for their UF2 bootloader. So let's use the first match + partitions = {p["name"]: p for p in _parse_partitions(env)} + + # User-specified partition name has the highest priority + custom_app_partition_name = board.get("build.app_partition_name", "") + if custom_app_partition_name: + selected_partition = partitions.get(custom_app_partition_name, {}) + if selected_partition: + board.update("upload.maximum_size", _parse_size(selected_partition["size"])) + return + else: + print( + "Warning! Selected partition `%s` is not available in the partition " \ + "table! Default partition will be used!" % custom_app_partition_name + ) + + # Otherwise, one of the `factory` or `ota_0` partitions is used to determine + # available memory size. If both partitions are set, we should prefer the `factory`, + # but there are cases (e.g. Adafruit's `partitions-4MB-tinyuf2.csv`) that uses the + # `factory` partition for their UF2 bootloader. So let's use the first match # https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#subtype - for p in _parse_partitions(env): + for p in partitions.values(): if p["type"] in ("0", "app") and p["subtype"] in ("factory", "ota_0"): board.update("upload.maximum_size", _parse_size(p["size"])) break