tof_control/device/
max5815.rs1#![allow(unused)]
2use crate::constant::*;
3
4use i2cdev::core::*;
5use i2cdev::linux::{LinuxI2CDevice, LinuxI2CError};
6
7const DEVICE_INFO: u16 = 0xFF;
9const READBACK_CODEN: u16 = 0x00;
10const READBACK_DACN: u16 = 0x10;
11const READBACK_CODEA: u16 = 0x80;
12const READBACK_DACA: u16 = 0x81;
13const READBACK_POWER: u16 = 0x40;
14const REF_2_5V: u16 = 0x75;
16const SW_CLEAR: u16 = 0x50;
17const SW_RESET: u16 = 0x51;
18const CODEN_LOADN: u16 = 0x30;
20const LOAD_ALL: u16 = 0x81;
21
22pub struct MAX5815 {
23 bus: u8,
24 address: u16,
25}
26
27impl MAX5815 {
28 pub fn new(bus: u8, address: u16) -> Self {
29 Self { bus, address }
30 }
31 pub fn configure(&self) -> Result<(), LinuxI2CError> {
32 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
33 self.set_reference_voltage(&mut dev)?;
34
35 Ok(())
36 }
37 fn set_reference_voltage(&self, dev: &mut LinuxI2CDevice) -> Result<(), LinuxI2CError> {
38 dev.smbus_write_i2c_block_data(REF_2_5V as u8, &[0x00, 0x00])
39 }
40 pub fn read_device_info(&self) -> Result<(u8, u8, u8), LinuxI2CError> {
41 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
42 let device_info = dev.smbus_read_i2c_block_data(DEVICE_INFO as u8, 2)?;
43 let device_id = device_info[0];
44 let rev_id = (device_info[1] & 0x1C) >> 2;
45 let ref_mode = (device_info[1] & 0x03);
46
47 Ok((device_id, rev_id, ref_mode))
48 }
49 pub fn read_coden(&self, channel: u8) -> Result<(u16), LinuxI2CError> {
50 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
51 let coden_buf = dev.smbus_read_i2c_block_data(((READBACK_CODEN as u8) | channel), 2)?;
52 let coden = ((coden_buf[0] as u16) << 4) | (((coden_buf[1] as u16) & 0xF0) >> 4);
53
54 Ok((coden))
55 }
56 pub fn read_codea(&self) -> Result<(u16), LinuxI2CError> {
57 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
58 let codea_buf = dev.smbus_read_i2c_block_data(READBACK_CODEA as u8, 2)?;
59 let codea = ((codea_buf[0] as u16) << 4) | (((codea_buf[1] as u16) & 0xF0) >> 4);
60
61 Ok((codea))
62 }
63 pub fn read_dacn(&self, channel: u8) -> Result<(u16), LinuxI2CError> {
64 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
65 let dacn_buf = dev.smbus_read_i2c_block_data(((READBACK_DACN as u8) | channel), 2)?;
66 let dacn = ((dacn_buf[0] as u16) << 4) | (((dacn_buf[1] as u16) & 0xF0) >> 4);
67
68 Ok((dacn))
69 }
70 pub fn read_daca(&self) -> Result<(u16), LinuxI2CError> {
71 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
72 let daca_buf = dev.smbus_read_i2c_block_data(READBACK_DACA as u8, 2)?;
73 let daca = ((daca_buf[0] as u16) << 4) | (((daca_buf[1] as u16) & 0xF0) >> 4);
74
75 Ok((daca))
76 }
77 pub fn reset_dac(&self) -> Result<(), LinuxI2CError> {
78 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
79 dev.smbus_write_i2c_block_data(SW_CLEAR as u8, &[0x00, 0x00]);
80
81 Ok(())
82 }
83 pub fn coden_loadn(&self, channel: u8, adc: u16) -> Result<(), LinuxI2CError> {
84 let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
85 let code_register_data = [((adc >> 4) as u8) & 0xFF, ((adc & 0x0F) as u8) << 4];
86 dev.smbus_write_i2c_block_data(((CODEN_LOADN as u8) | channel), &code_register_data)
87 }
88}