hardware_registers/
i2c.rs

1//! Support for I²C registers.
2
3mod device_address;
4
5pub use crate::i2c::device_address::{DeviceAddress, DeviceAddress10, DeviceAddress7};
6pub use crate::register_address::{RegisterAddress, RegisterAddress16, RegisterAddress8};
7use crate::sizes::{RegisterSizeInformation, R1, R2};
8use crate::{FromBits, HardwareRegister, ToBits, WritableHardwareRegister};
9
10/// A readable I²C register.
11pub trait I2CRegister<D, R, Size>:
12    HardwareRegister<Size> + ToBits<Target = Self::Backing> + FromBits<Self::Backing>
13where
14    D: DeviceAddress,
15    R: RegisterAddress,
16    Size: RegisterSizeInformation,
17{
18    /// The factory-default device address.
19    const DEFAULT_DEVICE_ADDRESS: D;
20
21    /// The register address
22    const REGISTER_ADDRESS: R;
23
24    /// The backing type for the register, e.g. `u8` for an 8-bit register, or `u16` for a 10-bit register.
25    type Backing;
26}
27
28/// A writable I²C register.
29pub trait WritableI2CRegister<D, R, Size>:
30    I2CRegister<D, R, Size> + WritableHardwareRegister<Size>
31where
32    D: DeviceAddress,
33    R: RegisterAddress,
34    Size: RegisterSizeInformation,
35{
36}
37
38/// Auto-implement [`WritableI2CRegister`] for any fitting writable register.
39impl<I, D, R, Size> WritableI2CRegister<D, R, Size> for I
40where
41    I: I2CRegister<D, R, Size> + WritableHardwareRegister<Size>,
42    D: DeviceAddress,
43    R: RegisterAddress,
44    Size: RegisterSizeInformation,
45{
46}
47
48/// Marker trait for readable 8-bit I²C registers.
49pub trait I2CRegister8<D>:
50    I2CRegister<D, RegisterAddress8, R1, Backing = u8>
51    + HardwareRegister<R1>
52    + Copy
53    + Clone
54    + ToBits<Target = u8>
55    + FromBits<u8>
56where
57    D: DeviceAddress,
58{
59}
60
61/// Marker trait for writable 8-bit I²C registers.
62pub trait WritableI2CRegister8<D>:
63    WritableI2CRegister<D, RegisterAddress8, R1> + WritableHardwareRegister<R1> + Copy + Clone
64where
65    D: DeviceAddress,
66{
67}
68
69/// Marker trait for readable 16-bit I²C registers.
70pub trait I2CRegister16<D>:
71    I2CRegister<D, RegisterAddress16, R2> + HardwareRegister<R2> + Copy + Clone
72where
73    D: DeviceAddress,
74{
75}
76
77/// Marker trait for writable 16-bit I²C registers.
78pub trait WritableI2CRegister16<D>:
79    WritableI2CRegister<D, RegisterAddress16, R2> + WritableHardwareRegister<R2> + Copy + Clone
80where
81    D: DeviceAddress,
82{
83}
84
85/// Auto-implement [`I2CRegister8`] for any fitting register.
86impl<I, D> I2CRegister8<D> for I
87where
88    I: I2CRegister<D, RegisterAddress8, R1, Backing = u8>
89        + HardwareRegister<R1>
90        + Copy
91        + Clone
92        + ToBits<Target = u8>
93        + FromBits<u8>,
94    D: DeviceAddress,
95{
96}
97
98/// Auto-implement [`WritableI2CRegister8`] for any fitting register.
99impl<I, D> WritableI2CRegister8<D> for I
100where
101    I: WritableI2CRegister<D, RegisterAddress8, R1> + WritableHardwareRegister<R1> + Copy + Clone,
102    D: DeviceAddress,
103{
104}
105
106/// Auto-implement [`I2CRegister16`] for any fitting register.
107impl<I, D> I2CRegister16<D> for I
108where
109    I: I2CRegister<D, RegisterAddress16, R2> + HardwareRegister<R2> + Copy + Clone,
110    D: DeviceAddress,
111{
112}
113
114/// Auto-implement [`WritableI2CRegister16`] for any fitting register.
115impl<I, D> WritableI2CRegister16<D> for I
116where
117    I: WritableI2CRegister<D, RegisterAddress16, R2> + WritableHardwareRegister<R2> + Copy + Clone,
118    D: DeviceAddress,
119{
120}