diff options
| author | 1-rafael-1 <[email protected]> | 2025-09-15 20:07:18 +0200 |
|---|---|---|
| committer | 1-rafael-1 <[email protected]> | 2025-09-15 20:07:18 +0200 |
| commit | 6bb3d2c0720fa082f27d3cdb70f516058497ec87 (patch) | |
| tree | 5a1e255cff999b00800f203b91a759c720c973e5 /embassy-embedded-hal/src | |
| parent | eb685574601d98c44faed9a3534d056199b46e20 (diff) | |
| parent | 92a6fd2946f2cbb15359290f68aa360953da2ff7 (diff) | |
Merge branch 'main' into rp2040-rtc-alarm
Diffstat (limited to 'embassy-embedded-hal/src')
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 @@ | |||
| 1 | use 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> { | |||
| 24 | impl<T, E> embedded_hal_1::i2c::ErrorType for BlockingAsync<T> | 22 | impl<T, E> embedded_hal_1::i2c::ErrorType for BlockingAsync<T> |
| 25 | where | 23 | where |
| 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 | |||
| 32 | impl<T, E> embedded_hal_async::i2c::I2c for BlockingAsync<T> | 30 | impl<T, E> embedded_hal_async::i2c::I2c for BlockingAsync<T> |
| 33 | where | 31 | where |
| 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 | ||
| 64 | impl<T, E> embedded_hal_async::spi::ErrorType for BlockingAsync<T> | 60 | impl<T, E> embedded_hal_async::spi::ErrorType for BlockingAsync<T> |
| 65 | where | 61 | where |
| 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 | ||
| 72 | impl<T, E> embedded_hal_async::spi::SpiBus<u8> for BlockingAsync<T> | 68 | impl<T, E> embedded_hal_async::spi::SpiBus<u8> for BlockingAsync<T> |
| 73 | where | 69 | where |
| 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 | ||
| 150 | impl<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)] |
| 151 | mod tests { | 156 | mod 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 @@ | |||
| 1 | use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, ReadNorFlash}; | 1 | use embedded_storage::nor_flash::{ErrorType, MultiwriteNorFlash, NorFlash, NorFlashError, ReadNorFlash}; |
| 2 | use embedded_storage_async::nor_flash::{NorFlash as AsyncNorFlash, ReadNorFlash as AsyncReadNorFlash}; | 2 | use 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 | ||
| 121 | impl<First, Second, E> MultiwriteNorFlash for ConcatFlash<First, Second> | ||
| 122 | where | ||
| 123 | First: MultiwriteNorFlash<Error = E>, | ||
| 124 | Second: MultiwriteNorFlash<Error = E>, | ||
| 125 | E: NorFlashError, | ||
| 126 | { | ||
| 127 | } | ||
| 128 | |||
| 119 | impl<First, Second, E> AsyncReadNorFlash for ConcatFlash<First, Second> | 129 | impl<First, Second, E> AsyncReadNorFlash for ConcatFlash<First, Second> |
| 120 | where | 130 | where |
| 121 | First: AsyncReadNorFlash<Error = E>, | 131 | First: AsyncReadNorFlash<Error = E>, |
| @@ -185,6 +195,14 @@ where | |||
| 185 | } | 195 | } |
| 186 | } | 196 | } |
| 187 | 197 | ||
| 198 | impl<First, Second, E> AsyncMultiwriteNorFlash for ConcatFlash<First, Second> | ||
| 199 | where | ||
| 200 | First: AsyncMultiwriteNorFlash<Error = E>, | ||
| 201 | Second: AsyncMultiwriteNorFlash<Error = E>, | ||
| 202 | E: NorFlashError, | ||
| 203 | { | ||
| 204 | } | ||
| 205 | |||
| 188 | #[cfg(test)] | 206 | #[cfg(test)] |
| 189 | mod tests { | 207 | mod 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 @@ | |||
| 1 | use embassy_sync::blocking_mutex::raw::RawMutex; | 1 | use embassy_sync::blocking_mutex::raw::RawMutex; |
| 2 | use embassy_sync::mutex::Mutex; | 2 | use embassy_sync::mutex::Mutex; |
| 3 | use embedded_storage::nor_flash::ErrorType; | 3 | use embedded_storage::nor_flash::ErrorType; |
| 4 | use embedded_storage_async::nor_flash::{NorFlash, ReadNorFlash}; | 4 | use embedded_storage_async::nor_flash::{MultiwriteNorFlash, NorFlash, ReadNorFlash}; |
| 5 | 5 | ||
| 6 | use super::Error; | 6 | use super::Error; |
| 7 | 7 | ||
| @@ -99,6 +99,8 @@ impl<M: RawMutex, T: NorFlash> NorFlash for Partition<'_, M, T> { | |||
| 99 | } | 99 | } |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | impl<M: RawMutex, T: MultiwriteNorFlash> MultiwriteNorFlash for Partition<'_, M, T> {} | ||
| 103 | |||
| 102 | #[cfg(test)] | 104 | #[cfg(test)] |
| 103 | mod tests { | 105 | mod 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 | ||
| 3 | use embassy_sync::blocking_mutex::raw::RawMutex; | 3 | use embassy_sync::blocking_mutex::raw::RawMutex; |
| 4 | use embassy_sync::blocking_mutex::Mutex; | 4 | use embassy_sync::blocking_mutex::Mutex; |
| 5 | use embedded_storage::nor_flash::{ErrorType, NorFlash, ReadNorFlash}; | 5 | use embedded_storage::nor_flash::{ErrorType, MultiwriteNorFlash, NorFlash, ReadNorFlash}; |
| 6 | 6 | ||
| 7 | use super::Error; | 7 | use super::Error; |
| 8 | 8 | ||
| @@ -109,6 +109,8 @@ impl<M: RawMutex, T: NorFlash> NorFlash for BlockingPartition<'_, M, T> { | |||
| 109 | } | 109 | } |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | impl<M: RawMutex, T: MultiwriteNorFlash> MultiwriteNorFlash for BlockingPartition<'_, M, T> {} | ||
| 113 | |||
| 112 | #[cfg(test)] | 114 | #[cfg(test)] |
| 113 | mod tests { | 115 | mod 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 | ||
| 51 | impl<M, BUS> i2c::I2c for I2cDevice<'_, M, BUS> | 51 | impl<M, BUS> i2c::I2c for I2cDevice<'_, M, BUS> |
| 52 | where | 52 | where |
| 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 | ||
| 125 | impl<M, BUS> i2c::I2c for I2cDeviceWithConfig<'_, M, BUS> | 125 | impl<M, BUS> i2c::I2c for I2cDeviceWithConfig<'_, M, BUS> |
| 126 | where | 126 | where |
| 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; |
