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