Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/se05x.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,10 @@ where
}

#[cfg(feature = "embedded-hal-v1.0")]
impl<M, N, E> Se05X<crate::embedded_hal::Hal10<M>, crate::embedded_hal::Hal10<N>>
impl<M, N> Se05X<crate::embedded_hal::Hal10<M>, crate::embedded_hal::Hal10<N>>
where
N: embedded_hal_v1_0::delay::DelayNs,
M: embedded_hal_v1_0::i2c::I2c<Error = E>,
E: crate::t1::I2CErrorNack,
M: embedded_hal_v1_0::i2c::I2c,
{
pub fn new_hal_10(twi: M, se_address: u8, delay: N) -> Self {
Self::new(
Expand Down
87 changes: 84 additions & 3 deletions src/t1.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Copyright (C) 2023 Nitrokey GmbH
// SPDX-License-Identifier: LGPL-3.0-only

#[cfg(feature = "embedded-hal-v1.0")]
use embedded_hal_v1_0::i2c::{Error as _, ErrorKind, NoAcknowledgeSource};
use hex_literal::hex;
use iso7816::command::writer::IntoWriter;
use iso7816::command::Writer;
Expand Down Expand Up @@ -277,10 +279,39 @@ impl Pcb {
}
}

// enable successful build if no embedded-hal version is selected
#[cfg(all(
not(feature = "embedded-hal-v1.0"),
not(feature = "embedded-hal-v0.2.7")
))]
pub trait I2CForT1:
Read<u8, Error = <Self as I2CForT1>::Error>
+ Write<u8, Error = <Self as I2CForT1>::Error>
+ WriteRead<u8, Error = <Self as I2CForT1>::Error>
{
type Error;
}

// enable successful build if no embedded-hal version is selected
#[cfg(all(
not(feature = "embedded-hal-v1.0"),
not(feature = "embedded-hal-v0.2.7")
))]
impl<T> I2CForT1 for T
where
T: Read<u8>
+ Write<u8, Error = <T as Read<u8>>::Error>
+ WriteRead<u8, Error = <T as Read<u8>>::Error>,
{
type Error = <T as Read<u8>>::Error;
}

pub trait I2CErrorNack: Debug {
fn is_address_nack(&self) -> bool;
fn is_data_nack(&self) -> bool;
}

#[cfg(feature = "embedded-hal-v0.2.7")]
pub trait I2CForT1:
Read<u8, Error = <Self as I2CForT1>::Error>
+ Write<u8, Error = <Self as I2CForT1>::Error>
Expand All @@ -289,6 +320,7 @@ pub trait I2CForT1:
type Error: I2CErrorNack;
}

#[cfg(feature = "embedded-hal-v0.2.7")]
impl<T> I2CForT1 for T
where
T: Read<u8>
Expand All @@ -299,6 +331,26 @@ where
type Error = <T as Read<u8>>::Error;
}

#[cfg(feature = "embedded-hal-v1.0")]
pub trait I2CForT1:
Read<u8, Error = <Self as I2CForT1>::Error>
+ Write<u8, Error = <Self as I2CForT1>::Error>
+ WriteRead<u8, Error = <Self as I2CForT1>::Error>
{
type Error: embedded_hal_v1_0::i2c::Error;
}

