From f60893c6563bad3f8e9fec60df93a6bc93840029 Mon Sep 17 00:00:00 2001 From: mwojcik Date: Fri, 25 Feb 2022 17:20:34 +0800 Subject: [PATCH] expose pca954x_select api --- src/libboard_artiq/src/drtioaux_proto.rs | 16 ++++++++++++++++ src/runtime/src/i2c.rs | 12 ++++++++++++ src/runtime/src/kernel/api.rs | 1 + src/satman/src/main.rs | 6 ++++++ 4 files changed, 35 insertions(+) diff --git a/src/libboard_artiq/src/drtioaux_proto.rs b/src/libboard_artiq/src/drtioaux_proto.rs index 62523d6..3cc8118 100644 --- a/src/libboard_artiq/src/drtioaux_proto.rs +++ b/src/libboard_artiq/src/drtioaux_proto.rs @@ -47,6 +47,7 @@ pub enum Packet { I2cReadRequest { destination: u8, busno: u8, ack: bool }, I2cReadReply { succeeded: bool, data: u8 }, I2cBasicReply { succeeded: bool }, + I2cPca954xSelectRequest { destination: u8, busno: u8, address: u8, channel: u8, clear: bool }, SpiSetConfigRequest { destination: u8, busno: u8, flags: u8, length: u8, div: u8, cs: u8 }, SpiWriteRequest { destination: u8, busno: u8, data: u32 }, @@ -152,6 +153,13 @@ impl Packet { 0x87 => Packet::I2cBasicReply { succeeded: reader.read_bool()? }, + 0x88 => Packet::I2cPca954xSelectRequest { + destination: reader.read_u8()?, + busno: reader.read_u8()?, + address: reader.read_u8()?, + channel: reader.read_u8()?, + clear: reader.read_bool()? + }, 0x90 => Packet::SpiSetConfigRequest { destination: reader.read_u8()?, @@ -301,6 +309,14 @@ impl Packet { writer.write_u8(0x87)?; writer.write_bool(succeeded)?; }, + Packet::I2cPca954xSelectRequest { destination, busno, address, channel, clear } => { + writer.write_u8(0x88)?; + writer.write_u8(destination)?; + writer.write_u8(busno)?; + writer.write_u8(address)?; + writer.write_u8(channel)?; + writer.write_bool(clear)?; + }, Packet::SpiSetConfigRequest { destination, busno, flags, length, div, cs } => { writer.write_u8(0x90)?; diff --git a/src/runtime/src/i2c.rs b/src/runtime/src/i2c.rs index b8c5bcf..42f19a9 100644 --- a/src/runtime/src/i2c.rs +++ b/src/runtime/src/i2c.rs @@ -60,6 +60,18 @@ pub extern fn read(busno: i32, ack: bool) -> i32 { } } +pub extern fn pca954x_select(busno: i32, address: i32, channel: i32, clear: bool) { + if busno > 0 { + artiq_raise!("I2CError", "I2C bus could not be accessed"); + } + unsafe { + let ch = if clear { None } else { Some(channel as u8) }; + if (&mut I2C_BUS).as_mut().unwrap().pca954x_select(address as u8, ch).is_err() { + artiq_raise!("I2CError", "PCA954X select failed"); + } + } +} + pub fn init() { let mut i2c = libboard_zynq::i2c::I2c::i2c0(); i2c.init().expect("I2C bus initialization failed"); diff --git a/src/runtime/src/kernel/api.rs b/src/runtime/src/kernel/api.rs index a234c8b..bf07008 100644 --- a/src/runtime/src/kernel/api.rs +++ b/src/runtime/src/kernel/api.rs @@ -116,6 +116,7 @@ pub fn resolve(required: &[u8]) -> Option { api!(i2c_stop = i2c::stop), api!(i2c_write = i2c::write), api!(i2c_read = i2c::read), + api!(i2c_pca954x_select = i2c::pca954x_select), // Double-precision floating-point arithmetic helper functions // RTABI chapter 4.1.2, Table 2 diff --git a/src/satman/src/main.rs b/src/satman/src/main.rs index 69693a1..1a75e64 100644 --- a/src/satman/src/main.rs +++ b/src/satman/src/main.rs @@ -282,6 +282,12 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], &drtioaux::Packet::I2cReadReply { succeeded: false, data: 0xff }) } } + drtioaux::Packet::I2cStartRequest { destination: _destination, busno: _busno, address, channel, clear } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); + let ch = if clear { None } else { Some(channel as u8) }; + let succeeded = i2c.pca954x_select(address, channel).is_ok(); + drtioaux::send(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded }) + } drtioaux::Packet::SpiSetConfigRequest { destination: _destination, busno: _busno, flags: _flags, length: _length, div: _div, cs: _cs } => {