forked from M-Labs/artiq-zynq
parent
14aa81c8a2
commit
6c53447808
|
@ -0,0 +1,71 @@
|
||||||
|
use embedded_hal::prelude::_embedded_hal_blocking_delay_DelayUs;
|
||||||
|
use libboard_zynq::{println, timer::GlobalTimer};
|
||||||
|
use log::info;
|
||||||
|
|
||||||
|
use crate::pl::csr;
|
||||||
|
|
||||||
|
pub fn main(timer: &mut GlobalTimer) {
|
||||||
|
unsafe {
|
||||||
|
info!("turning on pmc loopback mode...");
|
||||||
|
csr::cxp::loopback_mode_write(0b010); // Near-End PMA Loopback
|
||||||
|
|
||||||
|
// enable cxp gtx clock domains
|
||||||
|
csr::cxp::tx_start_init_write(1);
|
||||||
|
csr::cxp::rx_start_init_write(1);
|
||||||
|
|
||||||
|
info!("waiting for QPLL/CPLL to lock...");
|
||||||
|
timer.delay_us(50_000);
|
||||||
|
info!("tx_phaligndone = {} ", csr::cxp::txinit_phaligndone_read(),);
|
||||||
|
|
||||||
|
// enable txdata tranmission thought MGTXTXP, required by PMA loopback
|
||||||
|
csr::cxp::txenable_write(1);
|
||||||
|
|
||||||
|
loopback_testing(timer, 0x00, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn loopback_testing(timer: &mut GlobalTimer, data: u8, control_bit: u8) {
|
||||||
|
unsafe {
|
||||||
|
// send K28_5 for CDR to align
|
||||||
|
const K28_5: u8 = 0xBC;
|
||||||
|
csr::cxp::data_0_write(K28_5);
|
||||||
|
csr::cxp::control_bit_0_write(1);
|
||||||
|
csr::cxp::data_1_write(K28_5);
|
||||||
|
csr::cxp::control_bit_1_write(1);
|
||||||
|
|
||||||
|
info!("waiting for rx to align...");
|
||||||
|
while csr::cxp::rx_ready_read() != 1 {}
|
||||||
|
info!("rx ready!");
|
||||||
|
|
||||||
|
csr::cxp::data_1_write(data);
|
||||||
|
csr::cxp::control_bit_1_write(control_bit);
|
||||||
|
println!(
|
||||||
|
"data[0] = {:#04x} control bit = {:#b} encoded = {:#012b}",
|
||||||
|
csr::cxp::data_0_read(),
|
||||||
|
csr::cxp::control_bit_0_read(),
|
||||||
|
csr::cxp::encoded_0_read(),
|
||||||
|
);
|
||||||
|
println!(
|
||||||
|
"data[1] = {:#04x} control bit = {:#b} encoded = {:#012b}",
|
||||||
|
csr::cxp::data_1_read(),
|
||||||
|
csr::cxp::control_bit_1_read(),
|
||||||
|
csr::cxp::encoded_1_read(),
|
||||||
|
);
|
||||||
|
|
||||||
|
for _ in 0..20 {
|
||||||
|
timer.delay_us(100);
|
||||||
|
// println!(
|
||||||
|
// "data[0] = {:#012b} data[1] = {:#012b}",
|
||||||
|
// csr::cxp::rxdata_0_read(),
|
||||||
|
// csr::cxp::rxdata_1_read(),
|
||||||
|
// );
|
||||||
|
println!(
|
||||||
|
"decoded_data[0] = {:#04x} decoded_k[0] = {:#b} decoded_data[1] = {:#04x} decoded_k[1] = {:#b}",
|
||||||
|
csr::cxp::decoded_data_0_read(),
|
||||||
|
csr::cxp::decoded_k_0_read(),
|
||||||
|
csr::cxp::decoded_data_1_read(),
|
||||||
|
csr::cxp::decoded_k_1_read(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,8 +42,11 @@ pub mod si5324;
|
||||||
pub mod si549;
|
pub mod si549;
|
||||||
use core::{cmp, str};
|
use core::{cmp, str};
|
||||||
|
|
||||||
|
#[cfg(has_cxp)]
|
||||||
|
pub mod cxp_downconn;
|
||||||
#[cfg(has_cxp)]
|
#[cfg(has_cxp)]
|
||||||
pub mod cxp_upconn;
|
pub mod cxp_upconn;
|
||||||
|
|
||||||
pub fn identifier_read(buf: &mut [u8]) -> &str {
|
pub fn identifier_read(buf: &mut [u8]) -> &str {
|
||||||
unsafe {
|
unsafe {
|
||||||
pl::csr::identifier::address_write(0);
|
pl::csr::identifier::address_write(0);
|
||||||
|
|
Loading…
Reference in New Issue