pub struct BootLoaderConfig<ACTIVE, DFU, STATE> {
pub active: ACTIVE,
pub dfu: DFU,
pub state: STATE,
}
Expand description
Bootloader flash configuration holding the three flashes used by the bootloader
If only a single flash is actually used, then that flash should be partitioned into three partitions before use.
The easiest way to do this is to use BootLoaderConfig::from_linkerfile_blocking
which will partition
the provided flash according to symbols defined in the linkerfile.
Fields§
§active: ACTIVE
Flash type used for the active partition - the partition which will be booted from.
dfu: DFU
Flash type used for the dfu partition - the partition which will be swapped in when requested.
state: STATE
Flash type used for the state partition.
Implementations§
Source§impl<'a, ACTIVE, DFU, STATE> BootLoaderConfig<BlockingPartition<'a, NoopRawMutex, ACTIVE>, BlockingPartition<'a, NoopRawMutex, DFU>, BlockingPartition<'a, NoopRawMutex, STATE>>
impl<'a, ACTIVE, DFU, STATE> BootLoaderConfig<BlockingPartition<'a, NoopRawMutex, ACTIVE>, BlockingPartition<'a, NoopRawMutex, DFU>, BlockingPartition<'a, NoopRawMutex, STATE>>
Sourcepub fn from_linkerfile_blocking(
active_flash: &'a Mutex<NoopRawMutex, RefCell<ACTIVE>>,
dfu_flash: &'a Mutex<NoopRawMutex, RefCell<DFU>>,
state_flash: &'a Mutex<NoopRawMutex, RefCell<STATE>>,
) -> BootLoaderConfig<BlockingPartition<'a, NoopRawMutex, ACTIVE>, BlockingPartition<'a, NoopRawMutex, DFU>, BlockingPartition<'a, NoopRawMutex, STATE>>
pub fn from_linkerfile_blocking( active_flash: &'a Mutex<NoopRawMutex, RefCell<ACTIVE>>, dfu_flash: &'a Mutex<NoopRawMutex, RefCell<DFU>>, state_flash: &'a Mutex<NoopRawMutex, RefCell<STATE>>, ) -> BootLoaderConfig<BlockingPartition<'a, NoopRawMutex, ACTIVE>, BlockingPartition<'a, NoopRawMutex, DFU>, BlockingPartition<'a, NoopRawMutex, STATE>>
Constructs a BootLoaderConfig
instance from flash memory and address symbols defined in the linker file.
This method initializes BlockingPartition
instances for the active, DFU (Device Firmware Update),
and state partitions, leveraging start and end addresses specified by the linker. These partitions
are critical for managing firmware updates, application state, and boot operations within the bootloader.
§Parameters
active_flash
: A reference to a mutex-protectedRefCell
for the active partition’s flash interface.dfu_flash
: A reference to a mutex-protectedRefCell
for the DFU partition’s flash interface.state_flash
: A reference to a mutex-protectedRefCell
for the state partition’s flash interface.
§Safety
The method contains unsafe
blocks for dereferencing raw pointers that represent the start and end addresses
of the bootloader’s partitions in flash memory. It is crucial that these addresses are accurately defined
in the memory.x file to prevent undefined behavior.
The caller must ensure that the memory regions defined by these symbols are valid and that the flash memory interfaces provided are compatible with these regions.
§Returns
A BootLoaderConfig
instance with BlockingPartition
instances for the active, DFU, and state partitions.
§Example
// Assume `active_flash`, `dfu_flash`, and `state_flash` all share the same flash memory interface.
let layout = Flash::new_blocking(p.FLASH).into_blocking_regions();
let flash = Mutex::new(RefCell::new(layout.bank1_region));
let config = BootLoaderConfig::from_linkerfile_blocking(&flash, &flash, &flash);
// `config` can now be used to create a `BootLoader` instance for managing boot operations.
Working examples can be found in the bootloader examples folder.