diff options
| author | jrmoulton <[email protected]> | 2024-06-18 10:56:46 -0600 |
|---|---|---|
| committer | jrmoulton <[email protected]> | 2024-08-13 09:46:16 -0600 |
| commit | 31f224f43c7b0fa6796b4966b310b0bbe8edd14b (patch) | |
| tree | 0ee54222928012bca64abbda90a36c3a4dd6264e | |
| parent | 70dfbc03b0399ebeb57ba9b8ee177154325db374 (diff) | |
move embedded hal impl to version modules to allow for 10bit addr on v2
| -rw-r--r-- | embassy-stm32/src/i2c/mod.rs | 86 | ||||
| -rw-r--r-- | embassy-stm32/src/i2c/v1.rs | 72 | ||||
| -rw-r--r-- | embassy-stm32/src/i2c/v2.rs | 88 |
3 files changed, 159 insertions, 87 deletions
diff --git a/embassy-stm32/src/i2c/mod.rs b/embassy-stm32/src/i2c/mod.rs index 1464a6851..3303b9f4b 100644 --- a/embassy-stm32/src/i2c/mod.rs +++ b/embassy-stm32/src/i2c/mod.rs | |||
| @@ -388,42 +388,6 @@ foreach_peripheral!( | |||
| 388 | }; | 388 | }; |
| 389 | ); | 389 | ); |
| 390 | 390 | ||
| 391 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_02::blocking::i2c::AddressMode> | ||
| 392 | embedded_hal_02::blocking::i2c::Read<A> for I2c<'d, M, IM> | ||
| 393 | where | ||
| 394 | A: Into<Address>, | ||
| 395 | { | ||
| 396 | type Error = Error; | ||
| 397 | |||
| 398 | fn read(&mut self, address: A, buffer: &mut [u8]) -> Result<(), Self::Error> { | ||
| 399 | self.blocking_read(address.into(), buffer) | ||
| 400 | } | ||
| 401 | } | ||
| 402 | |||
| 403 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_02::blocking::i2c::AddressMode> | ||
| 404 | embedded_hal_02::blocking::i2c::Write<A> for I2c<'d, M, IM> | ||
| 405 | where | ||
| 406 | A: Into<Address>, | ||
| 407 | { | ||
| 408 | type Error = Error; | ||
| 409 | |||
| 410 | fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> { | ||
| 411 | self.blocking_write(address.into(), write) | ||
| 412 | } | ||
| 413 | } | ||
| 414 | |||
| 415 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_02::blocking::i2c::AddressMode> | ||
| 416 | embedded_hal_02::blocking::i2c::WriteRead<A> for I2c<'d, M, IM> | ||
| 417 | where | ||
| 418 | A: Into<Address>, | ||
| 419 | { | ||
| 420 | type Error = Error; | ||
| 421 | |||
| 422 | fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 423 | self.blocking_write_read(address.into(), write, read) | ||
| 424 | } | ||
| 425 | } | ||
| 426 | |||
| 427 | impl embedded_hal_1::i2c::Error for Error { | 391 | impl embedded_hal_1::i2c::Error for Error { |
| 428 | fn kind(&self) -> embedded_hal_1::i2c::ErrorKind { | 392 | fn kind(&self) -> embedded_hal_1::i2c::ErrorKind { |
| 429 | match *self { | 393 | match *self { |
| @@ -444,56 +408,6 @@ impl<'d, M: Mode, IM: MasterMode> embedded_hal_1::i2c::ErrorType for I2c<'d, M, | |||
| 444 | type Error = Error; | 408 | type Error = Error; |
| 445 | } | 409 | } |
| 446 | 410 | ||
| 447 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_1::i2c::AddressMode> embedded_hal_1::i2c::I2c<A> for I2c<'d, M, IM> | ||
| 448 | where | ||
| 449 | Address: From<A>, | ||
| 450 | { | ||
| 451 | fn read(&mut self, address: A, read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 452 | self.blocking_read(address.into(), read) | ||
| 453 | } | ||
| 454 | |||
| 455 | fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> { | ||
| 456 | self.blocking_write(address.into(), write) | ||
| 457 | } | ||
| 458 | |||
| 459 | fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 460 | self.blocking_write_read(address.into(), write, read) | ||
| 461 | } | ||
| 462 | |||
| 463 | fn transaction( | ||
| 464 | &mut self, | ||
| 465 | address: A, | ||
| 466 | operations: &mut [embedded_hal_1::i2c::Operation<'_>], | ||
| 467 | ) -> Result<(), Self::Error> { | ||
| 468 | self.blocking_transaction(address.into(), operations) | ||
| 469 | } | ||
| 470 | } | ||
| 471 | |||
| 472 | impl<'d, IM: MasterMode, A: embedded_hal_async::i2c::AddressMode> embedded_hal_async::i2c::I2c<A> for I2c<'d, Async, IM> | ||
| 473 | where | ||
| 474 | Address: From<A>, | ||
| 475 | { | ||
| 476 | async fn read(&mut self, address: A, read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 477 | self.read(address.into(), read).await | ||
| 478 | } | ||
| 479 | |||
| 480 | async fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> { | ||
| 481 | self.write(address.into(), write).await | ||
| 482 | } | ||
| 483 | |||
| 484 | async fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 485 | self.write_read(address.into(), write, read).await | ||
| 486 | } | ||
| 487 | |||
| 488 | async fn transaction( | ||
| 489 | &mut self, | ||
| 490 | address: A, | ||
| 491 | operations: &mut [embedded_hal_1::i2c::Operation<'_>], | ||
| 492 | ) -> Result<(), Self::Error> { | ||
| 493 | self.transaction(address.into(), operations).await | ||
| 494 | } | ||
| 495 | } | ||
| 496 | |||
| 497 | /// Frame type in I2C transaction. | 411 | /// Frame type in I2C transaction. |
| 498 | /// | 412 | /// |
| 499 | /// This tells each method what kind of framing to use, to generate a (repeated) start condition (ST | 413 | /// This tells each method what kind of framing to use, to generate a (repeated) start condition (ST |
diff --git a/embassy-stm32/src/i2c/v1.rs b/embassy-stm32/src/i2c/v1.rs index a93a5d987..e98ab0290 100644 --- a/embassy-stm32/src/i2c/v1.rs +++ b/embassy-stm32/src/i2c/v1.rs | |||
| @@ -298,7 +298,7 @@ impl<'d, M: PeriMode> I2c<'d, M, Master> { | |||
| 298 | } | 298 | } |
| 299 | 299 | ||
| 300 | /// Blocking read. | 300 | /// Blocking read. |
| 301 | pub fn blocking_read(&mut self, addr: u8, read: &mut [u8]) -> Result<(), Error> { | 301 | pub fn blocking_read(&mut self, addr: Address, read: &mut [u8]) -> Result<(), Error> { |
| 302 | self.blocking_read_timeout(addr, read, self.timeout(), FrameOptions::FirstAndLastFrame) | 302 | self.blocking_read_timeout(addr, read, self.timeout(), FrameOptions::FirstAndLastFrame) |
| 303 | } | 303 | } |
| 304 | 304 | ||
| @@ -821,3 +821,73 @@ impl<'d, M: PeriMode> SetConfig for I2c<'d, M, Master> { | |||
| 821 | Ok(()) | 821 | Ok(()) |
| 822 | } | 822 | } |
| 823 | } | 823 | } |
| 824 | |||
| 825 | // ======== Embedded HAL impls ======== | ||
| 826 | |||
| 827 | impl<'d, M: PeriMode, IM: MasterMode> embedded_hal_02::blocking::i2c::Read for I2c<'d, M, IM> { | ||
| 828 | type Error = Error; | ||
| 829 | |||
| 830 | fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Self::Error> { | ||
| 831 | self.blocking_read(address, buffer) | ||
| 832 | } | ||
| 833 | } | ||
| 834 | |||
| 835 | impl<'d, M: PeriMode, IM: MasterMode> embedded_hal_02::blocking::i2c::Write for I2c<'d, M, IM> { | ||
| 836 | type Error = Error; | ||
| 837 | |||
| 838 | fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Self::Error> { | ||
| 839 | self.blocking_write(address, write) | ||
| 840 | } | ||
| 841 | } | ||
| 842 | |||
| 843 | impl<'d, M: PeriMode, IM: MasterMode> embedded_hal_02::blocking::i2c::WriteRead for I2c<'d, M, IM> { | ||
| 844 | type Error = Error; | ||
| 845 | |||
| 846 | fn write_read(&mut self, address: u8, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 847 | self.blocking_write_read(address, write, read) | ||
| 848 | } | ||
| 849 | } | ||
| 850 | |||
| 851 | impl<'d, M: PeriMode, IM: MasterMode> embedded_hal_1::i2c::I2c for I2c<'d, M, IM> { | ||
| 852 | fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 853 | self.blocking_read(address, read) | ||
| 854 | } | ||
| 855 | |||
| 856 | fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Self::Error> { | ||
| 857 | self.blocking_write(address, write) | ||
| 858 | } | ||
| 859 | |||
| 860 | fn write_read(&mut self, address: u8, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 861 | self.blocking_write_read(address, write, read) | ||
| 862 | } | ||
| 863 | |||
| 864 | fn transaction( | ||
| 865 | &mut self, | ||
| 866 | address: u8, | ||
| 867 | operations: &mut [embedded_hal_1::i2c::Operation<'_>], | ||
| 868 | ) -> Result<(), Self::Error> { | ||
| 869 | self.blocking_transaction(address, operations) | ||
| 870 | } | ||
| 871 | } | ||
| 872 | |||
| 873 | impl<'d, IM: MasterMode> embedded_hal_async::i2c::I2c for I2c<'d, Async, IM> { | ||
| 874 | async fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 875 | self.read(address, read).await | ||
| 876 | } | ||
| 877 | |||
| 878 | async fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Self::Error> { | ||
| 879 | self.write(address, write).await | ||
| 880 | } | ||
| 881 | |||
| 882 | async fn write_read(&mut self, address: u8, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 883 | self.write_read(address, write, read).await | ||
| 884 | } | ||
| 885 | |||
| 886 | async fn transaction( | ||
| 887 | &mut self, | ||
| 888 | address: u8, | ||
| 889 | operations: &mut [embedded_hal_1::i2c::Operation<'_>], | ||
| 890 | ) -> Result<(), Self::Error> { | ||
| 891 | self.transaction(address, operations).await | ||
| 892 | } | ||
| 893 | } | ||
diff --git a/embassy-stm32/src/i2c/v2.rs b/embassy-stm32/src/i2c/v2.rs index 86efd0da2..6dd7c4079 100644 --- a/embassy-stm32/src/i2c/v2.rs +++ b/embassy-stm32/src/i2c/v2.rs | |||
| @@ -1203,3 +1203,91 @@ impl<'d, M: Mode> SetConfig for I2c<'d, M, MultiMaster> { | |||
| 1203 | Ok(()) | 1203 | Ok(()) |
| 1204 | } | 1204 | } |
| 1205 | } | 1205 | } |
| 1206 | |||
| 1207 | // ======== Embedded HAL impls ======== | ||
| 1208 | |||
| 1209 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_02::blocking::i2c::AddressMode> | ||
| 1210 | embedded_hal_02::blocking::i2c::Read<A> for I2c<'d, M, IM> | ||
| 1211 | where | ||
| 1212 | A: Into<Address>, | ||
| 1213 | { | ||
| 1214 | type Error = Error; | ||
| 1215 | |||
| 1216 | fn read(&mut self, address: A, buffer: &mut [u8]) -> Result<(), Self::Error> { | ||
| 1217 | self.blocking_read(address.into(), buffer) | ||
| 1218 | } | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_02::blocking::i2c::AddressMode> | ||
| 1222 | embedded_hal_02::blocking::i2c::Write<A> for I2c<'d, M, IM> | ||
| 1223 | where | ||
| 1224 | A: Into<Address>, | ||
| 1225 | { | ||
| 1226 | type Error = Error; | ||
| 1227 | |||
| 1228 | fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> { | ||
| 1229 | self.blocking_write(address.into(), write) | ||
| 1230 | } | ||
| 1231 | } | ||
| 1232 | |||
| 1233 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_02::blocking::i2c::AddressMode> | ||
| 1234 | embedded_hal_02::blocking::i2c::WriteRead<A> for I2c<'d, M, IM> | ||
| 1235 | where | ||
| 1236 | A: Into<Address>, | ||
| 1237 | { | ||
| 1238 | type Error = Error; | ||
| 1239 | |||
| 1240 | fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 1241 | self.blocking_write_read(address.into(), write, read) | ||
| 1242 | } | ||
| 1243 | } | ||
| 1244 | |||
| 1245 | impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_1::i2c::AddressMode> embedded_hal_1::i2c::I2c<A> for I2c<'d, M, IM> | ||
| 1246 | where | ||
| 1247 | Address: From<A>, | ||
| 1248 | { | ||
| 1249 | fn read(&mut self, address: A, read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 1250 | self.blocking_read(address.into(), read) | ||
| 1251 | } | ||
| 1252 | |||
| 1253 | fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> { | ||
| 1254 | self.blocking_write(address.into(), write) | ||
| 1255 | } | ||
| 1256 | |||
| 1257 | fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 1258 | self.blocking_write_read(address.into(), write, read) | ||
| 1259 | } | ||
| 1260 | |||
| 1261 | fn transaction( | ||
| 1262 | &mut self, | ||
| 1263 | address: A, | ||
| 1264 | operations: &mut [embedded_hal_1::i2c::Operation<'_>], | ||
| 1265 | ) -> Result<(), Self::Error> { | ||
| 1266 | self.blocking_transaction(address.into(), operations) | ||
| 1267 | } | ||
| 1268 | } | ||
| 1269 | |||
| 1270 | impl<'d, IM: MasterMode, A: embedded_hal_async::i2c::AddressMode> embedded_hal_async::i2c::I2c<A> for I2c<'d, Async, IM> | ||
| 1271 | where | ||
| 1272 | Address: From<A>, | ||
| 1273 | { | ||
| 1274 | async fn read(&mut self, address: A, read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 1275 | self.read(address.into(), read).await | ||
| 1276 | } | ||
| 1277 | |||
| 1278 | async fn write(&mut self, address: A, write: &[u8]) -> Result<(), Self::Error> { | ||
| 1279 | self.write(address.into(), write).await | ||
| 1280 | } | ||
| 1281 | |||
| 1282 | async fn write_read(&mut self, address: A, write: &[u8], read: &mut [u8]) -> Result<(), Self::Error> { | ||
| 1283 | self.write_read(address.into(), write, read).await | ||
| 1284 | } | ||
| 1285 | |||
| 1286 | async fn transaction( | ||
| 1287 | &mut self, | ||
| 1288 | address: A, | ||
| 1289 | operations: &mut [embedded_hal_1::i2c::Operation<'_>], | ||
| 1290 | ) -> Result<(), Self::Error> { | ||
| 1291 | self.transaction(address.into(), operations).await | ||
| 1292 | } | ||
| 1293 | } | ||
