Struct opentitanlib::spiflash::flash::SpiFlash
source · pub struct SpiFlash {
pub size: u32,
pub program_size: u32,
pub address_mode: AddressMode,
pub read_mode: ReadMode,
pub erase_mode: EraseMode,
pub sfdp: Option<Sfdp>,
pub read_type: ReadTypes,
pub erase: Vec<SectorErase>,
}
Fields§
§size: u32
§program_size: u32
§address_mode: AddressMode
§read_mode: ReadMode
§erase_mode: EraseMode
§sfdp: Option<Sfdp>
§read_type: ReadTypes
§erase: Vec<SectorErase>
Implementations§
source§impl SpiFlash
impl SpiFlash
pub const READ: u8 = 3u8
pub const FAST_READ: u8 = 11u8
pub const FAST_DUAL_READ: u8 = 59u8
pub const FAST_QUAD_READ: u8 = 107u8
pub const READ_4B: u8 = 19u8
pub const FAST_READ_4B: u8 = 12u8
pub const FAST_DUAL_READ_4B: u8 = 60u8
pub const FAST_QUAD_READ_4B: u8 = 108u8
pub const PAGE_PROGRAM: u8 = 2u8
pub const SECTOR_ERASE: u8 = 32u8
pub const BLOCK_ERASE_32K: u8 = 82u8
pub const BLOCK_ERASE_64K: u8 = 216u8
pub const SECTOR_ERASE_4B: u8 = 33u8
pub const BLOCK_ERASE_32K_4B: u8 = 92u8
pub const BLOCK_ERASE_64K_4B: u8 = 220u8
pub const CHIP_ERASE: u8 = 199u8
pub const WRITE_ENABLE: u8 = 6u8
pub const WRITE_DISABLE: u8 = 4u8
pub const READ_STATUS: u8 = 5u8
pub const READ_STATUS2: u8 = 53u8
pub const READ_STATUS3: u8 = 21u8
pub const WRITE_STATUS: u8 = 1u8
pub const WRITE_STATUS2: u8 = 49u8
pub const WRITE_STATUS3: u8 = 17u8
pub const READ_ID: u8 = 159u8
pub const ENTER_4B: u8 = 183u8
pub const EXIT_4B: u8 = 233u8
pub const READ_SFDP: u8 = 90u8
pub const NOP: u8 = 0u8
pub const RESET_ENABLE: u8 = 102u8
pub const RESET: u8 = 153u8
sourcepub const LEGACY_PAGE_SIZE: u32 = 256u32
pub const LEGACY_PAGE_SIZE: u32 = 256u32
The legacy JEDEC page size for programming operations is 256 bytes.
sourcepub const STATUS_WIP: u8 = 1u8
pub const STATUS_WIP: u8 = 1u8
Status register bits:
The WIP
bit indicates a write in progress (sometimes called the busy bit).
sourcepub const STATUS_WEL: u8 = 2u8
pub const STATUS_WEL: u8 = 2u8
The WEL
bit is the write enable latch.
sourcepub fn read_jedec_id(spi: &dyn Target, length: usize) -> Result<Vec<u8>>
pub fn read_jedec_id(spi: &dyn Target, length: usize) -> Result<Vec<u8>>
Read length
bytes of the JEDEC ID from the spi
target.
sourcepub fn read_status(spi: &dyn Target) -> Result<u8>
pub fn read_status(spi: &dyn Target) -> Result<u8>
Read status register from the spi
target.
sourcepub fn read_status_ex(spi: &dyn Target, seq: Option<&[u8]>) -> Result<u32>
pub fn read_status_ex(spi: &dyn Target, seq: Option<&[u8]>) -> Result<u32>
Read the extended status register from the spi
target.
sourcepub fn wait_for_busy_clear(spi: &dyn Target) -> Result<()>
pub fn wait_for_busy_clear(spi: &dyn Target) -> Result<()>
Poll the status register waiting for the busy bit to clear.
sourcepub fn set_write_enable(spi: &dyn Target) -> Result<()>
pub fn set_write_enable(spi: &dyn Target) -> Result<()>
Send the WRITE_ENABLE opcode to the spi
target.
sourcepub fn set_write_disable(spi: &dyn Target) -> Result<()>
pub fn set_write_disable(spi: &dyn Target) -> Result<()>
Send the WRITE_DISABLE opcode to the spi
target.
sourcepub fn read_sfdp(spi: &dyn Target) -> Result<Sfdp>
pub fn read_sfdp(spi: &dyn Target) -> Result<Sfdp>
Read and parse the SFDP table from the spi
target.
sourcepub fn from_spi(spi: &dyn Target) -> Result<Self>
pub fn from_spi(spi: &dyn Target) -> Result<Self>
Create a new SpiFlash
instance by reading an SFDP table from the spi
Target.
sourcepub fn set_address_mode(
&mut self,
spi: &dyn Target,
mode: AddressMode
) -> Result<()>
pub fn set_address_mode( &mut self, spi: &dyn Target, mode: AddressMode ) -> Result<()>
Set the SPI flash addressing mode to either 3b or 4b mode.
sourcepub fn set_address_mode_auto(&mut self, spi: &dyn Target) -> Result<()>
pub fn set_address_mode_auto(&mut self, spi: &dyn Target) -> Result<()>
Automatically set the addressing mode based on the size of the SPI flash.
sourcepub fn read(
&self,
spi: &dyn Target,
address: u32,
buffer: &mut [u8]
) -> Result<&Self>
pub fn read( &self, spi: &dyn Target, address: u32, buffer: &mut [u8] ) -> Result<&Self>
Read into buffer
from the SPI flash starting at address
.
sourcepub fn read_with_progress(
&self,
spi: &dyn Target,
address: u32,
buffer: &mut [u8],
progress: &dyn ProgressIndicator,
use_4b_opcodes: bool
) -> Result<&Self>
pub fn read_with_progress( &self, spi: &dyn Target, address: u32, buffer: &mut [u8], progress: &dyn ProgressIndicator, use_4b_opcodes: bool ) -> Result<&Self>
Read into buffer
from the SPI flash starting at address
.
The progress
callback will be invoked after each chunk of the read operation.
sourcepub fn chip_erase(&self, spi: &dyn Target) -> Result<&Self>
pub fn chip_erase(&self, spi: &dyn Target) -> Result<&Self>
Erase the entire EEPROM via the CHIP_ERASE opcode.
sourcepub fn erase(
&self,
spi: &dyn Target,
address: u32,
length: u32
) -> Result<&Self>
pub fn erase( &self, spi: &dyn Target, address: u32, length: u32 ) -> Result<&Self>
Erase a segment of the SPI flash starting at address
for length
bytes.
The address and length must be sector aligned.
sourcepub fn erase_with_progress(
&self,
spi: &dyn Target,
address: u32,
length: u32,
progress: &dyn ProgressIndicator
) -> Result<&Self>
pub fn erase_with_progress( &self, spi: &dyn Target, address: u32, length: u32, progress: &dyn ProgressIndicator ) -> Result<&Self>
Erase a segment of the SPI flash starting at address
for length
bytes.
The address and length must be sector aligned.
The progress
callback will be invoked after each chunk of the erase operation.
sourcepub fn program(
&self,
spi: &dyn Target,
address: u32,
buffer: &[u8]
) -> Result<&Self>
pub fn program( &self, spi: &dyn Target, address: u32, buffer: &[u8] ) -> Result<&Self>
Program a segment of the SPI flash starting at address
with the contents of buffer
.
The address and buffer length may be arbitrary. This function will not
erase the segment first.
sourcepub fn program_with_progress(
&self,
spi: &dyn Target,
address: u32,
buffer: &[u8],
progress: &dyn ProgressIndicator
) -> Result<&Self>
pub fn program_with_progress( &self, spi: &dyn Target, address: u32, buffer: &[u8], progress: &dyn ProgressIndicator ) -> Result<&Self>
Program a segment of the SPI flash starting at address
with the contents of buffer
.
The address and buffer length may be arbitrary. This function will not
erase the segment first.
The progress
callback will be invoked after each chunk of the program operation.
sourcepub fn chip_reset(spi: &dyn Target) -> Result<()>
pub fn chip_reset(spi: &dyn Target) -> Result<()>
Send the software reset sequence to the spi
target.
Trait Implementations§
Auto Trait Implementations§
impl RefUnwindSafe for SpiFlash
impl Send for SpiFlash
impl Sync for SpiFlash
impl Unpin for SpiFlash
impl UnwindSafe for SpiFlash
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_mut()
into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.