aboutsummaryrefslogtreecommitdiff
path: root/embassy-embedded-hal/src/flash/mem_flash.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-embedded-hal/src/flash/mem_flash.rs')
-rw-r--r--embassy-embedded-hal/src/flash/mem_flash.rs127
1 files changed, 127 insertions, 0 deletions
diff --git a/embassy-embedded-hal/src/flash/mem_flash.rs b/embassy-embedded-hal/src/flash/mem_flash.rs
new file mode 100644
index 000000000..4e10627df
--- /dev/null
+++ b/embassy-embedded-hal/src/flash/mem_flash.rs
@@ -0,0 +1,127 @@
1use alloc::vec::Vec;
2
3use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash};
4use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash};
5
6extern crate alloc;
7
8pub(crate) struct MemFlash<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> {
9 pub mem: [u8; SIZE],
10 pub writes: Vec<(u32, usize)>,
11 pub erases: Vec<(u32, u32)>,
12}
13
14impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE> {
15 #[allow(unused)]
16 pub const fn new(fill: u8) -> Self {
17 Self {
18 mem: [fill; SIZE],
19 writes: Vec::new(),
20 erases: Vec::new(),
21 }
22 }
23
24 fn read(&mut self, offset: u32, bytes: &mut [u8]) {
25 let len = bytes.len();
26 bytes.copy_from_slice(&self.mem[offset as usize..offset as usize + len]);
27 }
28
29 fn write(&mut self, offset: u32, bytes: &[u8]) {
30 self.writes.push((offset, bytes.len()));
31 let offset = offset as usize;
32 assert_eq!(0, bytes.len() % WRITE_SIZE);
33 assert_eq!(0, offset % WRITE_SIZE);
34 assert!(offset + bytes.len() <= SIZE);
35
36 self.mem[offset..offset + bytes.len()].copy_from_slice(bytes);
37 }
38
39 fn erase(&mut self, from: u32, to: u32) {
40 self.erases.push((from, to));
41 let from = from as usize;
42 let to = to as usize;
43 assert_eq!(0, from % ERASE_SIZE);
44 assert_eq!(0, to % ERASE_SIZE);
45 self.mem[from..to].fill(0xff);
46 }
47}
48
49impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> Default
50 for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
51{
52 fn default() -> Self {
53 Self::new(0xff)
54 }
55}
56
57impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> ErrorType
58 for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
59{
60 type Error = core::convert::Infallible;
61}
62
63impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> ReadNorFlash
64 for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
65{
66 const READ_SIZE: usize = 1;
67
68 fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error> {
69 self.read(offset, bytes);
70 Ok(())
71 }
72
73 fn capacity(&self) -> usize {
74 SIZE
75 }
76}
77
78impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> NorFlash
79 for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
80{
81 const WRITE_SIZE: usize = WRITE_SIZE;
82 const ERASE_SIZE: usize = ERASE_SIZE;
83
84 fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error> {
85 self.write(offset, bytes);
86 Ok(())
87 }
88
89 fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> {
90 self.erase(from, to);
91 Ok(())
92 }
93}
94
95#[cfg(feature = "nightly")]
96impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncReadNorFlash
97 for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
98{
99 const READ_SIZE: usize = 1;
100
101 async fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error> {
102 self.read(offset, bytes);
103 Ok(())
104 }
105
106 fn capacity(&self) -> usize {
107 SIZE
108 }
109}
110
111#[cfg(feature = "nightly")]
112impl<const SIZE: usize, const ERASE_SIZE: usize, const WRITE_SIZE: usize> AsyncNorFlash
113 for MemFlash<SIZE, ERASE_SIZE, WRITE_SIZE>
114{
115 const WRITE_SIZE: usize = WRITE_SIZE;
116 const ERASE_SIZE: usize = ERASE_SIZE;
117
118 async fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error> {
119 self.write(offset, bytes);
120 Ok(())
121 }
122
123 async fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> {
124 self.erase(from, to);
125 Ok(())
126 }
127}