Skip to content

Commit b2c1ff4

Browse files
committed
Add RAM-backed MockFlash for tests
1 parent f5a2565 commit b2c1ff4

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed

src/nor_flash.rs

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,3 +379,117 @@ where
379379
Ok(())
380380
}
381381
}
382+
383+
/// Simple RAM-backed flash storage implementation for tests
384+
#[derive(Clone, Copy, Debug)]
385+
pub struct MockFlash<
386+
const CAPACITY: usize,
387+
const READ_SIZE: usize = 1,
388+
const WRITE_SIZE: usize = 1,
389+
const ERASE_SIZE: usize = { 1 << 10 },
390+
const ERASE_BYTE: u8 = 0xff,
391+
> {
392+
data: [u8; CAPACITY],
393+
}
394+
395+
impl<
396+
const CAPACITY: usize,
397+
const READ_SIZE: usize,
398+
const WRITE_SIZE: usize,
399+
const ERASE_SIZE: usize,
400+
const ERASE_BYTE: u8,
401+
> Default for MockFlash<CAPACITY, READ_SIZE, WRITE_SIZE, ERASE_SIZE, ERASE_BYTE>
402+
{
403+
fn default() -> Self {
404+
Self {
405+
data: [ERASE_BYTE; CAPACITY],
406+
}
407+
}
408+
}
409+
410+
impl<
411+
const CAPACITY: usize,
412+
const READ_SIZE: usize,
413+
const WRITE_SIZE: usize,
414+
const ERASE_SIZE: usize,
415+
const ERASE_BYTE: u8,
416+
> core::ops::Deref for MockFlash<CAPACITY, READ_SIZE, WRITE_SIZE, ERASE_SIZE, ERASE_BYTE>
417+
{
418+
type Target = [u8; CAPACITY];
419+
420+
fn deref(&self) -> &Self::Target {
421+
&self.data
422+
}
423+
}
424+
425+
impl<
426+
const CAPACITY: usize,
427+
const READ_SIZE: usize,
428+
const WRITE_SIZE: usize,
429+
const ERASE_SIZE: usize,
430+
const ERASE_BYTE: u8,
431+
> core::ops::DerefMut for MockFlash<CAPACITY, READ_SIZE, WRITE_SIZE, ERASE_SIZE, ERASE_BYTE>
432+
{
433+
fn deref_mut(&mut self) -> &mut Self::Target {
434+
&mut self.data
435+
}
436+
}
437+
438+
impl<
439+
const CAPACITY: usize,
440+
const READ_SIZE: usize,
441+
const WRITE_SIZE: usize,
442+
const ERASE_SIZE: usize,
443+
const ERASE_BYTE: u8,
444+
> ErrorType for MockFlash<CAPACITY, READ_SIZE, WRITE_SIZE, ERASE_SIZE, ERASE_BYTE>
445+
{
446+
type Error = NorFlashErrorKind;
447+
}
448+
449+
impl<
450+
const CAPACITY: usize,
451+
const READ_SIZE: usize,
452+
const WRITE_SIZE: usize,
453+
const ERASE_SIZE: usize,
454+
const ERASE_BYTE: u8,
455+
> ReadNorFlash for MockFlash<CAPACITY, READ_SIZE, WRITE_SIZE, ERASE_SIZE, ERASE_BYTE>
456+
{
457+
const READ_SIZE: usize = READ_SIZE;
458+
459+
fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error> {
460+
check_read(self, offset, bytes.len())?;
461+
bytes.copy_from_slice(&self.data[offset as usize..][..bytes.len()]);
462+
Ok(())
463+
}
464+
465+
fn capacity(&self) -> usize {
466+
CAPACITY
467+
}
468+
}
469+
470+
impl<
471+
const CAPACITY: usize,
472+
const READ_SIZE: usize,
473+
const WRITE_SIZE: usize,
474+
const ERASE_SIZE: usize,
475+
const ERASE_BYTE: u8,
476+
> NorFlash for MockFlash<CAPACITY, READ_SIZE, WRITE_SIZE, ERASE_SIZE, ERASE_BYTE>
477+
{
478+
const WRITE_SIZE: usize = WRITE_SIZE;
479+
const ERASE_SIZE: usize = ERASE_SIZE;
480+
481+
fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error> {
482+
check_write(self, offset, bytes.len())?;
483+
for (dst, src) in self.data[offset as usize..].iter_mut().zip(bytes) {
484+
*dst &= src;
485+
}
486+
Ok(())
487+
}
488+
489+
fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> {
490+
check_erase(self, from, to)?;
491+
self.data[from as usize..to as usize].fill(ERASE_BYTE);
492+
Ok(())
493+
}
494+
}
495+

0 commit comments

Comments
 (0)