tof_control/device/
max5825.rs

1#![allow(unused)]
2use crate::constant::*;
3
4use i2cdev::core::*;
5use i2cdev::linux::{LinuxI2CDevice, LinuxI2CError};
6
7// Readback Register
8const DEVICE_INFO: u16 = 0xFF;
9const READBACK_CODEN: u16 = 0x80;
10const READBACK_DACN: u16 = 0x90;
11// Configuration Register
12const REF_EXT: u16 = 0x20;
13const SW_CLEAR: u16 = 0x34;
14// DAC Register
15const CODEN_LOADN: u16 = 0xB0;
16
17pub struct MAX5825 {
18    bus: u8,
19    address: u16,
20}
21
22impl MAX5825 {
23    pub fn new(bus: u8, address: u16) -> Self {
24        Self { bus, address }
25    }
26    pub fn configure(&self) -> Result<(), LinuxI2CError> {
27        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
28        self.set_reference_voltage(&mut dev)?;
29
30        Ok(())
31    }
32    pub fn reset_dac(&self) -> Result<(), LinuxI2CError> {
33        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
34        let sw_clear_data: [u8; 2] = [0x96, 0x30];
35        dev.smbus_write_i2c_block_data(SW_CLEAR as u8, &sw_clear_data);
36
37        Ok(())
38    }
39    fn set_reference_voltage(&self, dev: &mut LinuxI2CDevice) -> Result<(), LinuxI2CError> {
40        dev.smbus_write_byte(REF_EXT as u8)
41    }
42    pub fn read_device_info(&self) -> Result<(u8, u8, u8, u8, u8), LinuxI2CError> {
43        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
44        let device_info = dev.smbus_read_i2c_block_data(DEVICE_INFO as u8, 2)?;
45        let wd_enabled = (device_info[0] & 0x80) >> 7;
46        let ref_mode = (device_info[0] & 0x70) >> 4;
47        let clr_enabled = (device_info[0] & 0x08) >> 3;
48        let rev_id = device_info[0] & 0x07;
49        let device_id = device_info[1];
50
51        Ok((wd_enabled, ref_mode, clr_enabled, rev_id, device_id))
52    }
53    pub fn read_coden(&self, channel: u8) -> Result<(u16), LinuxI2CError> {
54        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
55        let coden_buf = dev.smbus_read_i2c_block_data(((READBACK_CODEN as u8) | channel), 2)?;
56        let coden = ((coden_buf[0] as u16) << 4) | (((coden_buf[1] as u16) & 0xF0) >> 4);
57
58        Ok((coden))
59    }
60    pub fn read_dacn(&self, channel: u8) -> Result<(u16), LinuxI2CError> {
61        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
62        let dacn_buf = dev.smbus_read_i2c_block_data(((READBACK_DACN as u8) | channel), 2)?;
63        let dacn = ((dacn_buf[0] as u16) << 4) | (((dacn_buf[1] as u16) & 0xF0) >> 4);
64
65        Ok((dacn))
66    }
67    pub fn coden_loadn(&self, channel: u8, adc: u16) -> Result<(), LinuxI2CError> {
68        let mut dev = LinuxI2CDevice::new(&format!("/dev/i2c-{}", self.bus), self.address)?;
69        let code_register_data = [((adc >> 4) as u8) & 0xFF, ((adc & 0x0F) as u8) << 4];
70        dev.smbus_write_i2c_block_data(((CODEN_LOADN as u8) | channel), &code_register_data)?;
71
72        Ok(())
73    }
74}