1
0
Fork 0

wip monitor loss of lock

This commit is contained in:
Simon Renblad 2024-09-26 17:38:12 +08:00
parent e7614d2e8e
commit fbe66684d5
3 changed files with 30 additions and 5 deletions

View File

@ -142,7 +142,9 @@ fn read(i2c: &mut I2c, reg: u8) -> Result<u8> {
} }
fn rmw<F>(i2c: &mut I2c, reg: u8, f: F) -> Result<()> fn rmw<F>(i2c: &mut I2c, reg: u8, f: F) -> Result<()>
where F: Fn(u8) -> u8 { where
F: Fn(u8) -> u8,
{
let value = read(i2c, reg)?; let value = read(i2c, reg)?;
write(i2c, reg, f(value))?; write(i2c, reg, f(value))?;
Ok(()) Ok(())
@ -171,7 +173,7 @@ fn has_ckin(i2c: &mut I2c, input: Input) -> Result<bool> {
} }
} }
fn locked(i2c: &mut I2c) -> Result<bool> { pub fn locked(i2c: &mut I2c) -> Result<bool> {
Ok((read(i2c, 130)? & 0x01) == 0) // LOL_INT=0 Ok((read(i2c, 130)? & 0x01) == 0) // LOL_INT=0
} }
@ -225,7 +227,12 @@ pub fn bypass(i2c: &mut I2c, input: Input, timer: &mut GlobalTimer) -> Result<()
Ok(()) Ok(())
} }
pub fn setup(i2c: &mut I2c, settings: &FrequencySettings, input: Input, timer: &mut GlobalTimer) -> Result<()> { pub fn setup(
i2c: &mut I2c,
settings: &FrequencySettings,
input: Input,
timer: &mut GlobalTimer,
) -> Result<()> {
let s = map_frequency_settings(settings)?; let s = map_frequency_settings(settings)?;
let cksel_reg = match input { let cksel_reg = match input {
Input::Ckin1 => 0b00, Input::Ckin1 => 0b00,

View File

@ -51,6 +51,8 @@ async fn io_expanders_service(
) { ) {
loop { loop {
task::r#yield().await; task::r#yield().await;
#[cfg(has_si5324)]
rtio_clocking::monitor_loss_lock(&mut i2c_bus.borrow_mut())
io_expander0 io_expander0
.borrow_mut() .borrow_mut()
.service(&mut i2c_bus.borrow_mut()) .service(&mut i2c_bus.borrow_mut())

View File

@ -26,6 +26,20 @@ pub enum RtioClock {
Ext0_Synth0_125to125, Ext0_Synth0_125to125,
} }
#[cfg(has_si5324)]
pub fn monitor_loss_lock(i2c_bus: &mut libboard_zynq::i2c::I2c) {
match si5324::locked(i2c_bus) {
Ok(val) => {
if !val {
warn!("si5324 detected loss of lock")
}
}
Err(s) => {
panic!(s)
}
}
}
#[allow(unreachable_code)] #[allow(unreachable_code)]
fn get_rtio_clock_cfg(cfg: &Config) -> RtioClock { fn get_rtio_clock_cfg(cfg: &Config) -> RtioClock {
let mut res = RtioClock::Default; let mut res = RtioClock::Default;
@ -259,7 +273,8 @@ fn setup_si5324(i2c: &mut I2c, timer: &mut GlobalTimer, clk: RtioClock) {
) )
} }
}; };
si5324::setup(i2c, &si5324_settings, si5324_ref_input, timer).expect("cannot initialize Si5324"); si5324::setup(i2c, &si5324_settings, si5324_ref_input, timer)
.expect("cannot initialize Si5324");
} }
#[cfg(all(has_si549, has_wrpll))] #[cfg(all(has_si549, has_wrpll))]
@ -338,7 +353,8 @@ fn wrpll_setup(timer: &mut GlobalTimer, clk: RtioClock, si549_settings: &si549::
}; };
si549::helper_setup(timer, &si549_settings).expect("cannot initialize helper Si549"); si549::helper_setup(timer, &si549_settings).expect("cannot initialize helper Si549");
si549::wrpll_refclk::setup(timer, mmcm_setting, mmcm_bypass).expect("cannot initialize ref clk for wrpll"); si549::wrpll_refclk::setup(timer, mmcm_setting, mmcm_bypass)
.expect("cannot initialize ref clk for wrpll");
si549::wrpll::select_recovered_clock(true, timer); si549::wrpll::select_recovered_clock(true, timer);
} }