@@ -379,3 +379,117 @@ where
379
379
Ok ( ( ) )
380
380
}
381
381
}
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