1#![no_std]
2
3use embedded_hal::spi::SpiDevice;
4use smallvec::SmallVec;
5
6pub struct ICMU<SPI> {
7 spi: SPI,
8 buf_tx: SmallVec<[u8; 256]>,
9 buf_rx: SmallVec<[u8; 256]>,
10}
11
12#[repr(u8)]
13enum Opcode {
14 Activate = 0xB0,
15 SdadTransmission = 0xA6,
16 SdadStatus = 0xF5,
17 ReadRegister = 0x97,
18 WriteRegister = 0xD2,
19 RegisterStatusData = 0xAD,
20}
21
22impl<SPI: SpiDevice> ICMU<SPI> {
23 pub fn new(spi: SPI) -> Self {
24 Self {
25 spi,
26 buf_tx: SmallVec::new(),
27 buf_rx: SmallVec::new(),
28 }
29 }
30
31 pub fn activate(&mut self, active_vector: &[u8]) -> Result<(), SPI::Error> {
32 self.buf_tx.push(Opcode::Activate as u8);
33 self.buf_tx.extend_from_slice(active_vector);
34
35 let ret = self.spi.write(&self.buf_tx);
36 self.buf_tx.clear();
37 ret
38 }
39
40 pub fn sdad_transmission(&mut self, data_rx: &mut [u8]) -> Result<(), SPI::Error> {
41 let bufsize = data_rx.len() + 1;
42 self.buf_tx.push(Opcode::SdadTransmission as u8);
43 self.buf_tx.resize(bufsize, 0);
44 self.buf_rx.resize(bufsize, 0);
45
46 let ret = self.spi.transfer(&mut self.buf_rx, &self.buf_tx);
47 data_rx.copy_from_slice(&self.buf_rx[1..bufsize]);
48 self.buf_tx.clear();
49 self.buf_rx.clear();
50 ret
51 }
52
53 pub fn sdad_status(&mut self, svalid_vector: &mut [u8]) -> Result<(), SPI::Error> {
54 let bufsize = svalid_vector.len() + 1;
55 self.buf_tx.push(Opcode::SdadStatus as u8);
56 self.buf_tx.resize(bufsize, 0);
57 self.buf_rx.resize(bufsize, 0);
58
59 let ret = self.spi.transfer(&mut self.buf_rx, &self.buf_tx);
60 svalid_vector.copy_from_slice(&self.buf_rx[1..bufsize]);
61 self.buf_tx.clear();
62 self.buf_rx.clear();
63 ret
64 }
65
66 pub fn read_register(&mut self, addr: u8) -> Result<(), SPI::Error> {
67 self.buf_tx.push(Opcode::ReadRegister as u8);
68 self.buf_tx.push(addr);
69
70 let ret = self.spi.write(&self.buf_tx);
71 self.buf_tx.clear();
72 ret
73 }
74
75 pub fn write_register(&mut self, addr: u8, data_tx: u8) -> Result<(), SPI::Error> {
76 self.buf_tx.push(Opcode::WriteRegister as u8);
77 self.buf_tx.push(addr);
78 self.buf_tx.push(data_tx);
79
80 let ret = self.spi.write(&self.buf_tx);
81 self.buf_tx.clear();
82 ret
83 }
84
85 pub fn register_status_data(&mut self) -> Result<(u8, u8), SPI::Error> {
86 self.buf_tx.push(Opcode::RegisterStatusData as u8);
87 self.buf_tx.resize(3, 0);
88
89 let ret = self.spi.transfer(&mut self.buf_rx, &self.buf_tx);
90 let status_rx = self.buf_rx[1];
91 let data_rx = self.buf_rx[2];
92 self.buf_tx.clear();
93 self.buf_rx.clear();
94 ret?;
95 Ok((status_rx, data_rx))
96 }
97}