aboutsummaryrefslogtreecommitdiff
path: root/embassy-embedded-hal/src
diff options
context:
space:
mode:
author1-rafael-1 <[email protected]>2025-09-15 20:07:18 +0200
committer1-rafael-1 <[email protected]>2025-09-15 20:07:18 +0200
commit6bb3d2c0720fa082f27d3cdb70f516058497ec87 (patch)
tree5a1e255cff999b00800f203b91a759c720c973e5 /embassy-embedded-hal/src
parenteb685574601d98c44faed9a3534d056199b46e20 (diff)
parent92a6fd2946f2cbb15359290f68aa360953da2ff7 (diff)
Merge branch 'main' into rp2040-rtc-alarm
Diffstat (limited to 'embassy-embedded-hal/src')
-rw-r--r--embassy-embedded-hal/src/adapter/blocking_async.rs28
-rw-r--r--embassy-embedded-hal/src/adapter/yielding_async.rs5
-rw-r--r--embassy-embedded-hal/src/flash/concat_flash.rs22
-rw-r--r--embassy-embedded-hal/src/flash/partition/asynch.rs4
-rw-r--r--embassy-embedded-hal/src/flash/partition/blocking.rs4
-rw-r--r--embassy-embedded-hal/src/shared_bus/asynch/i2c.rs8
6 files changed, 45 insertions, 26 deletions
diff --git a/embassy-embedded-hal/src/adapter/blocking_async.rs b/embassy-embedded-hal/src/adapter/blocking_async.rs
index bafc31583..3b6e0ec00 100644
--- a/embassy-embedded-hal/src/adapter/blocking_async.rs
+++ b/embassy-embedded-hal/src/adapter/blocking_async.rs
@@ -1,5 +1,3 @@
1use embedded_hal_02::blocking;
2
3/// Wrapper that implements async traits using blocking implementations. 1/// Wrapper that implements async traits using blocking implementations.
4/// 2///
5/// This allows driver writers to depend on the async traits while still supporting embedded-hal peripheral implementations. 3/// This allows driver writers to depend on the async traits while still supporting embedded-hal peripheral implementations.
@@ -24,7 +22,7 @@ impl<T> BlockingAsync<T> {
24impl<T, E> embedded_hal_1::i2c::ErrorType for BlockingAsync<T> 22impl<T, E> embedded_hal_1::i2c::ErrorType for BlockingAsync<T>
25where 23where
26 E: embedded_hal_1::i2c::Error + 'static, 24 E: embedded_hal_1::i2c::Error + 'static,
27 T: blocking::i2c::WriteRead<Error = E> + blocking::i2c::Read<Error = E> + blocking::i2c::Write<Error = E>, 25 T: embedded_hal_1::i2c::I2c<Error = E>,
28{ 26{
29 type Error = E; 27 type Error = E;
30} 28}
@@ -32,7 +30,7 @@ where
32impl<T, E> embedded_hal_async::i2c::I2c for BlockingAsync<T> 30impl<T, E> embedded_hal_async::i2c::I2c for BlockingAsync<T>
33where 31where
34 E: embedded_hal_1::i2c::Error + 'static, 32 E: embedded_hal_1::i2c::Error + 'static,
35 T: blocking::i2c::WriteRead<Error = E> + blocking::i2c::Read<Error = E> + blocking::i2c::Write<Error = E>, 33 T: embedded_hal_1::i2c::I2c<Error = E>,
36{ 34{
37 async fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> { 35 async fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> {
38 self.wrapped.read(address, read) 36 self.wrapped.read(address, read)
@@ -51,9 +49,7 @@ where
51 address: u8, 49 address: u8,
52 operations: &mut [embedded_hal_1::i2c::Operation<'_>], 50 operations: &mut [embedded_hal_1::i2c::Operation<'_>],
53 ) -> Result<(), Self::Error> { 51 ) -> Result<(), Self::Error> {
54 let _ = address; 52 self.wrapped.transaction(address, operations)
55 let _ = operations;
56 todo!()
57 } 53 }
58} 54}
59 55
@@ -63,16 +59,16 @@ where
63 59
64impl<T, E> embedded_hal_async::spi::ErrorType for BlockingAsync<T> 60impl<T, E> embedded_hal_async::spi::ErrorType for BlockingAsync<T>
65where 61where
66 E: embedded_hal_1::spi::Error, 62 E: embedded_hal_async::spi::Error,
67 T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>, 63 T: embedded_hal_1::spi::SpiBus<Error = E>,
68{ 64{
69 type Error = E; 65 type Error = E;
70} 66}
71 67
72impl<T, E> embedded_hal_async::spi::SpiBus<u8> for BlockingAsync<T> 68impl<T, E> embedded_hal_async::spi::SpiBus<u8> for BlockingAsync<T>
73where 69where
74 E: embedded_hal_1::spi::Error + 'static, 70 E: embedded_hal_async::spi::Error,
75 T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>, 71 T: embedded_hal_1::spi::SpiBus<Error = E>,
76{ 72{
77 async fn flush(&mut self) -> Result<(), Self::Error> { 73 async fn flush(&mut self) -> Result<(), Self::Error> {
78 Ok(()) 74 Ok(())
@@ -84,21 +80,17 @@ where
84 } 80 }
85 81
86 async fn read(&mut self, data: &mut [u8]) -> Result<(), Self::Error> { 82 async fn read(&mut self, data: &mut [u8]) -> Result<(), Self::Error> {
87 self.wrapped.transfer(data)?; 83 self.wrapped.read(data)?;
88 Ok(()) 84 Ok(())
89 } 85 }
90 86
91 async fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> { 87 async fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
92 // Ensure we write the expected bytes 88 self.wrapped.transfer(read, write)?;
93 for i in 0..core::cmp::min(read.len(), write.len()) {
94 read[i] = write[i].clone();
95 }
96 self.wrapped.transfer(read)?;
97 Ok(()) 89 Ok(())
98 } 90 }
99 91
100 async fn transfer_in_place(&mut self, data: &mut [u8]) -> Result<(), Self::Error> { 92 async fn transfer_in_place(&mut self, data: &mut [u8]) -> Result<(), Self::Error> {
101 self.wrapped.transfer(data)?; 93 self.wrapped.transfer_in_place(data)?;
102 Ok(()) 94 Ok(())
103 } 95 }
104} 96}
diff --git a/embassy-embedded-hal/src/adapter/yielding_async.rs b/embassy-embedded-hal/src/adapter/yielding_async.rs
index fe9c9c341..87f822a63 100644
--- a/embassy-embedded-hal/src/adapter/yielding_async.rs
+++ b/embassy-embedded-hal/src/adapter/yielding_async.rs
@@ -147,6 +147,11 @@ impl<T: embedded_storage_async::nor_flash::NorFlash> embedded_storage_async::nor
147 } 147 }
148} 148}
149 149
150impl<T: embedded_storage_async::nor_flash::MultiwriteNorFlash> embedded_storage_async::nor_flash::MultiwriteNorFlash
151 for YieldingAsync<T>
152{
153}
154
150#[cfg(test)] 155#[cfg(test)]
151mod tests { 156mod tests {
152 use embedded_storage_async::nor_flash::NorFlash; 157 use embedded_storage_async::nor_flash::NorFlash;
diff --git a/embassy-embedded-hal/src/flash/concat_flash.rs b/embassy-embedded-hal/src/flash/concat_flash.rs
index 499941d19..fe5a18ce2 100644
--- a/embassy-embedded-hal/src/flash/concat_flash.rs
+++ b/embassy-embedded-hal/src/flash/concat_flash.rs
@@ -1,5 +1,7 @@
1use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, ReadNorFlash}; 1use embedded_storage::nor_flash::{ErrorType, MultiwriteNorFlash, NorFlash, NorFlashError, ReadNorFlash};
2use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash}; 2use embedded_storage_async::nor_flash::{
3 MultiwriteNorFlash as AsyncMultiwriteNorFlash, NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash,
4};
3 5
4/// Convenience helper for concatenating two consecutive flashes into one. 6/// Convenience helper for concatenating two consecutive flashes into one.
5/// This is especially useful if used with "flash regions", where one may 7/// This is especially useful if used with "flash regions", where one may
@@ -116,6 +118,14 @@ where
116 } 118 }
117} 119}
118 120
121impl<First, Second, E> MultiwriteNorFlash for ConcatFlash<First, Second>
122where
123 First: MultiwriteNorFlash<Error = E>,
124 Second: MultiwriteNorFlash<Error = E>,
125 E: NorFlashError,
126{
127}
128
119impl<First, Second, E> AsyncReadNorFlash for ConcatFlash<First, Second> 129impl<First, Second, E> AsyncReadNorFlash for ConcatFlash<First, Second>
120where 130where
121 First: AsyncReadNorFlash<Error = E>, 131 First: AsyncReadNorFlash<Error = E>,
@@ -185,6 +195,14 @@ where
185 } 195 }
186} 196}
187 197
198impl<First, Second, E> AsyncMultiwriteNorFlash for ConcatFlash<First, Second>
199where
200 First: AsyncMultiwriteNorFlash<Error = E>,
201 Second: AsyncMultiwriteNorFlash<Error = E>,
202 E: NorFlashError,
203{
204}
205
188#[cfg(test)] 206#[cfg(test)]
189mod tests { 207mod tests {
190 use embedded_storage::nor_flash::{NorFlash, ReadNorFlash}; 208 use embedded_storage::nor_flash::{NorFlash, ReadNorFlash};
diff --git a/embassy-embedded-hal/src/flash/partition/asynch.rs b/embassy-embedded-hal/src/flash/partition/asynch.rs
index 1b0c91232..82e27bb7c 100644
--- a/embassy-embedded-hal/src/flash/partition/asynch.rs
+++ b/embassy-embedded-hal/src/flash/partition/asynch.rs
@@ -1,7 +1,7 @@
1use embassy_sync::blocking_mutex::raw::RawMutex; 1use embassy_sync::blocking_mutex::raw::RawMutex;
2use embassy_sync::mutex::Mutex; 2use embassy_sync::mutex::Mutex;
3use embedded_storage::nor_flash::ErrorType; 3use embedded_storage::nor_flash::ErrorType;
4use embedded_storage_async::nor_flash::{NorFlash, ReadNorFlash}; 4use embedded_storage_async::nor_flash::{MultiwriteNorFlash, NorFlash, ReadNorFlash};
5 5
6use super::Error; 6use super::Error;
7 7
@@ -99,6 +99,8 @@ impl<M: RawMutex, T: NorFlash> NorFlash for Partition<'_, M, T> {
99 } 99 }
100} 100}
101 101
102impl<M: RawMutex, T: MultiwriteNorFlash> MultiwriteNorFlash for Partition<'_, M, T> {}
103
102#[cfg(test)] 104#[cfg(test)]
103mod tests { 105mod tests {
104 use embassy_sync::blocking_mutex::raw::NoopRawMutex; 106 use embassy_sync::blocking_mutex::raw::NoopRawMutex;
diff --git a/embassy-embedded-hal/src/flash/partition/blocking.rs b/embassy-embedded-hal/src/flash/partition/blocking.rs
index a68df7812..951998166 100644
--- a/embassy-embedded-hal/src/flash/partition/blocking.rs
+++ b/embassy-embedded-hal/src/flash/partition/blocking.rs
@@ -2,7 +2,7 @@ use core::cell::RefCell;
2 2
3use embassy_sync::blocking_mutex::raw::RawMutex; 3use embassy_sync::blocking_mutex::raw::RawMutex;
4use embassy_sync::blocking_mutex::Mutex; 4use embassy_sync::blocking_mutex::Mutex;
5use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash}; 5use embedded_storage::nor_flash::{ErrorType, MultiwriteNorFlash, NorFlash, ReadNorFlash};
6 6
7use super::Error; 7use super::Error;
8 8
@@ -109,6 +109,8 @@ impl<M: RawMutex, T: NorFlash> NorFlash for BlockingPartition<'_, M, T> {
109 } 109 }
110} 110}
111 111
112impl<M: RawMutex, T: MultiwriteNorFlash> MultiwriteNorFlash for BlockingPartition<'_, M, T> {}
113
112#[cfg(test)] 114#[cfg(test)]
113mod tests { 115mod tests {
114 use embassy_sync::blocking_mutex::raw::NoopRawMutex; 116 use embassy_sync::blocking_mutex::raw::NoopRawMutex;
diff --git a/embassy-embedded-hal/src/shared_bus/asynch/i2c.rs b/embassy-embedded-hal/src/shared_bus/asynch/i2c.rs
index 71ce09def..6de685ee1 100644
--- a/embassy-embedded-hal/src/shared_bus/asynch/i2c.rs
+++ b/embassy-embedded-hal/src/shared_bus/asynch/i2c.rs
@@ -50,8 +50,8 @@ where
50 50
51impl<M, BUS> i2c::I2c for I2cDevice<'_, M, BUS> 51impl<M, BUS> i2c::I2c for I2cDevice<'_, M, BUS>
52where 52where
53 M: RawMutex + 'static, 53 M: RawMutex,
54 BUS: i2c::I2c + 'static, 54 BUS: i2c::I2c,
55{ 55{
56 async fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> { 56 async fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
57 let mut bus = self.bus.lock().await; 57 let mut bus = self.bus.lock().await;
@@ -124,8 +124,8 @@ where
124 124
125impl<M, BUS> i2c::I2c for I2cDeviceWithConfig<'_, M, BUS> 125impl<M, BUS> i2c::I2c for I2cDeviceWithConfig<'_, M, BUS>
126where 126where
127 M: RawMutex + 'static, 127 M: RawMutex,
128 BUS: i2c::I2c + SetConfig + 'static, 128 BUS: i2c::I2c + SetConfig,
129{ 129{
130 async fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> { 130 async fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), I2cDeviceError<BUS::Error>> {
131 let mut bus = self.bus.lock().await; 131 let mut bus = self.bus.lock().await;