This is an MCUboot port for Mbed OS.
Note: The following is a general overview. It does not cover MCUboot or Mbed OS basics.
See https://github.com/AGlass0fMilk/mbed-mcuboot-demo as a detailed example.
To use MCUboot, you need to create an Mbed OS project with the following configurations:
"mcuboot.primary-slot-address"
: address of the primary slot in the internal flash"mcuboot.slot-size"
: size of an image slot (only one image, two slots are currently supported)"mcuboot.max-img-sectors"
: maximum number of sectors, should be at least the number of sectors in each slot"target.restrict_size"
: the maximum size of the bootloader, such that it does not overlap with the primary slot
More configurations such as signing algorithm, slot swapping, etc. can be found in mbed_lib.json. Please note that certain features are not currently supported.
You need to provide an instance of mbed::BlockDevice
as the secondary slot. It can be any types of internal or external storage provided that:
- Its size equals the
"mcuboot.slot-size"
you have set - Its minimum supported read and write sizes (granularities) are no larger than 16 byte, which MCUboot's read/write operations are aligned to. If the read size is larger than one byte, you need to set
"mcuboot.read-granularity"
to the read size of the storage - this buffers smaller read operations.
In order for MCUboot to access your secondary slot, the interface to implement is
mbed::BlockDevice* get_secondary_bd(void);
which should return an uninitialized instance of BlockDevice.
To build a bootloader based on MCUboot, make sure "mcuboot.bootloader-build"
is true
(already the default) and you have provided configurations and a secondary slot BlockDevice as explained above.
To build a user application, set "mcuboot.bootloader-build"
to false
so MCUboot is built as a library only without a bootloader application. This is useful if your user application needs to confirm the current image with boot_set_confirmed()
after an update, or set a new image in the secondary slot as pending with boot_set_pending()
in order to trigger an update upon reboot.
As your application starts in the primary slots (instead of the beginning of the whole flash), you need to set the start address ("target.mbed_app_start"
) to be equal to "mcuboot.primary-slot-address"
+ "mcuboot.header-size"
of your bootloader. And its size ("target.mbed_app_size"
) must be no larger than "mcuboot.slot-size"
- "mcuboot.header-size"
, and some space must be left for the image trailer too (see this).