embassy-boot-nrf

Crates

git

Versions

default

Flavors

embassy_boot_nrf

Struct FirmwareUpdater

Source
pub struct FirmwareUpdater<'d, DFU, STATE>
where DFU: NorFlash, STATE: NorFlash,
{ /* private fields */ }
Expand description

FirmwareUpdater is an application API for interacting with the BootLoader without the ability to ‘mess up’ the internal bootloader state

Implementations§

Source§

impl<'d, DFU, STATE> FirmwareUpdater<'d, DFU, STATE>
where DFU: NorFlash, STATE: NorFlash,

Source

pub fn new( config: FirmwareUpdaterConfig<DFU, STATE>, aligned: &'d mut [u8], ) -> FirmwareUpdater<'d, DFU, STATE>

Create a firmware updater instance with partition ranges for the update and state partitions.

Source

pub async fn get_state(&mut self) -> Result<State, FirmwareUpdaterError>

Obtain the current state.

This is useful to check if the bootloader has just done a swap, in order to do verifications and self-tests of the new image before calling mark_booted.

Source

pub async fn hash<D>( &mut self, update_len: u32, chunk_buf: &mut [u8], output: &mut [u8], ) -> Result<(), FirmwareUpdaterError>
where D: Digest,

Verify the update in DFU with any digest.

Source

pub async fn mark_updated(&mut self) -> Result<(), FirmwareUpdaterError>

Mark to trigger firmware swap on next boot.

Source

pub async fn mark_dfu(&mut self) -> Result<(), FirmwareUpdaterError>

Mark to trigger USB DFU on next boot.

Source

pub async fn mark_booted(&mut self) -> Result<(), FirmwareUpdaterError>

Mark firmware boot successful and stop rollback on reset.

Source

pub async fn write_firmware( &mut self, offset: usize, data: &[u8], ) -> Result<(), FirmwareUpdaterError>

Writes firmware data to the device.

This function writes the given data to the firmware area starting at the specified offset. It handles sector erasures and data writes while verifying the device is in a proper state for firmware updates. The function ensures that only unerased sectors are erased before writing and efficiently handles the writing process across sector boundaries and in various configurations (data size, sector size, etc.).

§Arguments
  • offset - The starting offset within the firmware area where data writing should begin.
  • data - A slice of bytes representing the firmware data to be written. It must be a multiple of NorFlash WRITE_SIZE.
§Returns

A Result<(), FirmwareUpdaterError> indicating the success or failure of the write operation.

§Errors

This function will return an error if:

  • The device is not in a proper state to receive firmware updates (e.g., not booted).
  • There is a failure erasing a sector before writing.
  • There is a failure writing data to the device.
Source

pub async fn prepare_update(&mut self) -> Result<&mut DFU, FirmwareUpdaterError>

Prepare for an incoming DFU update by erasing the entire DFU area and returning its Partition.

Using this instead of write_firmware allows for an optimized API in exchange for added complexity.

Auto Trait Implementations§

§

impl<'d, DFU, STATE> Freeze for FirmwareUpdater<'d, DFU, STATE>
where DFU: Freeze, STATE: Freeze,

§

impl<'d, DFU, STATE> RefUnwindSafe for FirmwareUpdater<'d, DFU, STATE>
where DFU: RefUnwindSafe, STATE: RefUnwindSafe,

§

impl<'d, DFU, STATE> Send for FirmwareUpdater<'d, DFU, STATE>
where DFU: Send, STATE: Send,

§

impl<'d, DFU, STATE> Sync for FirmwareUpdater<'d, DFU, STATE>
where DFU: Sync, STATE: Sync,

§

impl<'d, DFU, STATE> Unpin for FirmwareUpdater<'d, DFU, STATE>
where DFU: Unpin, STATE: Unpin,

§

impl<'d, DFU, STATE> !UnwindSafe for FirmwareUpdater<'d, DFU, STATE>

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> Az for T

Source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
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<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

Source§

fn cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> CheckedAs for T

Source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

Source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
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<Src, Dst> LosslessTryInto<Dst> for Src
where Dst: LosslessTryFrom<Src>,

Source§

fn lossless_try_into(self) -> Option<Dst>

Performs the conversion.
Source§

impl<Src, Dst> LossyInto<Dst> for Src
where Dst: LossyFrom<Src>,

Source§

fn lossy_into(self) -> Dst

Performs the conversion.
Source§

impl<T> OverflowingAs for T

Source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

Source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> SaturatingAs for T

Source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

Source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
Source§

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

Source§

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>,

Source§

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.
Source§

impl<T> UnwrappedAs for T

Source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

Source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> WrappingAs for T

Source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

Source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.