forked from M-Labs/artiq
1
0
Fork 0

firmware: fix satman build.

This commit is contained in:
whitequark 2018-05-15 16:35:05 +00:00
parent 07b713fdad
commit 1b0384c513
5 changed files with 42 additions and 41 deletions

View File

@ -17,6 +17,8 @@ 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)",
"crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"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)",
"proto_artiq 0.0.0", "proto_artiq 0.0.0",
@ -176,7 +178,7 @@ dependencies = [
[[package]] [[package]]
name = "log_buffer" name = "log_buffer"
version = "1.2.0" version = "1.2.0"
source = "git+https://github.com/whitequark/rust-log_buffer?rev=rust-1.25#ff84e565d9954d5864d60aec12b9e1381505d72a" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "logger_artiq" name = "logger_artiq"
@ -184,7 +186,7 @@ version = "0.0.0"
dependencies = [ dependencies = [
"board_misoc 0.0.0", "board_misoc 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)",
"log_buffer 1.2.0 (git+https://github.com/whitequark/rust-log_buffer?rev=rust-1.25)", "log_buffer 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -340,7 +342,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)" = "6fd41f331ac7c5b8ac259b8bf82c75c0fb2e469bbf37d2becbba9a6a2221965b" "checksum libc 0.2.40 (registry+https://github.com/rust-lang/crates.io-index)" = "6fd41f331ac7c5b8ac259b8bf82c75c0fb2e469bbf37d2becbba9a6a2221965b"
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2"
"checksum log_buffer 1.2.0 (git+https://github.com/whitequark/rust-log_buffer?rev=rust-1.25)" = "<none>" "checksum log_buffer 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f033173c9486b7fe97a79c895c0a3483ae395ab6744c985d10078950e2492419"
"checksum managed 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43e2737ecabe4ae36a68061398bf27d2bfd0763f4c3c837a398478459494c4b7" "checksum managed 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43e2737ecabe4ae36a68061398bf27d2bfd0763f4c3c837a398478459494c4b7"
"checksum managed 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5a31885241e61ba264d780d2e6686e7e59561c947b4581470364eb3e10102d86" "checksum managed 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5a31885241e61ba264d780d2e6686e7e59561c947b4581470364eb3e10102d86"
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"

View File

@ -13,6 +13,8 @@ build_misoc = { path = "../libbuild_misoc" }
build_artiq = { path = "../libbuild_artiq" } build_artiq = { path = "../libbuild_artiq" }
[dependencies] [dependencies]
failure = { version = "0.1", default-features = false }
failure_derive = { version = "0.1", default-features = false }
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 } crc = { version = "1.7", default-features = false }

View File

@ -1,43 +1,36 @@
use core::{slice, fmt, result}; use core::slice;
use crc; use crc;
use io::{Cursor, Error as IoError}; use io::{ProtoRead, ProtoWrite, Cursor, Error as IoError};
use io::proto::{ProtoRead, ProtoWrite};
use board_misoc::{csr::DRTIO, mem::DRTIO_AUX, clock}; use board_misoc::{csr::DRTIO, mem::DRTIO_AUX, clock};
use proto_artiq::drtioaux_proto::Error as ProtocolError;
pub use proto_artiq::drtioaux_proto::Packet; pub use proto_artiq::drtioaux_proto::Packet;
pub type Result<T> = result::Result<T, Error>; // this is parametric over T because there's no impl Fail for !.
#[derive(Fail, Debug)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Error<T> {
pub enum Error { #[fail(display = "packet CRC failed")]
CorruptedPacket, CorruptedPacket,
#[fail(display = "timed out waiting for data")]
TimedOut, TimedOut,
#[fail(display = "invalid node number")]
NoRoute, NoRoute,
#[fail(display = "gateware reported error")]
GatewareError, GatewareError,
Io(IoError<!>) #[fail(display = "protocol error: {}", _0)]
Protocol(#[cause] ProtocolError<T>)
} }
impl fmt::Display for Error { impl<T> From<ProtocolError<T>> for Error<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn from(value: ProtocolError<T>) -> Error<T> {
match self { Error::Protocol(value)
&Error::CorruptedPacket =>
write!(f, "packet CRC failed"),
&Error::TimedOut =>
write!(f, "timed out waiting for data"),
&Error::NoRoute =>
write!(f, "invalid node number"),
&Error::GatewareError =>
write!(f, "gateware reported error"),
&Error::Io(ref io) =>
write!(f, "I/O error ({})", io)
}
} }
} }
impl From<IoError<!>> for Error { impl<T> From<IoError<T>> for Error<T> {
fn from(value: IoError<!>) -> Error { fn from(value: IoError<T>) -> Error<T> {
Error::Io(value) Error::Protocol(ProtocolError::Io(value))
} }
} }
@ -63,8 +56,8 @@ fn has_rx_error(linkno: u8) -> bool {
} }
} }
fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>> fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>, Error<!>>
where F: FnOnce(&[u8]) -> Result<T> where F: FnOnce(&[u8]) -> Result<T, Error<!>>
{ {
let linkidx = linkno as usize; let linkidx = linkno as usize;
unsafe { unsafe {
@ -80,14 +73,14 @@ fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>>
} }
} }
pub fn recv_link(linkno: u8) -> Result<Option<Packet>> { pub fn recv_link(linkno: u8) -> Result<Option<Packet>, Error<!>> {
if has_rx_error(linkno) { if has_rx_error(linkno) {
return Err(Error::GatewareError) return Err(Error::GatewareError)
} }
receive(linkno, |buffer| { receive(linkno, |buffer| {
if buffer.len() < 8 { if buffer.len() < 8 {
return Err(Error::Io(IoError::UnexpectedEof)) return Err(IoError::UnexpectedEnd.into())
} }
let mut reader = Cursor::new(buffer); let mut reader = Cursor::new(buffer);
@ -104,7 +97,7 @@ pub fn recv_link(linkno: u8) -> Result<Option<Packet>> {
}) })
} }
pub fn recv_timeout_link(linkno: u8, timeout_ms: Option<u64>) -> Result<Packet> { pub fn recv_timeout_link(linkno: u8, timeout_ms: Option<u64>) -> Result<Packet, Error<!>> {
let timeout_ms = timeout_ms.unwrap_or(10); let timeout_ms = timeout_ms.unwrap_or(10);
let limit = clock::get_ms() + timeout_ms; let limit = clock::get_ms() + timeout_ms;
while clock::get_ms() < limit { while clock::get_ms() < limit {
@ -116,8 +109,8 @@ pub fn recv_timeout_link(linkno: u8, timeout_ms: Option<u64>) -> Result<Packet>
Err(Error::TimedOut) Err(Error::TimedOut)
} }
fn transmit<F>(linkno: u8, f: F) -> Result<()> fn transmit<F>(linkno: u8, f: F) -> Result<(), Error<!>>
where F: FnOnce(&mut [u8]) -> Result<usize> where F: FnOnce(&mut [u8]) -> Result<usize, Error<!>>
{ {
let linkno = linkno as usize; let linkno = linkno as usize;
unsafe { unsafe {
@ -131,7 +124,7 @@ fn transmit<F>(linkno: u8, f: F) -> Result<()>
} }
} }
pub fn send_link(linkno: u8, packet: &Packet) -> Result<()> { pub fn send_link(linkno: u8, packet: &Packet) -> Result<(), Error<!>> {
transmit(linkno, |buffer| { transmit(linkno, |buffer| {
let mut writer = Cursor::new(buffer); let mut writer = Cursor::new(buffer);
@ -152,24 +145,24 @@ pub fn send_link(linkno: u8, packet: &Packet) -> Result<()> {
} }
// TODO: routing // TODO: routing
fn get_linkno(nodeno: u8) -> Result<u8> { fn get_linkno(nodeno: u8) -> Result<u8, Error<!>> {
if nodeno == 0 || nodeno as usize > DRTIO.len() { if nodeno == 0 || nodeno as usize > DRTIO.len() {
return Err(Error::NoRoute) return Err(Error::NoRoute)
} }
Ok(nodeno - 1) Ok(nodeno - 1)
} }
pub fn recv(nodeno: u8) -> Result<Option<Packet>> { pub fn recv(nodeno: u8) -> Result<Option<Packet>, Error<!>> {
let linkno = get_linkno(nodeno)?; let linkno = get_linkno(nodeno)?;
recv_link(linkno) recv_link(linkno)
} }
pub fn recv_timeout(nodeno: u8, timeout_ms: Option<u64>) -> Result<Packet> { pub fn recv_timeout(nodeno: u8, timeout_ms: Option<u64>) -> Result<Packet, Error<!>> {
let linkno = get_linkno(nodeno)?; let linkno = get_linkno(nodeno)?;
recv_timeout_link(linkno, timeout_ms) recv_timeout_link(linkno, timeout_ms)
} }
pub fn send(nodeno: u8, packet: &Packet) -> Result<()> { pub fn send(nodeno: u8, packet: &Packet) -> Result<(), Error<!>> {
let linkno = get_linkno(nodeno)?; let linkno = get_linkno(nodeno)?;
send_link(linkno, packet) send_link(linkno, packet)
} }

View File

@ -1,6 +1,10 @@
#![feature(asm, lang_items, never_type)] #![feature(asm, lang_items, never_type)]
#![no_std] #![no_std]
extern crate failure;
#[cfg(has_drtio)]
#[macro_use]
extern crate failure_derive;
#[macro_use] #[macro_use]
extern crate bitflags; extern crate bitflags;
extern crate byteorder; extern crate byteorder;

View File

@ -26,7 +26,7 @@ fn drtio_reset_phy(reset: bool) {
} }
} }
fn process_aux_packet(packet: drtioaux::Packet) -> drtioaux::Result<()> { fn process_aux_packet(packet: drtioaux::Packet) -> Result<(), drtioaux::Error<!>> {
// 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 {