artiq-zynq/src/runtime/src/i2c.rs

68 lines
1.7 KiB
Rust
Raw Normal View History

2021-05-29 16:15:27 +08:00
use libboard_zynq;
use crate::artiq_raise;
2020-09-06 00:38:28 +08:00
2021-05-29 16:15:27 +08:00
pub static mut I2C_BUS: Option<libboard_zynq::i2c::I2c> = None;
2020-09-06 00:11:19 +08:00
2021-05-29 16:15:27 +08:00
pub extern fn start(busno: i32) {
if busno > 0 {
artiq_raise!("I2CError", "I2C bus could not be accessed");
2020-09-06 00:11:19 +08:00
}
2021-05-29 16:15:27 +08:00
unsafe {
if (&mut I2C_BUS).as_mut().unwrap().start().is_err() {
artiq_raise!("I2CError", "I2C start failed");
2020-09-06 00:38:28 +08:00
}
2020-09-06 00:11:19 +08:00
}
2021-05-29 16:15:27 +08:00
}
2020-09-06 00:11:19 +08:00
2021-05-29 16:15:27 +08:00
pub extern fn restart(busno: i32) {
if busno > 0 {
artiq_raise!("I2CError", "I2C bus could not be accessed");
2020-09-06 00:38:28 +08:00
}
2021-05-29 16:15:27 +08:00
unsafe {
if (&mut I2C_BUS).as_mut().unwrap().restart().is_err() {
artiq_raise!("I2CError", "I2C restart failed");
2020-09-06 00:38:28 +08:00
}
2020-09-06 00:11:19 +08:00
}
}
2021-05-29 16:15:27 +08:00
pub extern fn stop(busno: i32) {
if busno > 0 {
artiq_raise!("I2CError", "I2C bus could not be accessed");
2020-09-06 00:38:28 +08:00
}
2021-05-29 16:15:27 +08:00
unsafe {
if (&mut I2C_BUS).as_mut().unwrap().stop().is_err() {
artiq_raise!("I2CError", "I2C stop failed");
}
2020-09-06 00:11:19 +08:00
}
2021-05-29 16:15:27 +08:00
}
2020-09-06 00:11:19 +08:00
2021-05-29 16:15:27 +08:00
pub extern fn write(busno: i32, data: i32) -> bool {
if busno > 0 {
artiq_raise!("I2CError", "I2C bus could not be accessed");
2020-09-06 00:38:28 +08:00
}
2021-05-29 16:15:27 +08:00
unsafe {
match (&mut I2C_BUS).as_mut().unwrap().write(data as u8) {
Ok(r) => r,
Err(_) => artiq_raise!("I2CError", "I2C write failed"),
}
2020-11-11 21:17:46 +08:00
}
2021-05-29 16:15:27 +08:00
}
2020-11-11 21:17:46 +08:00
2021-05-29 16:15:27 +08:00
pub extern fn read(busno: i32, ack: bool) -> i32 {
if busno > 0 {
artiq_raise!("I2CError", "I2C bus could not be accessed");
2020-09-06 00:11:19 +08:00
}
2021-05-29 16:15:27 +08:00
unsafe {
match (&mut I2C_BUS).as_mut().unwrap().read(ack) {
Ok(r) => r as i32,
Err(_) => artiq_raise!("I2CError", "I2C read failed"),
}
2020-11-11 21:17:46 +08:00
}
2020-09-06 00:11:19 +08:00
}
2020-11-11 21:17:46 +08:00
2021-05-29 16:15:27 +08:00
pub fn init() {
let mut i2c = libboard_zynq::i2c::I2c::i2c0();
i2c.init().expect("I2C bus initialization failed");
unsafe { I2C_BUS = Some(i2c) };
}