#[cfg(feature = "embedded-hal-v1.0")]
impl<T> I2CForT1 for T
where
T: Read<u8>
+ Write<u8, Error = <T as Read<u8>>::Error>
+ WriteRead<u8, Error = <T as Read<u8>>::Error>,
<T as Read<u8>>::Error: embedded_hal_v1_0::i2c::Error,
{
type Error = <T as Read<u8>>::Error;
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Error {
Unknown,
Expand Down Expand Up @@ -405,11 +457,10 @@ where
}

#[cfg(feature = "embedded-hal-v1.0")]
impl<M, N, E> T1oI2C<crate::embedded_hal::Hal10<M>, crate::embedded_hal::Hal10<N>>
impl<M, N> T1oI2C<crate::embedded_hal::Hal10<M>, crate::embedded_hal::Hal10<N>>
where
N: embedded_hal_v1_0::delay::DelayNs,
M: embedded_hal_v1_0::i2c::I2c<Error = E>,
E: I2CErrorNack,
M: embedded_hal_v1_0::i2c::I2c<Error = ErrorKind>,
{
pub fn new_hal_10(twi: M, se_address: u8, delay: N) -> Self {
Self::new(
Expand Down Expand Up @@ -445,7 +496,17 @@ impl<Twi: I2CForT1, D: Delay> T1oI2C<Twi, D> {
trace!("Writing");
match self.twi.write(self.se_address, data) {
Ok(_) => Ok(()),
#[cfg(feature = "embedded-hal-v1.0")]
Err(err) if err.kind() == ErrorKind::NoAcknowledge(NoAcknowledgeSource::Address) => {
Err(Error::AddressNack)
}
#[cfg(feature = "embedded-hal-v1.0")]
Err(err) if err.kind() == ErrorKind::NoAcknowledge(NoAcknowledgeSource::Data) => {
Err(Error::DataNack)
}
#[cfg(feature = "embedded-hal-v0.2.7")]
Err(err) if err.is_address_nack() => Err(Error::AddressNack),
#[cfg(feature = "embedded-hal-v0.2.7")]
Err(err) if err.is_data_nack() => Err(Error::DataNack),
Err(_err) => {
warn!("Got error: {:?}", _err);
Expand All @@ -457,7 +518,17 @@ impl<Twi: I2CForT1, D: Delay> T1oI2C<Twi, D> {
pub fn read(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
match self.twi.read(self.se_address, buffer) {
Ok(_) => Ok(()),
#[cfg(feature = "embedded-hal-v1.0")]
Err(err) if err.kind() == ErrorKind::NoAcknowledge(NoAcknowledgeSource::Address) => {
Err(Error::AddressNack)
}
#[cfg(feature = "embedded-hal-v1.0")]
Err(err) if err.kind() == ErrorKind::NoAcknowledge(NoAcknowledgeSource::Data) => {
Err(Error::DataNack)
}
#[cfg(feature = "embedded-hal-v0.2.7")]
Err(err) if err.is_address_nack() => Err(Error::AddressNack),
#[cfg(feature = "embedded-hal-v0.2.7")]
Err(err) if err.is_data_nack() => Err(Error::DataNack),
Err(_err) => {
warn!("Got error: {:?}", _err);
Expand All @@ -470,7 +541,17 @@ impl<Twi: I2CForT1, D: Delay> T1oI2C<Twi, D> {
pub fn write_read(&mut self, data: &[u8], buffer: &mut [u8]) -> Result<(), Error> {
match self.twi.write_read(self.se_address, data, buffer) {
Ok(_) => Ok(()),
#[cfg(feature = "embedded-hal-v1.0")]
Err(err) if err.kind() == ErrorKind::NoAcknowledge(NoAcknowledgeSource::Address) => {
Err(Error::AddressNack)
}
#[cfg(feature = "embedded-hal-v1.0")]
Err(err) if err.kind() == ErrorKind::NoAcknowledge(NoAcknowledgeSource::Data) => {
Err(Error::DataNack)
}
#[cfg(feature = "embedded-hal-v0.2.7")]
Err(err) if err.is_address_nack() => Err(Error::AddressNack),
#[cfg(feature = "embedded-hal-v0.2.7")]
Err(err) if err.is_data_nack() => Err(Error::DataNack),
Err(_err) => {
warn!("Unknown error when writing & reading: {:?}", _err);
Expand Down
20 changes: 0 additions & 20 deletions src/t1/i2cimpl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,3 @@ mod lpc55_04 {
}
}
}

#[cfg(feature = "embedded-hal-v1.0")]
impl crate::t1::I2CErrorNack for embedded_hal_v1_0::i2c::ErrorKind {
fn is_address_nack(&self) -> bool {
matches!(
self,
embedded_hal_v1_0::i2c::ErrorKind::NoAcknowledge(
embedded_hal_v1_0::i2c::NoAcknowledgeSource::Address
)
)
}
fn is_data_nack(&self) -> bool {
matches!(
self,
embedded_hal_v1_0::i2c::ErrorKind::NoAcknowledge(
embedded_hal_v1_0::i2c::NoAcknowledgeSource::Data
)
)
}
}