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 | |
| parent | eb685574601d98c44faed9a3534d056199b46e20 (diff) | |
| parent | 92a6fd2946f2cbb15359290f68aa360953da2ff7 (diff) | |
Merge branch 'main' into rp2040-rtc-alarm
Diffstat (limited to 'embassy-embedded-hal')
| -rw-r--r-- | embassy-embedded-hal/CHANGELOG.md | 22 | ||||
| -rw-r--r-- | embassy-embedded-hal/Cargo.toml | 20 | ||||
| -rw-r--r-- | embassy-embedded-hal/src/adapter/blocking_async.rs | 28 | ||||
| -rw-r--r-- | embassy-embedded-hal/src/adapter/yielding_async.rs | 5 | ||||
| -rw-r--r-- | embassy-embedded-hal/src/flash/concat_flash.rs | 22 | ||||
| -rw-r--r-- | embassy-embedded-hal/src/flash/partition/asynch.rs | 4 | ||||
| -rw-r--r-- | embassy-embedded-hal/src/flash/partition/blocking.rs | 4 | ||||
| -rw-r--r-- | embassy-embedded-hal/src/shared_bus/asynch/i2c.rs | 8 |
8 files changed, 79 insertions, 34 deletions
diff --git a/embassy-embedded-hal/CHANGELOG.md b/embassy-embedded-hal/CHANGELOG.md index 224036af4..ec79a5c81 100644 --- a/embassy-embedded-hal/CHANGELOG.md +++ b/embassy-embedded-hal/CHANGELOG.md | |||
| @@ -5,7 +5,27 @@ All notable changes to this project will be documented in this file. | |||
| 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), |
| 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 7 | 7 | ||
| 8 | ## Unreleased | 8 | <!-- next-header --> |
| 9 | ## Unreleased - ReleaseDate | ||
| 10 | |||
| 11 | ## 0.5.0 - 2025-08-27 | ||
| 12 | |||
| 13 | ## 0.4.0 - 2025-08-03 | ||
| 14 | |||
| 15 | - `SpiDevice` cancel safety: always set CS pin to high on drop | ||
| 16 | - Update `embassy-sync` to v0.7.0 | ||
| 17 | |||
| 18 | ## 0.3.2 - 2025-08-03 | ||
| 19 | |||
| 20 | - Reverted changes in 0.3.1 | ||
| 21 | - Reexport `SetConfig`, `GetConfig` traits from v0.4.0. | ||
| 22 | |||
| 23 | ## 0.3.1 - 2025-07-16 | ||
| 24 | |||
| 25 | YANKED due to embassy-sync upgrade being a breaking change. | ||
| 26 | |||
| 27 | - `SpiDevice` cancel safety: always set CS pin to high on drop | ||
| 28 | - Update `embassy-sync` to v0.7.0 | ||
| 9 | 29 | ||
| 10 | ## 0.3.0 - 2025-01-05 | 30 | ## 0.3.0 - 2025-01-05 |
| 11 | 31 | ||
diff --git a/embassy-embedded-hal/Cargo.toml b/embassy-embedded-hal/Cargo.toml index f385963f1..a66e01717 100644 --- a/embassy-embedded-hal/Cargo.toml +++ b/embassy-embedded-hal/Cargo.toml | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | [package] | 1 | [package] |
| 2 | name = "embassy-embedded-hal" | 2 | name = "embassy-embedded-hal" |
| 3 | version = "0.3.0" | 3 | version = "0.5.0" |
| 4 | edition = "2021" | 4 | edition = "2021" |
| 5 | license = "MIT OR Apache-2.0" | 5 | license = "MIT OR Apache-2.0" |
| 6 | description = "Collection of utilities to use `embedded-hal` and `embedded-storage` traits with Embassy." | 6 | description = "Collection of utilities to use `embedded-hal` and `embedded-storage` traits with Embassy." |
| @@ -12,6 +12,13 @@ categories = [ | |||
| 12 | "asynchronous", | 12 | "asynchronous", |
| 13 | ] | 13 | ] |
| 14 | 14 | ||
| 15 | [package.metadata.embassy] | ||
| 16 | build = [ | ||
| 17 | {target = "thumbv7em-none-eabi", features = []}, | ||
| 18 | {target = "thumbv7em-none-eabi", features = ["time"]}, | ||
| 19 | ] | ||
| 20 | |||
| 21 | |||
| 15 | [package.metadata.embassy_docs] | 22 | [package.metadata.embassy_docs] |
| 16 | src_base = "https://github.com/embassy-rs/embassy/blob/embassy-embedded-hal-v$VERSION/embassy-embedded-hal/src/" | 23 | src_base = "https://github.com/embassy-rs/embassy/blob/embassy-embedded-hal-v$VERSION/embassy-embedded-hal/src/" |
| 17 | src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-embedded-hal/src/" | 24 | src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-embedded-hal/src/" |
| @@ -19,13 +26,12 @@ target = "x86_64-unknown-linux-gnu" | |||
| 19 | 26 | ||
| 20 | [features] | 27 | [features] |
| 21 | time = ["dep:embassy-time"] | 28 | time = ["dep:embassy-time"] |
| 22 | default = ["time"] | ||
| 23 | 29 | ||
| 24 | [dependencies] | 30 | [dependencies] |
| 25 | embassy-hal-internal = { version = "0.2.0", path = "../embassy-hal-internal" } | 31 | embassy-hal-internal = { version = "0.3.0", path = "../embassy-hal-internal" } |
| 26 | embassy-futures = { version = "0.1.0", path = "../embassy-futures" } | 32 | embassy-futures = { version = "0.1.2", path = "../embassy-futures" } |
| 27 | embassy-sync = { version = "0.6.2", path = "../embassy-sync" } | 33 | embassy-sync = { version = "0.7.2", path = "../embassy-sync" } |
| 28 | embassy-time = { version = "0.4.0", path = "../embassy-time", optional = true } | 34 | embassy-time = { version = "0.5.0", path = "../embassy-time", optional = true } |
| 29 | embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = [ | 35 | embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = [ |
| 30 | "unproven", | 36 | "unproven", |
| 31 | ] } | 37 | ] } |
| @@ -35,7 +41,7 @@ embedded-storage = "0.3.1" | |||
| 35 | embedded-storage-async = { version = "0.4.1" } | 41 | embedded-storage-async = { version = "0.4.1" } |
| 36 | nb = "1.0.0" | 42 | nb = "1.0.0" |
| 37 | 43 | ||
| 38 | defmt = { version = "0.3", optional = true } | 44 | defmt = { version = "1.0.1", optional = true } |
| 39 | 45 | ||
| 40 | [dev-dependencies] | 46 | [dev-dependencies] |
| 41 | critical-section = { version = "1.1.1", features = ["std"] } | 47 | critical-section = { version = "1.1.1", features = ["std"] } |
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; |
