1
0
Fork 0

cxp upconn fw: add packet writer & packet types

This commit is contained in:
morgan 2024-09-04 12:58:08 +08:00
parent d77086e733
commit f49f3dbb55
1 changed files with 133 additions and 41 deletions

View File

@ -1,4 +1,6 @@
use core_io::{Error as IoError, Read, Write};
use embedded_hal::prelude::_embedded_hal_blocking_delay_DelayUs; use embedded_hal::prelude::_embedded_hal_blocking_delay_DelayUs;
use io::Cursor;
use libboard_zynq::{println, timer::GlobalTimer}; use libboard_zynq::{println, timer::GlobalTimer};
use crate::pl::csr; use crate::pl::csr;
@ -46,38 +48,6 @@ pub fn trigger_ack_test(timer: &mut GlobalTimer) {
} }
} }
pub fn pipeline_test(timer: &mut GlobalTimer) {
let arr = [
// 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
// 0x56, 0x86, 0x5D, 0x6f, // CXP CRC-32
];
const LEN: usize = 4 * 8;
let mut pak_arr: [u8; LEN] = [0; LEN];
unsafe {
write(0x02, &arr); // read control command
// wait for pipelining
timer.delay_us(1);
let mut i: usize = 0;
while csr::cxp::upconn_command_dout_valid_read() == 1 {
pak_arr[i] = csr::cxp::upconn_command_dout_pak_read();
// println!("received {:#04X}", pak_arr[i]);
csr::cxp::upconn_command_inc_write(1);
i += 1;
if i == LEN {
break;
};
}
println!("data packet");
print_packet(&pak_arr);
}
}
pub fn tx_test(timer: &mut GlobalTimer) { pub fn tx_test(timer: &mut GlobalTimer) {
const LEN: usize = 4 * 30; const LEN: usize = 4 * 30;
let mut pak_arr: [u8; LEN] = [0; LEN]; let mut pak_arr: [u8; LEN] = [0; LEN];
@ -121,28 +91,150 @@ pub fn tx_test(timer: &mut GlobalTimer) {
} }
} }
pub fn write(packet_type: u8, buf: &[u8]) { pub enum Packet {
ControlWrite_u32_no_tag {
addr: u32,
data: u32,
packet_type: u8,
},
ControlRead_u32_no_tag {
addr: u32,
packet_type: u8,
},
ControlWrite_u64_no_tag {
addr: u32,
data: u64,
packet_type: u8,
},
ControlRead_u64_no_tag {
addr: u32,
packet_type: u8,
},
ControlWrite_u32_with_tag {
addr: u32,
data: u32,
packet_type: u8,
tag: u8,
},
ControlRead_u32_with_tag {
addr: u32,
packet_type: u8,
tag: u8,
},
ControlWrite_u64_with_tag {
addr: u32,
data: u64,
packet_type: u8,
tag: u8,
},
ControlRead_u64_with_tag {
addr: u32,
packet_type: u8,
tag: u8,
},
}
impl Packet {
pub fn write_to<W>(&self, writer: &mut W) -> Result<(), IoError>
where W: Write {
match *self {
Packet::ControlWrite_u32_no_tag { addr, data, .. } => {
writer.write(&[0x01, 0x00, 0x00, 0x04])?;
writer.write(&addr.to_be_bytes())?;
writer.write(&data.to_be_bytes())?;
}
Packet::ControlRead_u32_no_tag { addr, .. } => {
writer.write(&[0x00, 0x00, 0x00, 0x04])?;
writer.write(&addr.to_be_bytes())?;
}
_ => {
// // TODO: placeholder for rust borrow checker
// writer.write_u32(0x00)?;
}
}
Ok(())
}
}
pub fn send(packet: &Packet) -> Result<(), IoError> {
const LEN: usize = 4 * 20;
let mut buffer: [u8; LEN] = [0; LEN];
let mut writer = Cursor::new(&mut buffer[..]);
packet.write_to(&mut writer)?;
// // Pad till offset 4, insert checksum there
// let padding = (12 - (writer.position() % 8)) % 8;
// for _ in 0..padding {
// writer.write_u8(0)?;
// }
// let checksum = crc::crc32::checksum_ieee(&writer.get_ref()[0..writer.position()]);
// writer.write_u32(checksum)?;
// let mut res: [u8; LEN] = [0; LEN];
// res.clone_from_slice(&mut write);
unsafe { unsafe {
// eop = 1 (End of packet) at the last data input let len = writer.position();
csr::cxp::upconn_command_din_len_write(buf.len() as u8); csr::cxp::upconn_command_din_len_write(len as u8);
csr::cxp::upconn_command_packet_type_write(packet_type); match *packet {
for data in buf.iter() { Packet::ControlWrite_u32_no_tag { packet_type, .. }
| Packet::ControlRead_u32_no_tag { packet_type, .. } => {
csr::cxp::upconn_command_packet_type_write(packet_type);
}
_ => {
println!("packet_type is not inserted!!!!");
}
}
for data in writer.get_ref()[..len].iter() {
while csr::cxp::upconn_command_din_ready_read() == 0 {} while csr::cxp::upconn_command_din_ready_read() == 0 {}
csr::cxp::upconn_command_din_data_write(*data); csr::cxp::upconn_command_din_data_write(*data);
println!("{:#04X}", *data); println!("{:#04X}", *data);
} }
} }
Ok(())
} }
pub fn CXP_Control(timer: &mut GlobalTimer) { pub fn pipeline_test(timer: &mut GlobalTimer) {
let addr: u32 = 0x0000_00FF; let address: u32 = 0x0000_00FF;
let tag: u8 = 0x44; let tag: u8 = 0x44;
let d0: u32 = 0x0000_0032; let d0: u32 = 0x0000_0032;
let d1: u64 = 0x0000_0064; let d1: u64 = 0x0000_0064;
// TODO: reference drtioaux_proto.rs // send(&Packet::ControlWrite_u32_no_tag {
// addr: address,
// data: d0,
// packet_type: 0x02,
// });
// TODO: add firmware CRC & packet type // CXP CRC example
send(&Packet::ControlRead_u32_no_tag {
addr: 0x00,
packet_type: 0x02,
});
unsafe {
timer.delay_us(1);
const LEN: usize = 4 * 8;
let mut pak_arr: [u8; LEN] = [0; LEN];
let mut i: usize = 0;
while csr::cxp::upconn_command_dout_valid_read() == 1 {
pak_arr[i] = csr::cxp::upconn_command_dout_pak_read();
// println!("received {:#04X}", pak_arr[i]);
csr::cxp::upconn_command_inc_write(1);
i += 1;
if i == LEN {
break;
};
}
println!("data packet");
print_packet(&pak_arr);
}
} }
fn print_packet(pak: &[u8]) { fn print_packet(pak: &[u8]) {