SpiFlash

Struct SpiFlash 

Source
pub struct SpiFlash<'a> { /* private fields */ }
Expand description

Accessor for the W25Q80BV SPI Flash in the HackRF.

⚠️ WARNING: This allows for directly manipulating the SPI flash, which is a great way to brick your HackRF and require recovering through DFU mode.

The general write procedure is to erase the flash, write all bytes to it starting from address 0, then verify by reading the flash to verify a successful write. As long as you don’t depower it after a flash operation, a failed write attempt can potentially be repeated, as it appears the HackRF only accesses flash during initial boot and configuration.

Implementations§

Source§

impl SpiFlash<'_>

Source

pub async fn erase(&self) -> Result<(), Error>

Erase the entire flash memory.

Should be immediately followed by writing a new image, or the HackRF will be soft-bricked (but recoverable by DFU).

Source

pub async fn write(&self, addr: u32, data: &[u8]) -> Result<(), Error>

Write firmware to the flash memory.

Should only be used for firmware image writing, and needs to be preceeded by an erase command before doing a write sequence.

Writes can be up to the max size of the memory; this command will split them into sub-commands if needed.

Source

pub async fn read(&self, addr: u32, len: usize) -> Result<Vec<u8>, Error>

Read from the flash memory.

This should only be used for firmware verification.

Reads can be up to the max size of the memory; this command will split them into sub-commands if needed.

Source

pub async fn status(&self) -> Result<[u8; 2], Error>

Get the status registers of the W25Q80BV flash memory.

Requires API version 0x0103 or higher.

Source

pub async fn clear_status(&self) -> Result<(), Error>

Clear the status registers of the W25Q80BV flash memory.

Auto Trait Implementations§

§

impl<'a> Freeze for SpiFlash<'a>

§

impl<'a> !RefUnwindSafe for SpiFlash<'a>

§

impl<'a> Send for SpiFlash<'a>

§

impl<'a> Sync for SpiFlash<'a>

§

impl<'a> Unpin for SpiFlash<'a>

§

impl<'a> !UnwindSafe for SpiFlash<'a>

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