libboard_artiq: fixes for siphaser, cleanup

This commit is contained in:
mwojcik 2021-10-01 15:08:00 +02:00
parent 758adf0495
commit 26483e852c
3 changed files with 7 additions and 24 deletions

View File

@ -58,7 +58,7 @@ pub fn has_rx_error(linkno: u8) -> bool {
} }
} }
fn copy_with_swap(src: *mut u8, dst: *mut u8, len: isize) { pub fn copy_with_swap(src: *mut u8, dst: *mut u8, len: isize) {
// for some reason, everything except checksum arrives // for some reason, everything except checksum arrives
// with byte order swapped. and it must be sent as such too. // with byte order swapped. and it must be sent as such too.
unsafe { unsafe {

View File

@ -10,7 +10,7 @@ use libasync::{task, block_async};
use io::{proto::ProtoRead, proto::ProtoWrite, Cursor}; use io::{proto::ProtoRead, proto::ProtoWrite, Cursor};
use crate::mem::mem::DRTIOAUX_MEM; use crate::mem::mem::DRTIOAUX_MEM;
use crate::pl::csr::DRTIOAUX; use crate::pl::csr::DRTIOAUX;
use crate::drtioaux::{Error, has_rx_error}; use crate::drtioaux::{Error, has_rx_error, copy_with_swap};
pub use crate::drtioaux_proto::Packet; pub use crate::drtioaux_proto::Packet;
@ -36,23 +36,6 @@ fn tx_ready(linkno: usize) -> nb::Result<(), Void> {
} }
} }
async fn copy_with_swap(src: *mut u8, dst: *mut u8, len: isize) {
unsafe {
for i in (0..(len-4)).step_by(4) {
*dst.offset(i) = *src.offset(i+3);
*dst.offset(i+1) = *src.offset(i+2);
*dst.offset(i+2) = *src.offset(i+1);
*dst.offset(i+3) = *src.offset(i);
}
// checksum untouched
// unrolled for performance
*dst.offset(len-4) = *src.offset(len-4);
*dst.offset(len-3) = *src.offset(len-3);
*dst.offset(len-2) = *src.offset(len-2);
*dst.offset(len-1) = *src.offset(len-1);
}
}
async fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>, Error> async 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>
{ {
@ -63,7 +46,7 @@ async fn receive<F, T>(linkno: u8, f: F) -> Result<Option<T>, Error>
let len = (DRTIOAUX[linkidx].aux_rx_length_read)() as usize; let len = (DRTIOAUX[linkidx].aux_rx_length_read)() as usize;
// work buffer, as byte order will need to be swapped, cannot be in place // work buffer, as byte order will need to be swapped, cannot be in place
let mut buf: [u8; 1024] = [0; 1024]; let mut buf: [u8; 1024] = [0; 1024];
copy_with_swap(ptr, buf.as_mut_ptr(), len as isize).await; copy_with_swap(ptr, buf.as_mut_ptr(), len as isize);
let result = f(&buf[0..len]); let result = f(&buf[0..len]);
(DRTIOAUX[linkidx].aux_rx_present_write)(1); (DRTIOAUX[linkidx].aux_rx_present_write)(1);
Ok(Some(result?)) Ok(Some(result?))
@ -104,8 +87,8 @@ pub async fn recv_timeout(linkno: u8, timeout_ms: Option<u64>,
let limit = timer.get_time() + timeout_ms; let limit = timer.get_time() + timeout_ms;
let mut would_block = false; let mut would_block = false;
while timer.get_time() < limit { while timer.get_time() < limit {
// to ensure one last time recv would run one last time in case // to ensure one last time recv would run one last time
// async would return after timeout // in case async would return after timeout
if would_block { if would_block {
task::r#yield().await; task::r#yield().await;
} }
@ -128,7 +111,7 @@ async fn transmit<F>(linkno: u8, f: F) -> Result<(), Error>
// work buffer, works with unaligned mem access // work buffer, works with unaligned mem access
let mut buf: [u8; 1024] = [0; 1024]; let mut buf: [u8; 1024] = [0; 1024];
let len = f(&mut buf[0..len])?; let len = f(&mut buf[0..len])?;
copy_with_swap(buf.as_mut_ptr(), ptr, len as isize).await; copy_with_swap(buf.as_mut_ptr(), ptr, len as isize);
(DRTIOAUX[linkno].aux_tx_length_write)(len as u16); (DRTIOAUX[linkno].aux_tx_length_write)(len as u16);
(DRTIOAUX[linkno].aux_tx_write)(1); (DRTIOAUX[linkno].aux_tx_write)(1);
Ok(()) Ok(())

View File

@ -281,7 +281,7 @@ pub fn select_input(i2c: &mut I2c, input: Input, timer: &mut GlobalTimer) -> Res
#[cfg(has_siphaser)] #[cfg(has_siphaser)]
pub mod siphaser { pub mod siphaser {
use super::*; use super::*;
use pl::csr; use crate::pl::csr;
pub fn select_recovered_clock(i2c: &mut I2c, rc: bool, timer: &mut GlobalTimer) -> Result<()> { pub fn select_recovered_clock(i2c: &mut I2c, rc: bool, timer: &mut GlobalTimer) -> Result<()> {
let val = read(i2c, 3)?; let val = read(i2c, 3)?;