hardware_registers/
spi.rs

1//! Support for SPI registers.
2
3pub use crate::register_address::{RegisterAddress, RegisterAddress16, RegisterAddress8};
4use crate::sizes::{RegisterSizeInformation, R1, R2};
5use crate::{FromBits, HardwareRegister, ToBits, WritableHardwareRegister};
6
7/// A readable SPI register.
8pub trait SPIRegister<R, Size>:
9    HardwareRegister<Size> + ToBits<Target = Self::Backing> + FromBits<Self::Backing>
10where
11    R: RegisterAddress,
12    Size: RegisterSizeInformation,
13{
14    /// The register address
15    const REGISTER_ADDRESS: R;
16
17    /// The backing type for the register, e.g. `u8` for an 8-bit register, or `u16` for a 10-bit register.
18    type Backing;
19}
20
21/// A writable SPI register.
22pub trait WritableSPIRegister<R, Size>:
23    SPIRegister<R, Size> + WritableHardwareRegister<Size>
24where
25    R: RegisterAddress,
26    Size: RegisterSizeInformation,
27{
28}
29
30/// Auto-implement [`WritableSPIRegister`] for any fitting writable register.
31impl<I, R, Size> WritableSPIRegister<R, Size> for I
32where
33    I: SPIRegister<R, Size> + WritableHardwareRegister<Size>,
34    R: RegisterAddress,
35    Size: RegisterSizeInformation,
36{
37}
38
39/// Marker trait for readable 8-bit SPI registers.
40pub trait SPIRegister8:
41    SPIRegister<RegisterAddress8, R1, Backing = u8>
42    + HardwareRegister<R1>
43    + Copy
44    + Clone
45    + ToBits<Target = u8>
46    + FromBits<u8>
47{
48}
49
50/// Marker trait for writable 8-bit SPI registers.
51pub trait WritableSPIRegister8:
52    WritableSPIRegister<RegisterAddress8, R1> + WritableHardwareRegister<R1> + Copy + Clone
53{
54}
55
56/// Marker trait for readable 16-bit SPI registers.
57pub trait SPIRegister16:
58    SPIRegister<RegisterAddress16, R2> + HardwareRegister<R2> + Copy + Clone
59{
60}
61
62/// Marker trait for writable 16-bit SPI registers.
63pub trait WritableSPIRegister16:
64    WritableSPIRegister<RegisterAddress16, R2> + WritableHardwareRegister<R2> + Copy + Clone
65{
66}
67
68/// Auto-implement [`SPIRegister8`] for any fitting register.
69impl<I> SPIRegister8 for I where
70    I: SPIRegister<RegisterAddress8, R1, Backing = u8>
71        + HardwareRegister<R1>
72        + Copy
73        + Clone
74        + ToBits<Target = u8>
75        + FromBits<u8>
76{
77}
78
79/// Auto-implement [`WritableSPIRegister8`] for any fitting register.
80impl<I> WritableSPIRegister8 for I where
81    I: WritableSPIRegister<RegisterAddress8, R1> + WritableHardwareRegister<R1> + Copy + Clone
82{
83}
84
85/// Auto-implement [`SPIRegister16`] for any fitting register.
86impl<I> SPIRegister16 for I where
87    I: SPIRegister<RegisterAddress16, R2> + HardwareRegister<R2> + Copy + Clone
88{
89}
90
91/// Auto-implement [`WritableSPIRegister16`] for any fitting register.
92impl<I> WritableSPIRegister16 for I where
93    I: WritableSPIRegister<RegisterAddress16, R2> + WritableHardwareRegister<R2> + Copy + Clone
94{
95}