From d221874806cbbbc125966f9a588b0747ca79efd5 Mon Sep 17 00:00:00 2001 From: morgan Date: Fri, 24 Jan 2025 13:36:11 +0800 Subject: [PATCH] cxp fw: refactor --- src/libboard_artiq/src/cxp.rs | 40 +++++++++++++---------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/src/libboard_artiq/src/cxp.rs b/src/libboard_artiq/src/cxp.rs index 30f2254..c55969b 100644 --- a/src/libboard_artiq/src/cxp.rs +++ b/src/libboard_artiq/src/cxp.rs @@ -31,7 +31,6 @@ const VERSION_SUPPORTED: u32 = 0x4044; const VERSION_USED: u32 = 0x4048; // Setup const -const CXP_CHANNELS: u8 = CXP_LEN as u8; // TEST: result // Currently, multilane/channel is not working properly in gateware due to buffer overflow issue // only single lane @ 0x800 max pak size or dual lane 256 max pak size is working @@ -97,9 +96,8 @@ pub fn setup() -> Result { fn scan_active_channels() -> u8 { let mut active_channels: u8 = 0; - for ch in 0..CXP_CHANNELS { - if unsafe { (CXP[ch as usize].rx_ready_read)() } == 1 { - // info!("ch#{} is up <---------------------------------", ch); + for ch in 0..CXP_LEN { + if unsafe { (CXP[ch].rx_ready_read)() } == 1 { active_channels += 1; } } @@ -115,8 +113,8 @@ fn discover_camera(timer: &mut GlobalTimer) -> Result<(), Error> { // Section 12.1.2 (CXP-001-2021) // send ConnectionReset on all channels -> wait 200ms -> scan for active channels - for ch in 0..CXP_CHANNELS { - write_bytes_no_ack(ch, CONNECTION_RESET, &1_u32.to_be_bytes(), false)?; + for ch in 0..CXP_LEN { + write_bytes_no_ack(ch as u8, CONNECTION_RESET, &1_u32.to_be_bytes(), false)?; } timer.delay_ms(200); @@ -155,8 +153,8 @@ fn check_connection_topology(active_channels: u8) -> Result<(), Error> { } fn negotiate_active_channels(timer: &mut GlobalTimer) -> Result { - let mut available_chs = read_u32(MASTER_CHANNEL, CONNECTION_CFG_DEFAULT, false)? >> 16; - available_chs = available_chs.min(CXP_CHANNELS as u32); + let max_camera_chs = read_u32(MASTER_CHANNEL, CONNECTION_CFG_DEFAULT, false)? >> 16; + let available_chs = max_camera_chs.min(CXP_LEN as u32); // activate channels on camera but preserve the discovery linerate let current_cfg = read_u32(MASTER_CHANNEL, CONNECTION_CFG, false)?; @@ -168,35 +166,33 @@ fn negotiate_active_channels(timer: &mut GlobalTimer) -> Result { )?; timer.delay_ms(200); - let active_channels = scan_active_channels(); - check_connection_topology(active_channels)?; + let active_chs = scan_active_channels(); + check_connection_topology(active_chs)?; - if available_chs > active_channels as u32 { + if available_chs > active_chs as u32 { info!( "Only detected {} channel(s), disabling excess channels on camera", - active_channels + active_chs ); write_u32( MASTER_CHANNEL, CONNECTION_CFG, - current_cfg & 0xFFFF | ((active_channels as u32) << 16), + current_cfg & 0xFFFF | ((active_chs as u32) << 16), false, )?; timer.delay_ms(200); // check no active channels are down after the cfg change - if active_channels != scan_active_channels() { + if active_chs != scan_active_channels() { return Err(Error::ConnectionLost); } } - Ok(active_channels) + Ok(active_chs) } fn set_host_connection_id() -> Result<(), Error> { - // TODO: not mandatory?? + info!("setting host connection id to = {}", HOST_CONNECTION_ID); write_u32(MASTER_CHANNEL, MASTER_HOST_CONNECTION_ID, HOST_CONNECTION_ID, false)?; - let reg = read_u32(MASTER_CHANNEL, MASTER_HOST_CONNECTION_ID, false)?; - info!("host connection id set as = {}", reg); Ok(()) } @@ -234,7 +230,7 @@ fn negotiate_cxp_version() -> Result { } fn negotiate_pak_max_size(with_tag: bool) -> Result<(), Error> { - // TODO: set MAX CONTROL packet size? + // DEBUG: print control & stream packet size let reg = read_u32(MASTER_CHANNEL, CONTROL_PACKET_SIZE_MAX, with_tag)?; info!("Max CTRL PAK size = {:#010X}", reg); @@ -388,11 +384,5 @@ fn camera_setup(timer: &mut GlobalTimer) -> Result { test_channels_stability(active_channels, cxp_v2_or_greater, timer)?; - // unsafe{ - // // don't set two identical routingid, the router cannot handle it - // // it can handle it after adding the priority decoder - // cxp_frame_pipeline::buffer_1_routingid_write(0x00); - // } - Ok(cxp_v2_or_greater) }