Embassy
embassy-boot

Crates

git

Versions

default

Flavors

pub struct FirmwareUpdaterConfig<DFU, STATE> {
    pub dfu: DFU,
    pub state: STATE,
}
Expand description

Firmware updater flash configuration holding the two flashes used by the updater

If only a single flash is actually used, then that flash should be partitioned into two partitions before use. The easiest way to do this is to use FirmwareUpdaterConfig::from_linkerfile_blocking or FirmwareUpdaterConfig::from_linkerfile_blocking which will partition the provided flash according to symbols defined in the linkerfile.

Fields§

§dfu: DFU

The dfu flash partition

§state: STATE

The state flash partition

Implementations§

source§

impl<'a, DFU: NorFlash, STATE: NorFlash> FirmwareUpdaterConfig<Partition<'a, NoopRawMutex, DFU>, Partition<'a, NoopRawMutex, STATE>>

source

pub fn from_linkerfile( dfu_flash: &'a Mutex<NoopRawMutex, DFU>, state_flash: &'a Mutex<NoopRawMutex, STATE> ) -> Self

Create a firmware updater config from the flash and address symbols defined in the linkerfile

source§

impl<'a, DFU: NorFlash, STATE: NorFlash> FirmwareUpdaterConfig<BlockingPartition<'a, NoopRawMutex, DFU>, BlockingPartition<'a, NoopRawMutex, STATE>>

source

pub fn from_linkerfile_blocking( dfu_flash: &'a Mutex<NoopRawMutex, RefCell<DFU>>, state_flash: &'a Mutex<NoopRawMutex, RefCell<STATE>> ) -> Self

Constructs a FirmwareUpdaterConfig instance from flash memory and address symbols defined in the linker file.

This method initializes BlockingPartition instances for the 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
  • dfu_flash: A reference to a mutex-protected RefCell for the DFU partition’s flash interface.
  • state_flash: A reference to a mutex-protected RefCell 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 FirmwareUpdaterConfig instance with BlockingPartition instances for the DFU, and state partitions.

§Example
// Assume `dfu_flash`, and `state_flash` 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 = FirmwareUpdaterConfig::from_linkerfile_blocking(&flash, &flash);
// `config` can now be used to create a `FirmwareUpdater` instance for managing boot operations.

Working examples can be found in the bootloader examples folder.

Auto Trait Implementations§

§

impl<DFU, STATE> Freeze for FirmwareUpdaterConfig<DFU, STATE>
where DFU: Freeze, STATE: Freeze,

§

impl<DFU, STATE> RefUnwindSafe for FirmwareUpdaterConfig<DFU, STATE>
where DFU: RefUnwindSafe, STATE: RefUnwindSafe,

§

impl<DFU, STATE> Send for FirmwareUpdaterConfig<DFU, STATE>
where DFU: Send, STATE: Send,

§

impl<DFU, STATE> Sync for FirmwareUpdaterConfig<DFU, STATE>
where DFU: Sync, STATE: Sync,

§

impl<DFU, STATE> Unpin for FirmwareUpdaterConfig<DFU, STATE>
where DFU: Unpin, STATE: Unpin,

§

impl<DFU, STATE> UnwindSafe for FirmwareUpdaterConfig<DFU, STATE>
where DFU: UnwindSafe, STATE: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.