forked from M-Labs/artiq
1
0
Fork 0

firmware: split libdrtioaux into libproto and libboard_artiq modules.

All other protocol code lives in libproto, and all other gateware
interfaces live in libboard_artiq.
This commit is contained in:
whitequark 2018-05-14 17:26:36 +00:00
parent 6a10d54432
commit 764386c9e3
15 changed files with 74 additions and 106 deletions

View File

@ -35,7 +35,10 @@ dependencies = [
"build_artiq 0.0.0", "build_artiq 0.0.0",
"build_misoc 0.0.0", "build_misoc 0.0.0",
"byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"io 0.0.0",
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"proto 0.0.0",
] ]
[[package]] [[package]]
@ -98,17 +101,6 @@ name = "cslice"
version = "0.3.0" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "drtioaux"
version = "0.0.0"
dependencies = [
"board 0.0.0",
"build_misoc 0.0.0",
"crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"io 0.0.0",
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "dyld" name = "dyld"
version = "0.0.0" version = "0.0.0"
@ -219,7 +211,6 @@ dependencies = [
"build_misoc 0.0.0", "build_misoc 0.0.0",
"byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "cslice 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"drtioaux 0.0.0",
"fringe 1.1.0 (git+https://github.com/m-labs/libfringe?rev=bd23494)", "fringe 1.1.0 (git+https://github.com/m-labs/libfringe?rev=bd23494)",
"io 0.0.0", "io 0.0.0",
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -248,7 +239,6 @@ dependencies = [
"board_artiq 0.0.0", "board_artiq 0.0.0",
"build_artiq 0.0.0", "build_artiq 0.0.0",
"build_misoc 0.0.0", "build_misoc 0.0.0",
"drtioaux 0.0.0",
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]

View File

@ -15,7 +15,10 @@ build_artiq = { path = "../libbuild_artiq" }
[dependencies] [dependencies]
bitflags = "1.0" bitflags = "1.0"
byteorder = { version = "1.0", default-features = false } byteorder = { version = "1.0", default-features = false }
crc = { version = "1.7", default-features = false }
log = { version = "0.4", default-features = false } log = { version = "0.4", default-features = false }
io = { path = "../libio", features = ["byteorder"] }
proto = { path = "../libproto" }
board = { path = "../libboard" } board = { path = "../libboard" }
[features] [features]

View File

@ -1,8 +1,11 @@
use core::fmt; use core::{slice, fmt, result};
use io::{Cursor, Error as IoError}; use crc;
use io::proto::ProtoRead;
use super::*; use io::{Cursor, Error as IoError};
use io::proto::{ProtoRead, ProtoWrite};
use board;
pub use proto::drtioaux_proto::Packet;
pub type Result<T> = result::Result<T, Error>; pub type Result<T> = result::Result<T, Error>;

View File

@ -1,12 +1,15 @@
#![feature(asm, lang_items)] #![feature(asm, lang_items, never_type)]
#![no_std] #![no_std]
#[macro_use] #[macro_use]
extern crate bitflags; extern crate bitflags;
extern crate byteorder; extern crate byteorder;
extern crate crc;
#[macro_use] #[macro_use]
extern crate log; extern crate log;
extern crate board; extern crate board;
extern crate io;
extern crate proto;
pub mod pcr; pub mod pcr;
@ -28,3 +31,6 @@ mod ad9154_reg;
pub mod ad9154; pub mod ad9154;
#[cfg(has_allaki_atts)] #[cfg(has_allaki_atts)]
pub mod hmc542; pub mod hmc542;
#[cfg(has_drtio)]
pub mod drtioaux;

View File

@ -1,18 +0,0 @@
[package]
authors = ["M-Labs"]
name = "drtioaux"
version = "0.0.0"
build = "build.rs"
[lib]
name = "drtioaux"
path = "lib.rs"
[build-dependencies]
build_misoc = { path = "../libbuild_misoc" }
[dependencies]
log = { version = "0.4", default-features = false }
crc = { version = "1.7", default-features = false }
io = { path = "../libio", features = ["byteorder"] }
board = { path = "../libboard" }

View File

@ -1,5 +0,0 @@
extern crate build_misoc;
fn main() {
build_misoc::cfg();
}

View File

@ -1,11 +1,3 @@
#![no_std]
#![feature(never_type)]
extern crate crc;
extern crate io;
extern crate board;
use io::{Read, Write, Error, Result}; use io::{Read, Write, Error, Result};
use io::proto::{ProtoRead, ProtoWrite}; use io::proto::{ProtoRead, ProtoWrite};
@ -264,6 +256,3 @@ impl Packet {
Ok(()) Ok(())
} }
} }
#[cfg(has_drtio)]
pub mod hw;

