libboard_artiq: tried moving drtio to io::proto

This commit is contained in:
mwojcik 2021-08-27 14:44:54 +02:00
parent e0516eeda9
commit 581f6c6b4e
4 changed files with 37 additions and 22 deletions

View File

@ -13,6 +13,7 @@ build_zynq = { path = "../libbuild_zynq" }
log = "0.4" log = "0.4"
log_buffer = { version = "1.2" } log_buffer = { version = "1.2" }
crc = { version = "1.7", default-features = false } crc = { version = "1.7", default-features = false }
core_io = { version = "0.1", features = ["collections"] }
io = { path = "../libio", features = ["byteorder"] } io = { path = "../libio", features = ["byteorder"] }
libboard_zynq = { git = "https://git.m-labs.hk/M-Labs/zynq-rs.git"} libboard_zynq = { git = "https://git.m-labs.hk/M-Labs/zynq-rs.git"}

View File

@ -1,8 +1,9 @@
use core::slice; use core::slice;
use crc; use crc;
use core_io::Error as IoError;
use io::{proto::ProtoRead, proto::ProtoWrite, Cursor, Error as IoError}; use io::{proto::ProtoRead, proto::ProtoWrite, Cursor};
use mem::mem::DRTIOAUX_MEM; use mem::mem::DRTIOAUX_MEM;
use pl::csr::DRTIOAUX; use pl::csr::DRTIOAUX;
use drtioaux_proto::Error as ProtocolError; use drtioaux_proto::Error as ProtocolError;
@ -12,7 +13,7 @@ pub use drtioaux_proto::Packet;
// this is parametric over T because there's no impl Fail for !. // this is parametric over T because there's no impl Fail for !.
#[derive(Debug)] #[derive(Debug)]
pub enum Error<T> { pub enum Error {
GatewareError, GatewareError,
CorruptedPacket, CorruptedPacket,
@ -22,17 +23,17 @@ pub enum Error<T> {
RoutingError, RoutingError,
Protocol(ProtocolError<T>) Protocol(ProtocolError)
} }
impl<T> From<ProtocolError<T>> for Error<T> { impl From<ProtocolError> for Error {
fn from(value: ProtocolError<T>) -> Error<T> { fn from(value: ProtocolError) -> Error {
Error::Protocol(value) Error::Protocol(value)
} }
} }
impl<T> From<IoError<T>> for Error<T> { impl From<IoError> for Error {
fn from(value: IoError<T>) -> Error<T> { fn from(value: IoError) -> Error {
Error::Protocol(ProtocolError::Io(value)) Error::Protocol(ProtocolError::Io(value))
} }
} }
@ -59,8 +60,8 @@ fn has_rx_error(linkno: u8) -> bool {
} }
} }
fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>, Error<!>> fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>, Error>
where F: FnOnce(&[u8]) -> Result<T, Error<!>> where F: FnOnce(&[u8]) -> Result<T, Error>
{ {
let linkidx = linkno as usize; let linkidx = linkno as usize;
unsafe { unsafe {
@ -76,7 +77,7 @@ fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>, Error<!>>
} }
} }
pub fn recv(linkno: u8) -> Result<Option<Packet>, Error<!>> { pub fn recv(linkno: u8) -> Result<Option<Packet>, Error> {
if has_rx_error(linkno) { if has_rx_error(linkno) {
return Err(Error::GatewareError) return Err(Error::GatewareError)
} }
@ -101,7 +102,7 @@ pub fn recv(linkno: u8) -> Result<Option<Packet>, Error<!>> {
} }
pub fn recv_timeout(linkno: u8, timeout_ms: Option<u64>, pub fn recv_timeout(linkno: u8, timeout_ms: Option<u64>,
timer: GlobalTimer) -> Result<Packet, Error<!>> timer: GlobalTimer) -> Result<Packet, Error>
{ {
let timeout_ms = Milliseconds(timeout_ms.unwrap_or(10)); let timeout_ms = Milliseconds(timeout_ms.unwrap_or(10));
let limit = timer.get_time() + timeout_ms; let limit = timer.get_time() + timeout_ms;
@ -114,8 +115,8 @@ pub fn recv_timeout(linkno: u8, timeout_ms: Option<u64>,
Err(Error::TimedOut) Err(Error::TimedOut)
} }
fn transmit<F>(linkno: u8, f: F) -> Result<(), Error<!>> fn transmit<F>(linkno: u8, f: F) -> Result<(), Error>
where F: FnOnce(&mut [u8]) -> Result<usize, Error<!>> where F: FnOnce(&mut [u8]) -> Result<usize, Error>
{ {
let linkno = linkno as usize; let linkno = linkno as usize;
unsafe { unsafe {
@ -129,7 +130,7 @@ fn transmit<F>(linkno: u8, f: F) -> Result<(), Error<!>>
} }
} }
pub fn send(linkno: u8, packet: &Packet) -> Result<(), Error<!>> { pub fn send(linkno: u8, packet: &Packet) -> Result<(), Error> {
transmit(linkno, |buffer| { transmit(linkno, |buffer| {
let mut writer = Cursor::new(buffer); let mut writer = Cursor::new(buffer);

View File

@ -1,17 +1,27 @@
use io::{Read, proto::ProtoRead, Write, proto::ProtoWrite, Error as IoError}; use core_io::Error as IoError;
use io::proto::{ProtoWrite as Write, ProtoRead as Read};
#[derive(Debug)] #[derive(Debug)]
pub enum Error<T> { pub enum Error {
UnknownPacket(u8), UnknownPacket(u8),
Io(IoError<T>) Io(IoError)
} }
impl<T> From<IoError<T>> for Error<T> { impl From<IoError> for Error {
fn from(value: IoError<T>) -> Error<T> { fn from(value: IoError) -> Error {
Error::Io(value) Error::Io(value)
} }
} }
/* Why does this not work?!
impl From<Write::WriteError> for Error {
fn from(value: Write::WriteError) -> Error {
Error::Io(value)
}
}*/
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
pub enum Packet { pub enum Packet {
EchoRequest, EchoRequest,
@ -57,8 +67,8 @@ pub enum Packet {
} }
impl Packet { impl Packet {
pub fn read_from<R>(reader: &mut R) -> Result<Self, Error<R::ReadError>> pub fn read_from<R>(reader: &mut R) -> Result<Self, Error>
where R: io::Read + ?Sized where R: Read + ?Sized
{ {
Ok(match reader.read_u8()? { Ok(match reader.read_u8()? {
0x00 => Packet::EchoRequest, 0x00 => Packet::EchoRequest,
@ -194,9 +204,10 @@ impl Packet {
}) })
} }
pub fn write_to<W>(&self, writer: &mut W) -> Result<(), IoError<W::WriteError>> pub fn write_to<W>(&self, writer: &mut W) -> Result<(), IoError>
where W: Write + ?Sized where W: Write + ?Sized
{ {
match *self { match *self {
Packet::EchoRequest => Packet::EchoRequest =>
writer.write_u8(0x00)?, writer.write_u8(0x00)?,
@ -357,4 +368,5 @@ impl Packet {
} }
Ok(()) Ok(())
} }
} }

View File

@ -8,6 +8,7 @@ extern crate libconfig;
extern crate libcortex_a9; extern crate libcortex_a9;
extern crate log_buffer; extern crate log_buffer;
extern crate io; extern crate io;
extern crate core_io;
// has csr; taken from runtime main // has csr; taken from runtime main
#[path = "../../../build/pl.rs"] #[path = "../../../build/pl.rs"]