port_expander/
bus.rs

1use embedded_hal::{i2c as hal_i2c, spi as hal_spi};
2
3/// Blanket trait for types implementing `i2c::I2c
4pub trait I2cBus: hal_i2c::I2c {
5    type BusError: From<<Self as hal_i2c::ErrorType>::Error>;
6}
7
8impl<T, E> I2cBus for T
9where
10    T: hal_i2c::I2c<Error = E>,
11{
12    type BusError = E;
13}
14
15pub(crate) trait I2cExt {
16    type Error;
17
18    fn write_reg<R: Into<u8>>(&mut self, addr: u8, reg: R, value: u8) -> Result<(), Self::Error>;
19    fn update_reg<R: Into<u8>>(
20        &mut self,
21        addr: u8,
22        reg: R,
23        mask_set: u8,
24        mask_clear: u8,
25    ) -> Result<(), Self::Error>;
26    fn read_reg<R: Into<u8>>(&mut self, addr: u8, reg: R) -> Result<u8, Self::Error>;
27}
28
29impl<I2C: I2cBus> I2cExt for I2C {
30    type Error = I2C::BusError;
31
32    fn write_reg<R: Into<u8>>(&mut self, addr: u8, reg: R, value: u8) -> Result<(), Self::Error> {
33        self.write(addr, &[reg.into(), value])?;
34        Ok(())
35    }
36
37    fn update_reg<R: Into<u8>>(
38        &mut self,
39        addr: u8,
40        reg: R,
41        mask_set: u8,
42        mask_clear: u8,
43    ) -> Result<(), Self::Error> {
44        let reg = reg.into();
45        let mut buf = [0x00];
46        self.write_read(addr, &[reg], &mut buf)?;
47        buf[0] |= mask_set;
48        buf[0] &= !mask_clear;
49        self.write(addr, &[reg, buf[0]])?;
50        Ok(())
51    }
52
53    fn read_reg<R: Into<u8>>(&mut self, addr: u8, reg: R) -> Result<u8, Self::Error> {
54        let mut buf = [0x00];
55        self.write_read(addr, &[reg.into()], &mut buf)?;
56        Ok(buf[0])
57    }
58}
59
60pub trait SpiBus: hal_spi::SpiDevice {
61    type BusError: From<<Self as hal_spi::ErrorType>::Error>;
62}
63
64impl<T, E> SpiBus for T
65where
66    T: hal_spi::SpiDevice<Error = E>,
67{
68    type BusError = E;
69}