View File

@ -13,6 +13,7 @@ extern crate dyld;
// Internal protocols. // Internal protocols.
pub mod kernel_proto; pub mod kernel_proto;
pub mod drtioaux_proto;
// External protocols. // External protocols.
#[cfg(feature = "alloc")] #[cfg(feature = "alloc")]

View File

@ -27,7 +27,6 @@ logger_artiq = { path = "../liblogger_artiq" }
board_artiq = { path = "../libboard_artiq" } board_artiq = { path = "../libboard_artiq" }
proto = { path = "../libproto", features = ["log", "alloc"] } proto = { path = "../libproto", features = ["log", "alloc"] }
amp = { path = "../libamp" } amp = { path = "../libamp" }
drtioaux = { path = "../libdrtioaux" }
[dependencies.fringe] [dependencies.fringe]
git = "https://github.com/m-labs/libfringe" git = "https://github.com/m-labs/libfringe"

View File

@ -10,7 +10,7 @@ mod drtio_i2c {
use drtioaux; use drtioaux;
fn basic_reply(nodeno: u8) -> Result<(), ()> { fn basic_reply(nodeno: u8) -> Result<(), ()> {
match drtioaux::hw::recv_timeout(nodeno, None) { match drtioaux::recv_timeout(nodeno, None) {
Ok(drtioaux::Packet::I2cBasicReply { succeeded }) => { Ok(drtioaux::Packet::I2cBasicReply { succeeded }) => {
if succeeded { Ok(()) } else { Err(()) } if succeeded { Ok(()) } else { Err(()) }
} }
@ -27,7 +27,7 @@ mod drtio_i2c {
pub fn start(nodeno: u8, busno: u8) -> Result<(), ()> { pub fn start(nodeno: u8, busno: u8) -> Result<(), ()> {
let request = drtioaux::Packet::I2cStartRequest { busno: busno }; let request = drtioaux::Packet::I2cStartRequest { busno: busno };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
basic_reply(nodeno) basic_reply(nodeno)
@ -35,7 +35,7 @@ mod drtio_i2c {
pub fn restart(nodeno: u8, busno: u8) -> Result<(), ()> { pub fn restart(nodeno: u8, busno: u8) -> Result<(), ()> {
let request = drtioaux::Packet::I2cRestartRequest { busno: busno }; let request = drtioaux::Packet::I2cRestartRequest { busno: busno };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
basic_reply(nodeno) basic_reply(nodeno)
@ -43,7 +43,7 @@ mod drtio_i2c {
pub fn stop(nodeno: u8, busno: u8) -> Result<(), ()> { pub fn stop(nodeno: u8, busno: u8) -> Result<(), ()> {
let request = drtioaux::Packet::I2cStopRequest { busno: busno }; let request = drtioaux::Packet::I2cStopRequest { busno: busno };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
basic_reply(nodeno) basic_reply(nodeno)
@ -54,10 +54,10 @@ mod drtio_i2c {
busno: busno, busno: busno,
data: data data: data
}; };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
match drtioaux::hw::recv_timeout(nodeno, None) { match drtioaux::recv_timeout(nodeno, None) {
Ok(drtioaux::Packet::I2cWriteReply { succeeded, ack }) => { Ok(drtioaux::Packet::I2cWriteReply { succeeded, ack }) => {
if succeeded { Ok(ack) } else { Err(()) } if succeeded { Ok(ack) } else { Err(()) }
} }
@ -77,10 +77,10 @@ mod drtio_i2c {
busno: busno, busno: busno,
ack: ack ack: ack
}; };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
match drtioaux::hw::recv_timeout(nodeno, None) { match drtioaux::recv_timeout(nodeno, None) {
Ok(drtioaux::Packet::I2cReadReply { succeeded, data }) => { Ok(drtioaux::Packet::I2cReadReply { succeeded, data }) => {
if succeeded { Ok(data) } else { Err(()) } if succeeded { Ok(data) } else { Err(()) }
} }
@ -179,7 +179,7 @@ mod drtio_spi {
use drtioaux; use drtioaux;
fn basic_reply(nodeno: u8) -> Result<(), ()> { fn basic_reply(nodeno: u8) -> Result<(), ()> {
match drtioaux::hw::recv_timeout(nodeno, None) { match drtioaux::recv_timeout(nodeno, None) {
Ok(drtioaux::Packet::SpiBasicReply { succeeded }) => { Ok(drtioaux::Packet::SpiBasicReply { succeeded }) => {
if succeeded { Ok(()) } else { Err(()) } if succeeded { Ok(()) } else { Err(()) }
} }
@ -202,7 +202,7 @@ mod drtio_spi {
div: div, div: div,
cs: cs cs: cs
}; };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
basic_reply(nodeno) basic_reply(nodeno)
@ -213,7 +213,7 @@ mod drtio_spi {
busno: busno, busno: busno,
data: data data: data
}; };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
basic_reply(nodeno) basic_reply(nodeno)
@ -221,10 +221,10 @@ mod drtio_spi {
pub fn read(nodeno: u8, busno: u8) -> Result<u32, ()> { pub fn read(nodeno: u8, busno: u8) -> Result<u32, ()> {
let request = drtioaux::Packet::SpiReadRequest { busno: busno }; let request = drtioaux::Packet::SpiReadRequest { busno: busno };
if drtioaux::hw::send(nodeno, &request).is_err() { if drtioaux::send(nodeno, &request).is_err() {
return Err(()) return Err(())
} }
match drtioaux::hw::recv_timeout(nodeno, None) { match drtioaux::recv_timeout(nodeno, None) {
Ok(drtioaux::Packet::SpiReadReply { succeeded, data }) => { Ok(drtioaux::Packet::SpiReadReply { succeeded, data }) => {
if succeeded { Ok(data) } else { Err(()) } if succeeded { Ok(data) } else { Err(()) }
} }

View File

@ -21,8 +21,6 @@ extern crate board;
extern crate board_artiq; extern crate board_artiq;
extern crate proto; extern crate proto;
extern crate amp; extern crate amp;
#[cfg(has_drtio)]
extern crate drtioaux;
use core::convert::TryFrom; use core::convert::TryFrom;
use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr}; use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr};
@ -31,7 +29,11 @@ use board::irq;
use board::config; use board::config;
#[cfg(has_ethmac)] #[cfg(has_ethmac)]
use board::ethmac; use board::ethmac;
use proto::{mgmt_proto, analyzer_proto, moninj_proto, rpc_proto, session_proto, kernel_proto}; #[cfg(has_drtio)]
use board_artiq::drtioaux;
use proto::{mgmt_proto, moninj_proto, rpc_proto, session_proto,kernel_proto};
#[cfg(has_rtio_analyzer)]
use proto::analyzer_proto;
use amp::{mailbox, rpc_queue}; use amp::{mailbox, rpc_queue};
#[cfg(has_rtio_core)] #[cfg(has_rtio_core)]

View File

@ -35,14 +35,14 @@ fn read_probe_local(channel: u16, probe: u8) -> u32 {
#[cfg(has_drtio)] #[cfg(has_drtio)]
fn read_probe_drtio(nodeno: u8, channel: u16, probe: u8) -> u32 { fn read_probe_drtio(nodeno: u8, channel: u16, probe: u8) -> u32 {
let request = drtioaux::Packet::MonitorRequest { channel: channel, probe: probe }; let request = drtioaux::Packet::MonitorRequest { channel: channel, probe: probe };
match drtioaux::hw::send(nodeno, &request) { match drtioaux::send(nodeno, &request) {
Ok(_) => (), Ok(_) => (),
Err(e) => { Err(e) => {
error!("aux packet error ({})", e); error!("aux packet error ({})", e);
return 0; return 0;
} }
} }
match drtioaux::hw::recv_timeout(nodeno, None) { match drtioaux::recv_timeout(nodeno, None) {
Ok(drtioaux::Packet::MonitorReply { value }) => return value, Ok(drtioaux::Packet::MonitorReply { value }) => return value,
Ok(_) => error!("received unexpected aux packet"), Ok(_) => error!("received unexpected aux packet"),
Err(e) => error!("aux packet error ({})", e) Err(e) => error!("aux packet error ({})", e)
@ -85,7 +85,7 @@ fn inject_drtio(nodeno: u8, channel: u16, overrd: u8, value: u8) {
overrd: overrd, overrd: overrd,
value: value value: value
}; };
match drtioaux::hw::send(nodeno, &request) { match drtioaux::send(nodeno, &request) {
Ok(_) => (), Ok(_) => (),
Err(e) => error!("aux packet error ({})", e) Err(e) => error!("aux packet error ({})", e)
} }
@ -126,14 +126,14 @@ fn read_injection_status_drtio(nodeno: u8, channel: u16, overrd: u8) -> u8 {
channel: channel, channel: channel,
overrd: overrd overrd: overrd
}; };
match drtioaux::hw::send(nodeno, &request) { match drtioaux::send(nodeno, &request) {
Ok(_) => (), Ok(_) => (),
Err(e) => { Err(e) => {
error!("aux packet error ({})", e); error!("aux packet error ({})", e);
return 0; return 0;
} }
} }
match drtioaux::hw::recv_timeout(nodeno, None) { match drtioaux::recv_timeout(nodeno, None) {
Ok(drtioaux::Packet::InjectionStatusReply { value }) => return value, Ok(drtioaux::Packet::InjectionStatusReply { value }) => return value,
Ok(_) => error!("received unexpected aux packet"), Ok(_) => error!("received unexpected aux packet"),
Err(e) => error!("aux packet error ({})", e) Err(e) => error!("aux packet error ({})", e)

View File

@ -99,9 +99,9 @@ pub mod drtio {
return 0 return 0
} }
count += 1; count += 1;
drtioaux::hw::send_link(linkno, &drtioaux::Packet::EchoRequest).unwrap(); drtioaux::send_link(linkno, &drtioaux::Packet::EchoRequest).unwrap();
io.sleep(100).unwrap(); io.sleep(100).unwrap();
let pr = drtioaux::hw::recv_link(linkno); let pr = drtioaux::recv_link(linkno);
match pr { match pr {
Ok(Some(drtioaux::Packet::EchoReply)) => return count, Ok(Some(drtioaux::Packet::EchoReply)) => return count,
_ => {} _ => {}
@ -131,8 +131,8 @@ pub mod drtio {
} }
fn process_aux_errors(linkno: u8) { fn process_aux_errors(linkno: u8) {
drtioaux::hw::send_link(linkno, &drtioaux::Packet::RtioErrorRequest).unwrap(); drtioaux::send_link(linkno, &drtioaux::Packet::RtioErrorRequest).unwrap();
match drtioaux::hw::recv_timeout_link(linkno, None) { match drtioaux::recv_timeout_link(linkno, None) {
Ok(drtioaux::Packet::RtioNoErrorReply) => (), Ok(drtioaux::Packet::RtioNoErrorReply) => (),
Ok(drtioaux::Packet::RtioErrorSequenceErrorReply { channel }) => Ok(drtioaux::Packet::RtioErrorSequenceErrorReply { channel }) =>
error!("[LINK#{}] RTIO sequence error involving channel {}", linkno, channel), error!("[LINK#{}] RTIO sequence error involving channel {}", linkno, channel),
@ -144,7 +144,7 @@ pub mod drtio {
Err(e) => error!("[LINK#{}] aux packet error ({})", linkno, e) Err(e) => error!("[LINK#{}] aux packet error ({})", linkno, e)
} }
} }
pub fn link_thread(io: Io) { pub fn link_thread(io: Io) {
loop { loop {
for linkno in 0..csr::DRTIO.len() { for linkno in 0..csr::DRTIO.len() {
@ -183,9 +183,9 @@ pub mod drtio {
for linkno in 0..csr::DRTIO.len() { for linkno in 0..csr::DRTIO.len() {
let linkno = linkno as u8; let linkno = linkno as u8;
if link_up(linkno) { if link_up(linkno) {
drtioaux::hw::send_link(linkno, drtioaux::send_link(linkno,
&drtioaux::Packet::ResetRequest { phy: false }).unwrap(); &drtioaux::Packet::ResetRequest { phy: false }).unwrap();
match drtioaux::hw::recv_timeout_link(linkno, None) { match drtioaux::recv_timeout_link(linkno, None) {
Ok(drtioaux::Packet::ResetAck) => (), Ok(drtioaux::Packet::ResetAck) => (),
Ok(_) => error!("[LINK#{}] reset failed, received unexpected aux packet", linkno), Ok(_) => error!("[LINK#{}] reset failed, received unexpected aux packet", linkno),
Err(e) => error!("[LINK#{}] reset failed, aux packet error ({})", linkno, e) Err(e) => error!("[LINK#{}] reset failed, aux packet error ({})", linkno, e)

View File

@ -17,4 +17,3 @@ build_artiq = { path = "../libbuild_artiq" }
log = { version = "0.4", default-features = false } log = { version = "0.4", default-features = false }
board = { path = "../libboard", features = ["uart_console", "log"] } board = { path = "../libboard", features = ["uart_console", "log"] }
board_artiq = { path = "../libboard_artiq" } board_artiq = { path = "../libboard_artiq" }
drtioaux = { path = "../libdrtioaux" }

View File

@ -6,10 +6,9 @@ extern crate log;
#[macro_use] #[macro_use]
extern crate board; extern crate board;
extern crate board_artiq; extern crate board_artiq;
extern crate drtioaux;
use board::csr; use board::csr;
use board_artiq::{i2c, spi, si5324}; use board_artiq::{i2c, spi, si5324, drtioaux};
#[cfg(has_serwb_phy_amc)] #[cfg(has_serwb_phy_amc)]
use board_artiq::serwb; use board_artiq::serwb;
#[cfg(has_hmc830_7043)] #[cfg(has_hmc830_7043)]
@ -27,12 +26,12 @@ fn drtio_reset_phy(reset: bool) {
} }
} }
fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> { fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::Result<()> {
// In the code below, *_chan_sel_write takes an u8 if there are fewer than 256 channels, // In the code below, *_chan_sel_write takes an u8 if there are fewer than 256 channels,
// and u16 otherwise; hence the `as _` conversion. // and u16 otherwise; hence the `as _` conversion.
match packet { match packet {
drtioaux::Packet::EchoRequest => drtioaux::Packet::EchoRequest =>
drtioaux::hw::send_link(0, &drtioaux::Packet::EchoReply), drtioaux::send_link(0, &drtioaux::Packet::EchoReply),
drtioaux::Packet::ResetRequest { phy } => { drtioaux::Packet::ResetRequest { phy } => {
if phy { if phy {
drtio_reset_phy(true); drtio_reset_phy(true);
@ -41,7 +40,7 @@ fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> {
drtio_reset(true); drtio_reset(true);
drtio_reset(false); drtio_reset(false);
} }
drtioaux::hw::send_link(0, &drtioaux::Packet::ResetAck) drtioaux::send_link(0, &drtioaux::Packet::ResetAck)
}, },
drtioaux::Packet::RtioErrorRequest => { drtioaux::Packet::RtioErrorRequest => {
@ -55,7 +54,7 @@ fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> {
channel = (csr::DRTIO[0].sequence_error_channel_read)(); channel = (csr::DRTIO[0].sequence_error_channel_read)();
(csr::DRTIO[0].rtio_error_write)(1); (csr::DRTIO[0].rtio_error_write)(1);
} }
drtioaux::hw::send_link(0, drtioaux::send_link(0,
&drtioaux::Packet::RtioErrorSequenceErrorReply { channel }) &drtioaux::Packet::RtioErrorSequenceErrorReply { channel })
} else if errors & 2 != 0 { } else if errors & 2 != 0 {
let channel; let channel;
@ -63,7 +62,7 @@ fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> {
channel = (csr::DRTIO[0].collision_channel_read)(); channel = (csr::DRTIO[0].collision_channel_read)();
(csr::DRTIO[0].rtio_error_write)(2); (csr::DRTIO[0].rtio_error_write)(2);
} }
drtioaux::hw::send_link(0, drtioaux::send_link(0,
&drtioaux::Packet::RtioErrorCollisionReply { channel }) &drtioaux::Packet::RtioErrorCollisionReply { channel })
} else if errors & 4 != 0 { } else if errors & 4 != 0 {
let channel; let channel;
@ -71,11 +70,11 @@ fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> {
channel = (board::csr::DRTIO[0].busy_channel_read)(); channel = (board::csr::DRTIO[0].busy_channel_read)();
(board::csr::DRTIO[0].rtio_error_write)(4); (board::csr::DRTIO[0].rtio_error_write)(4);
} }
drtioaux::hw::send_link(0, drtioaux::send_link(0,
&drtioaux::Packet::RtioErrorBusyReply { channel }) &drtioaux::Packet::RtioErrorBusyReply { channel })
} }
else { else {
drtioaux::hw::send_link(0, &drtioaux::Packet::RtioNoErrorReply) drtioaux::send_link(0, &drtioaux::Packet::RtioNoErrorReply)
} }
} }
@ -93,7 +92,7 @@ fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> {
value = 0; value = 0;
} }
let reply = drtioaux::Packet::MonitorReply { value: value as u32 }; let reply = drtioaux::Packet::MonitorReply { value: value as u32 };
drtioaux::hw::send_link(0, &reply) drtioaux::send_link(0, &reply)
}, },
drtioaux::Packet::InjectionRequest { channel, overrd, value } => { drtioaux::Packet::InjectionRequest { channel, overrd, value } => {
#[cfg(has_rtio_moninj)] #[cfg(has_rtio_moninj)]
@ -116,53 +115,53 @@ fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> {
{ {
value = 0; value = 0;
} }
drtioaux::hw::send_link(0, &drtioaux::Packet::InjectionStatusReply { value: value }) drtioaux::send_link(0, &drtioaux::Packet::InjectionStatusReply { value: value })
}, },
drtioaux::Packet::I2cStartRequest { busno } => { drtioaux::Packet::I2cStartRequest { busno } => {
let succeeded = i2c::start(busno).is_ok(); let succeeded = i2c::start(busno).is_ok();
drtioaux::hw::send_link(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded }) drtioaux::send_link(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded })
} }
drtioaux::Packet::I2cRestartRequest { busno } => { drtioaux::Packet::I2cRestartRequest { busno } => {
let succeeded = i2c::restart(busno).is_ok(); let succeeded = i2c::restart(busno).is_ok();
drtioaux::hw::send_link(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded }) drtioaux::send_link(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded })
} }
drtioaux::Packet::I2cStopRequest { busno } => { drtioaux::Packet::I2cStopRequest { busno } => {
let succeeded = i2c::stop(busno).is_ok(); let succeeded = i2c::stop(busno).is_ok();
drtioaux::hw::send_link(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded }) drtioaux::send_link(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded })
} }
drtioaux::Packet::I2cWriteRequest { busno, data } => { drtioaux::Packet::I2cWriteRequest { busno, data } => {
match i2c::write(busno, data) { match i2c::write(busno, data) {
Ok(ack) => drtioaux::hw::send_link(0, Ok(ack) => drtioaux::send_link(0,
&drtioaux::Packet::I2cWriteReply { succeeded: true, ack: ack }), &drtioaux::Packet::I2cWriteReply { succeeded: true, ack: ack }),
Err(_) => drtioaux::hw::send_link(0, Err(_) => drtioaux::send_link(0,
&drtioaux::Packet::I2cWriteReply { succeeded: false, ack: false }) &drtioaux::Packet::I2cWriteReply { succeeded: false, ack: false })
} }
} }
drtioaux::Packet::I2cReadRequest { busno, ack } => { drtioaux::Packet::I2cReadRequest { busno, ack } => {
match i2c::read(busno, ack) { match i2c::read(busno, ack) {
Ok(data) => drtioaux::hw::send_link(0, Ok(data) => drtioaux::send_link(0,
&drtioaux::Packet::I2cReadReply { succeeded: true, data: data }), &drtioaux::Packet::I2cReadReply { succeeded: true, data: data }),
Err(_) => drtioaux::hw::send_link(0, Err(_) => drtioaux::send_link(0,
&drtioaux::Packet::I2cReadReply { succeeded: false, data: 0xff }) &drtioaux::Packet::I2cReadReply { succeeded: false, data: 0xff })
} }
} }
drtioaux::Packet::SpiSetConfigRequest { busno, flags, length, div, cs } => { drtioaux::Packet::SpiSetConfigRequest { busno, flags, length, div, cs } => {
let succeeded = spi::set_config(busno, flags, length, div, cs).is_ok(); let succeeded = spi::set_config(busno, flags, length, div, cs).is_ok();
drtioaux::hw::send_link(0, drtioaux::send_link(0,
&drtioaux::Packet::SpiBasicReply { succeeded: succeeded }) &drtioaux::Packet::SpiBasicReply { succeeded: succeeded })
}, },
drtioaux::Packet::SpiWriteRequest { busno, data } => { drtioaux::Packet::SpiWriteRequest { busno, data } => {
let succeeded = spi::write(busno, data).is_ok(); let succeeded = spi::write(busno, data).is_ok();
drtioaux::hw::send_link(0, drtioaux::send_link(0,
&drtioaux::Packet::SpiBasicReply { succeeded: succeeded }) &drtioaux::Packet::SpiBasicReply { succeeded: succeeded })
} }
drtioaux::Packet::SpiReadRequest { busno } => { drtioaux::Packet::SpiReadRequest { busno } => {
match spi::read(busno) { match spi::read(busno) {
Ok(data) => drtioaux::hw::send_link(0, Ok(data) => drtioaux::send_link(0,
&drtioaux::Packet::SpiReadReply { succeeded: true, data: data }), &drtioaux::Packet::SpiReadReply { succeeded: true, data: data }),
Err(_) => drtioaux::hw::send_link(0, Err(_) => drtioaux::send_link(0,
&drtioaux::Packet::SpiReadReply { succeeded: false, data: 0 }) &drtioaux::Packet::SpiReadReply { succeeded: false, data: 0 })
} }
} }
@ -176,7 +175,7 @@ fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::hw::Result<()> {
fn process_aux_packets() { fn process_aux_packets() {
let result = let result =
drtioaux::hw::recv_link(0).and_then(|packet| { drtioaux::recv_link(0).and_then(|packet| {
if let Some(packet) = packet { if let Some(packet) = packet {
process_aux_packet(packet) process_aux_packet(packet)
} else { } else {
@ -267,7 +266,7 @@ pub extern fn main() -> i32 {
info!("link is up, switching to recovered clock"); info!("link is up, switching to recovered clock");
si5324::siphaser::select_recovered_clock(true).expect("failed to switch clocks"); si5324::siphaser::select_recovered_clock(true).expect("failed to switch clocks");
si5324::siphaser::calibrate_skew(32).expect("failed to calibrate skew"); si5324::siphaser::calibrate_skew(32).expect("failed to calibrate skew");
drtioaux::hw::reset(0); drtioaux::reset(0);
drtio_reset(false); drtio_reset(false);
drtio_reset_phy(false); drtio_reset_phy(false);
while drtio_link_rx_up() { while drtio_link_rx_up() {