aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjrmoulton <[email protected]>2024-06-18 10:56:46 -0600
committerjrmoulton <[email protected]>2024-08-13 09:46:16 -0600
commit31f224f43c7b0fa6796b4966b310b0bbe8edd14b (patch)
tree0ee54222928012bca64abbda90a36c3a4dd6264e
parent70dfbc03b0399ebeb57ba9b8ee177154325db374 (diff)
move embedded hal impl to version modules to allow for 10bit addr on v2
-rw-r--r--embassy-stm32/src/i2c/mod.rs86
-rw-r--r--embassy-stm32/src/i2c/v1.rs72
-rw-r--r--embassy-stm32/src/i2c/v2.rs88
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
391impl<'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>
393where
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
403impl<'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>
405where
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
415impl<'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>
417where
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
427impl embedded_hal_1::i2c::Error for Error { 391impl 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
447impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_1::i2c::AddressMode> embedded_hal_1::i2c::I2c<A> for I2c<'d, M, IM>
448where
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
472impl<'d, IM: MasterMode, A: embedded_hal_async::i2c::AddressMode> embedded_hal_async::i2c::I2c<A> for I2c<'d, Async, IM>
473where
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
827impl<'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
835impl<'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
843impl<'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
851impl<'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
873impl<'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
1209impl<'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>
1211where
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
1221impl<'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>
1223where
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
1233impl<'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>
1235where
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
1245impl<'d, M: Mode, IM: MasterMode, A: embedded_hal_1::i2c::AddressMode> embedded_hal_1::i2c::I2c<A> for I2c<'d, M, IM>
1246where
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
1270impl<'d, IM: MasterMode, A: embedded_hal_async::i2c::AddressMode> embedded_hal_async::i2c::I2c<A> for I2c<'d, Async, IM>
1271where
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}