Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-H21 | ESP32-P4 | ESP32-S2 | ESP32-S3 |
---|
Bootloader override
(See the README.md file in the upper level for more information about bootloader examples.)
The purpose of this example is to show how to override the second-stage bootloader from a regular project and make it so that it can load any IDF-based project.
This example will compile two other examples, hello_world
and console
, and embed them in the flash, in their own partition. The goal is to give the user the possibility to choose which image to boot. As such, this example will also compile these two other examples.
A custom partition table is required to manage all the images, please check partitions.csv
.
How to use this example
Simply compile it:
idf.py build
And flash it with the following commands:
idf.py flash
This custom bootloader will clear the monitor and show all the bootable partitions found:
Please select a partition to boot.
FOUND 3 BOOT PARTITIONS:
default
hello_world
console
Note that the names shown in the menu are the names of the projects (set when compiled) and not the partitions names.
It is possible to choose the image to boot using the arrow keys and the enter
to validate.
Manage the bootable images
The bootable images are described in the partitions.csv
file. A factory
partition must be present at all time since it represents the default image to boot.
Any additional image must be stored in its own partition which, of course, must be big enough to store the whole bootable image, be of type app
and have ota_n
, where n
is between 0 and 15 included, as a subtype.
Organization of this example
This project contains an application, in the main
directory that represents a user program that does nothing more than printing a message on the standard output.
It also contains a bootloader_components
directory that, as its name states, contains a component that will override the current bootloader implementation.
Below is a short explanation of the files in the project folder.
├── CMakeLists.txt
│ partitions.csv Custom partition table, containing all the bootable images
├── main
│ ├── CMakeLists.txt
│ └── bootloader_multiboot_example_main.c Example bootable application (always present)
├── bootloader_components
│ └── main
│ ├── CMakeLists.txt
│ └── bootloader_start.c Implementation of the second stage bootloader
└── README.md This is the file you are currently reading
As stated in the README.md
file in the upper level, when the bootloader components are named main
, it overrides the whole second stage bootloader code.
Please note that this example also relies on the hello_world
and console
examples, before building, make sure these two examples have a clean environment and a valid sdkconfig
.