Abstractions

This commit is contained in:
Jeremy Soller
2020-12-01 15:14:45 -07:00
parent bbd188a0e0
commit 3b216d12d5

View File

@@ -4,25 +4,60 @@ use i2cdev::linux::LinuxI2CDevice;
const IECS_CMD: u8 = 8;
const IECS_DATA: u8 = 9;
const MSG_OUT_RDATA: u8 = 18;
const CMD_AFRR: &'static [u8] = &[b'A', b'F', b'R', b'R'];
const CMD_AFRR: u32 = 0x52524641;
const CMD_AUTH: u32 = 0x48545541;
const CMD_BLKW: u32 = 0x574b4c42;
const CMD_BOPS: u32 = 0x53504f42;
const CMD_PCYC: u32 = 0x43594350;
fn read<I: I2CDevice>(dev: &mut I, reg: u8) -> Result<u32, I::Error> {
let bytes = dev.smbus_read_block_data(reg)?;
//TODO: return error on bytes.len() != 4
Ok(
bytes[0] as u32 |
(bytes[1] as u32) << 8 |
(bytes[2] as u32) << 16 |
(bytes[3] as u32) << 24
)
}
fn write<I: I2CDevice>(dev: &mut I, reg: u8, data: u32) -> Result<(), I::Error> {
let bytes = [
data as u8,
(data >> 8) as u8,
(data >> 16) as u8,
(data >> 24) as u8,
];
dev.smbus_write_block_data(reg, &bytes)
}
fn command<I: I2CDevice>(dev: &mut I, cmd: u32) -> Result<u32, I::Error> {
write(dev, IECS_CMD, cmd)?;
loop {
let status = read(dev, IECS_CMD)?;
println!("Status: {:X}", status);
if status != cmd {
//TODO: perform error checking here
return Ok(status);
}
}
}
fn main() {
let mut dev = LinuxI2CDevice::new("/dev/i2c-11", 0x40).unwrap();
println!("Vendor: {:X?}", dev.smbus_read_block_data(0));
println!("Device: {:X?}", dev.smbus_read_block_data(1));
println!("Vendor: {:X}", read(&mut dev, 0).unwrap());
println!("Device: {:X}", read(&mut dev, 1).unwrap());
for offset in 0..=8 {
dev.smbus_write_block_data(IECS_DATA, &[offset, 0, 0, 0]).unwrap();
dev.smbus_write_block_data(IECS_CMD, CMD_AFRR).unwrap();
loop {
let data = dev.smbus_read_block_data(IECS_CMD).unwrap();
println!("{:?}", data);
if data.as_slice() != CMD_AFRR {
break;
}
write(&mut dev, IECS_DATA, offset).unwrap();
let status = command(&mut dev, CMD_AFRR).unwrap();
if status == 0 {
let data = read(&mut dev, MSG_OUT_RDATA).unwrap();
println!("{:X}: {:X}", offset, data);
} else {
println!("{:X}: Error {:X}", offset, status);
}
println!("{:X}: {:X?}", offset, dev.smbus_read_block_data(MSG_OUT_RDATA));
}
}