From 3e5514653fd13a27b3be504513478503e8b9de2d Mon Sep 17 00:00:00 2001 From: Tom Dohrmann Date: Sun, 26 Jan 2025 17:34:33 +0100 Subject: [PATCH] remove checks for reserved I2c addresses There are some non-compliant devices that respond to reserved I2c addresses. rp2040 behaves sanely for these addresses, so let's just allow using them. --- embassy-rp/src/i2c.rs | 13 ++++--------- embassy-rp/src/i2c_slave.rs | 5 +---- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/embassy-rp/src/i2c.rs b/embassy-rp/src/i2c.rs index 32778215f..3a2ee666c 100644 --- a/embassy-rp/src/i2c.rs +++ b/embassy-rp/src/i2c.rs @@ -1,3 +1,5 @@ +#![cfg_attr(feature = "defmt", allow(deprecated))] // Suppress warnings for defmt::Format using Error::AddressReserved + //! I2C driver. use core::future; use core::marker::PhantomData; @@ -40,6 +42,7 @@ pub enum Error { /// Target i2c address is out of range AddressOutOfRange(u16), /// Target i2c address is reserved + #[deprecated = "embassy_rp no longer prevents accesses to reserved addresses."] AddressReserved(u16), } @@ -470,10 +473,6 @@ impl<'d, T: Instance + 'd, M: Mode> I2c<'d, T, M> { return Err(Error::AddressOutOfRange(addr)); } - if i2c_reserved_addr(addr) { - return Err(Error::AddressReserved(addr)); - } - let p = T::regs(); p.ic_enable().write(|w| w.set_enable(false)); p.ic_tar().write(|w| w.set_ic_tar(addr)); @@ -680,6 +679,7 @@ impl embedded_hal_1::i2c::Error for Error { Self::InvalidReadBufferLength => embedded_hal_1::i2c::ErrorKind::Other, Self::InvalidWriteBufferLength => embedded_hal_1::i2c::ErrorKind::Other, Self::AddressOutOfRange(_) => embedded_hal_1::i2c::ErrorKind::Other, + #[allow(deprecated)] Self::AddressReserved(_) => embedded_hal_1::i2c::ErrorKind::Other, } } @@ -775,11 +775,6 @@ impl<'d, T: Instance, M: Mode> embassy_embedded_hal::SetConfig for I2c<'d, T, M> } } -/// Check if address is reserved. -pub fn i2c_reserved_addr(addr: u16) -> bool { - ((addr & 0x78) == 0 || (addr & 0x78) == 0x78) && addr != 0 -} - pub(crate) trait SealedInstance { fn regs() -> crate::pac::i2c::I2c; fn reset() -> crate::pac::resets::regs::Peripherals; diff --git a/embassy-rp/src/i2c_slave.rs b/embassy-rp/src/i2c_slave.rs index c46a55d2e..d17b11d14 100644 --- a/embassy-rp/src/i2c_slave.rs +++ b/embassy-rp/src/i2c_slave.rs @@ -6,9 +6,7 @@ use core::task::Poll; use embassy_hal_internal::into_ref; use pac::i2c; -use crate::i2c::{ - i2c_reserved_addr, set_up_i2c_pin, AbortReason, Instance, InterruptHandler, SclPin, SdaPin, FIFO_SIZE, -}; +use crate::i2c::{set_up_i2c_pin, AbortReason, Instance, InterruptHandler, SclPin, SdaPin, FIFO_SIZE}; use crate::interrupt::typelevel::{Binding, Interrupt}; use crate::{pac, Peripheral}; @@ -97,7 +95,6 @@ impl<'d, T: Instance> I2cSlave<'d, T> { ) -> Self { into_ref!(_peri, scl, sda); - assert!(!i2c_reserved_addr(config.addr)); assert!(config.addr != 0); // Configure SCL & SDA pins