From 4f97d00e7932cd12f9bc613c90a4238ec3efb72b Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Thu, 5 Jan 2017 14:54:48 +0100 Subject: [PATCH] firmware: make i2c busno u8 --- artiq/firmware/libboard/i2c.rs | 25 +++++++++++++------------ artiq/firmware/libboard/si5324.rs | 2 +- artiq/firmware/libksupport/lib.rs | 8 ++++---- artiq/firmware/runtime/kernel_proto.rs | 8 ++++---- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/artiq/firmware/libboard/i2c.rs b/artiq/firmware/libboard/i2c.rs index 811f065bd..6a2fb61c8 100644 --- a/artiq/firmware/libboard/i2c.rs +++ b/artiq/firmware/libboard/i2c.rs @@ -2,16 +2,16 @@ use csr; use clock; fn half_period() { clock::spin_us(100) } -fn sda_bit(busno: u32) -> u8 { 1 << (2 * busno + 1) } -fn scl_bit(busno: u32) -> u8 { 1 << (2 * busno) } +fn sda_bit(busno: u8) -> u8 { 1 << (2 * busno + 1) } +fn scl_bit(busno: u8) -> u8 { 1 << (2 * busno) } -fn sda_i(busno: u32) -> bool { +fn sda_i(busno: u8) -> bool { unsafe { csr::i2c::in_read() & sda_bit(busno) != 0 } } -fn sda_oe(busno: u32, oe: bool) { +fn sda_oe(busno: u8, oe: bool) { unsafe { let reg = csr::i2c::oe_read(); let reg = if oe { reg | sda_bit(busno) } else { reg & !sda_bit(busno) }; @@ -19,7 +19,7 @@ fn sda_oe(busno: u32, oe: bool) { } } -fn sda_o(busno: u32, o: bool) { +fn sda_o(busno: u8, o: bool) { unsafe { let reg = csr::i2c::out_read(); let reg = if o { reg | sda_bit(busno) } else { reg & !sda_bit(busno) }; @@ -27,7 +27,7 @@ fn sda_o(busno: u32, o: bool) { } } -fn scl_oe(busno: u32, oe: bool) { +fn scl_oe(busno: u8, oe: bool) { unsafe { let reg = csr::i2c::oe_read(); let reg = if oe { reg | scl_bit(busno) } else { reg & !scl_bit(busno) }; @@ -35,7 +35,7 @@ fn scl_oe(busno: u32, oe: bool) { } } -fn scl_o(busno: u32, o: bool) { +fn scl_o(busno: u8, o: bool) { unsafe { let reg = csr::i2c::out_read(); let reg = if o { reg | scl_bit(busno) } else { reg & !scl_bit(busno) }; @@ -45,6 +45,7 @@ fn scl_o(busno: u32, o: bool) { pub fn init() { for busno in 0..csr::CONFIG_I2C_BUS_COUNT { + let busno = busno as u8; // Set SCL as output, and high level scl_o(busno, true); scl_oe(busno, true); @@ -62,7 +63,7 @@ pub fn init() { } } -pub fn start(busno: u32) { +pub fn start(busno: u8) { // Set SCL high then SDA low scl_o(busno, true); half_period(); @@ -70,7 +71,7 @@ pub fn start(busno: u32) { half_period(); } -pub fn restart(busno: u32) { +pub fn restart(busno: u8) { // Set SCL low then SDA high */ scl_o(busno, false); half_period(); @@ -80,7 +81,7 @@ pub fn restart(busno: u32) { start(busno); } -pub fn stop(busno: u32) { +pub fn stop(busno: u8) { // First, make sure SCL is low, so that the target releases the SDA line scl_o(busno, false); half_period(); @@ -92,7 +93,7 @@ pub fn stop(busno: u32) { half_period(); } -pub fn write(busno: u32, data: u8) -> bool { +pub fn write(busno: u8, data: u8) -> bool { // MSB first for bit in (0..8).rev() { // Set SCL low and set our bit on SDA @@ -115,7 +116,7 @@ pub fn write(busno: u32, data: u8) -> bool { !sda_i(busno) } -pub fn read(busno: u32, ack: bool) -> u8 { +pub fn read(busno: u8, ack: bool) -> u8 { // Set SCL low first, otherwise setting SDA as input may cause a transition // on SDA with SCL high which will be interpreted as START/STOP condition. scl_o(busno, false); diff --git a/artiq/firmware/libboard/si5324.rs b/artiq/firmware/libboard/si5324.rs index 41bbb050e..c58f20b41 100644 --- a/artiq/firmware/libboard/si5324.rs +++ b/artiq/firmware/libboard/si5324.rs @@ -1,7 +1,7 @@ use i2c; use clock; -const BUSNO: u32 = 0; +const BUSNO: u8 = 0; const ADDRESS: u8 = 0x68; #[cfg(soc_platform = "kc705")] diff --git a/artiq/firmware/libksupport/lib.rs b/artiq/firmware/libksupport/lib.rs index dbca35b54..eb2423136 100644 --- a/artiq/firmware/libksupport/lib.rs +++ b/artiq/firmware/libksupport/lib.rs @@ -242,20 +242,20 @@ extern fn cache_put(key: *const u8, list: ArtiqList) { } extern fn i2c_start(busno: i32) { - send(&I2CStartRequest { busno: busno as u32 }); + send(&I2CStartRequest { busno: busno as u8 }); } extern fn i2c_stop(busno: i32) { - send(&I2CStopRequest { busno: busno as u32 }); + send(&I2CStopRequest { busno: busno as u8 }); } extern fn i2c_write(busno: i32, data: i8) -> bool { - send(&I2CWriteRequest { busno: busno as u32, data: data as u8 }); + send(&I2CWriteRequest { busno: busno as u8, data: data as u8 }); recv!(&I2CWriteReply { ack } => ack) } extern fn i2c_read(busno: i32, ack: bool) -> i8 { - send(&I2CReadRequest { busno: busno as u32, ack: ack }); + send(&I2CReadRequest { busno: busno as u8, ack: ack }); recv!(&I2CReadReply { data } => data) as i8 } diff --git a/artiq/firmware/runtime/kernel_proto.rs b/artiq/firmware/runtime/kernel_proto.rs index d32750648..c4699b708 100644 --- a/artiq/firmware/runtime/kernel_proto.rs +++ b/artiq/firmware/runtime/kernel_proto.rs @@ -57,11 +57,11 @@ pub enum Message<'a> { CachePutRequest { key: &'a str, value: &'a [i32] }, CachePutReply { succeeded: bool }, - I2CStartRequest { busno: u32 }, - I2CStopRequest { busno: u32 }, - I2CWriteRequest { busno: u32, data: u8 }, + I2CStartRequest { busno: u8 }, + I2CStopRequest { busno: u8 }, + I2CWriteRequest { busno: u8, data: u8 }, I2CWriteReply { ack: bool }, - I2CReadRequest { busno: u32, ack: bool }, + I2CReadRequest { busno: u8, ack: bool }, I2CReadReply { data: u8 }, Log(fmt::Arguments<'a>),