Soft panic for RTIO PLL reasons #199
|
@ -127,10 +127,6 @@ class GenericStandalone(SoCCore):
|
||||||
platform.add_platform_command("create_clock -name clk_fpga_0 -period 8 [get_pins \"PS7/FCLKCLK[0]\"]")
|
platform.add_platform_command("create_clock -name clk_fpga_0 -period 8 [get_pins \"PS7/FCLKCLK[0]\"]")
|
||||||
platform.add_platform_command("set_input_jitter clk_fpga_0 0.24")
|
platform.add_platform_command("set_input_jitter clk_fpga_0 0.24")
|
||||||
|
|
||||||
self.submodules.error_led = gpio.GPIOOut(Cat(
|
|
||||||
self.platform.request("error_led")))
|
|
||||||
self.csr_devices.append("error_led")
|
|
||||||
|
|
||||||
self.submodules += SMAClkinForward(self.platform)
|
self.submodules += SMAClkinForward(self.platform)
|
||||||
|
|
||||||
self.rustc_cfg["has_si5324"] = None
|
self.rustc_cfg["has_si5324"] = None
|
||||||
|
@ -219,10 +215,6 @@ class GenericMaster(SoCCore):
|
||||||
|
|
||||||
self.submodules += SMAClkinForward(self.platform)
|
self.submodules += SMAClkinForward(self.platform)
|
||||||
|
|
||||||
self.submodules.error_led = gpio.GPIOOut(Cat(
|
|
||||||
self.platform.request("error_led")))
|
|
||||||
self.csr_devices.append("error_led")
|
|
||||||
|
|
||||||
data_pads = [platform.request("sfp", i) for i in range(4)]
|
data_pads = [platform.request("sfp", i) for i in range(4)]
|
||||||
|
|
||||||
self.submodules.drtio_transceiver = gtx_7series.GTX(
|
self.submodules.drtio_transceiver = gtx_7series.GTX(
|
||||||
|
@ -346,10 +338,6 @@ class GenericSatellite(SoCCore):
|
||||||
platform.add_platform_command("create_clock -name clk_fpga_0 -period 8 [get_pins \"PS7/FCLKCLK[0]\"]")
|
platform.add_platform_command("create_clock -name clk_fpga_0 -period 8 [get_pins \"PS7/FCLKCLK[0]\"]")
|
||||||
platform.add_platform_command("set_input_jitter clk_fpga_0 0.24")
|
platform.add_platform_command("set_input_jitter clk_fpga_0 0.24")
|
||||||
|
|
||||||
self.submodules.error_led = gpio.GPIOOut(Cat(
|
|
||||||
self.platform.request("error_led")))
|
|
||||||
self.csr_devices.append("error_led")
|
|
||||||
|
|
||||||
self.crg = self.ps7 # HACK for eem_7series to find the clock
|
self.crg = self.ps7 # HACK for eem_7series to find the clock
|
||||||
self.submodules.rtio_crg = RTIOClockMultiplier(rtio_clk_freq)
|
self.submodules.rtio_crg = RTIOClockMultiplier(rtio_clk_freq)
|
||||||
self.csr_devices.append("rtio_crg")
|
self.csr_devices.append("rtio_crg")
|
||||||
|
|
|
@ -4,6 +4,8 @@ use embedded_hal::blocking::delay::DelayMs;
|
||||||
use libasync::task;
|
use libasync::task;
|
||||||
use libconfig::Config;
|
use libconfig::Config;
|
||||||
use libboard_artiq::pl;
|
use libboard_artiq::pl;
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
use libboard_zynq::error_led::ErrorLED;
|
||||||
#[cfg(has_si5324)]
|
#[cfg(has_si5324)]
|
||||||
use libboard_zynq::i2c::I2c;
|
use libboard_zynq::i2c::I2c;
|
||||||
#[cfg(has_si5324)]
|
#[cfg(has_si5324)]
|
||||||
|
@ -69,7 +71,7 @@ fn get_rtio_clock_cfg(cfg: &Config) -> RtioClock {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn init_rtio(timer: &mut GlobalTimer, _clk: RtioClock) {
|
fn init_rtio(timer: &mut GlobalTimer, _clk: RtioClock) -> Result<()> {
|
||||||
#[cfg(has_rtio_crg_clock_sel)]
|
#[cfg(has_rtio_crg_clock_sel)]
|
||||||
let clock_sel = match _clk {
|
let clock_sel = match _clk {
|
||||||
RtioClock::Ext0_Bypass => {
|
RtioClock::Ext0_Bypass => {
|
||||||
|
@ -98,19 +100,14 @@ fn init_rtio(timer: &mut GlobalTimer, _clk: RtioClock) {
|
||||||
info!("RTIO PLL locked");
|
info!("RTIO PLL locked");
|
||||||
} else {
|
} else {
|
||||||
error!("RTIO PLL failed to lock");
|
error!("RTIO PLL failed to lock");
|
||||||
#[cfg(feature = "target_kasli_soc")]
|
return Err("RTIO PLL failed to lock");
|
||||||
{
|
|
||||||
unsafe {
|
|
||||||
pl::csr::error_led::out_write(1);
|
|
||||||
}
|
|
||||||
soft_panic();
|
|
||||||
// try "soft" panic
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
pl::csr::rtio_core::reset_phy_write(1);
|
pl::csr::rtio_core::reset_phy_write(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(has_drtio)]
|
#[cfg(has_drtio)]
|
||||||
|
@ -126,7 +123,7 @@ fn init_drtio(timer: &mut GlobalTimer)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(has_si5324)]
|
#[cfg(has_si5324)]
|
||||||
fn setup_si5324(i2c: &mut I2c, timer: &mut GlobalTimer, clk: RtioClock) {
|
fn setup_si5324(i2c: &mut I2c, timer: &mut GlobalTimer, clk: RtioClock) -> Result<()> {
|
||||||
let (si5324_settings, si5324_ref_input) = match clk {
|
let (si5324_settings, si5324_ref_input) = match clk {
|
||||||
RtioClock::Ext0_Synth0_10to125 => { // 125 MHz output from 10 MHz CLKINx reference, 504 Hz BW
|
RtioClock::Ext0_Synth0_10to125 => { // 125 MHz output from 10 MHz CLKINx reference, 504 Hz BW
|
||||||
info!("using 10MHz reference to make 125MHz RTIO clock with PLL");
|
info!("using 10MHz reference to make 125MHz RTIO clock with PLL");
|
||||||
|
@ -241,7 +238,7 @@ 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init(timer: &mut GlobalTimer, cfg: &Config) {
|
pub fn init(timer: &mut GlobalTimer, cfg: &Config) {
|
||||||
|
@ -251,26 +248,39 @@ pub fn init(timer: &mut GlobalTimer, cfg: &Config) {
|
||||||
{
|
{
|
||||||
let i2c = unsafe { (&mut i2c::I2C_BUS).as_mut().unwrap() };
|
let i2c = unsafe { (&mut i2c::I2C_BUS).as_mut().unwrap() };
|
||||||
let si5324_ext_input = si5324::Input::Ckin1;
|
let si5324_ext_input = si5324::Input::Ckin1;
|
||||||
match clk {
|
let res = match clk {
|
||||||
RtioClock::Ext0_Bypass => si5324::bypass(i2c, si5324_ext_input, timer).expect("cannot bypass Si5324"),
|
RtioClock::Ext0_Bypass => si5324::bypass(i2c, si5324_ext_input, timer),
|
||||||
_ => setup_si5324(i2c, timer, clk),
|
_ => setup_si5324(i2c, timer, clk),
|
||||||
}
|
}
|
||||||
|
if res.is_err() {
|
||||||
|
soft_panic();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[cfg(has_drtio)]
|
#[cfg(has_drtio)]
|
||||||
init_drtio(timer);
|
init_drtio(timer);
|
||||||
|
|
||||||
init_rtio(timer, clk);
|
if init_rtio(timer, clk).is_err() {
|
||||||
|
soft_panic();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "target_kasli_soc")]
|
|
||||||
fn soft_panic() {
|
fn soft_panic() {
|
||||||
|
error!("Error setting up RTIO clocking. Only mgmt interface will be available.");
|
||||||
// start mgmt service but nothing else
|
// start mgmt service but nothing else
|
||||||
let cfg = match Config::new() {
|
let cfg = match Config::new() {
|
||||||
Ok(cfg) => cfg,
|
Ok(cfg) => cfg,
|
||||||
Err(_) => Config::new_dummy()
|
Err(_) => Config::new_dummy()
|
||||||
};
|
};
|
||||||
mgmt::start(cfg);
|
mgmt::start(cfg);
|
||||||
|
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
{
|
||||||
|
let mut err_led = ErrorLED::error_led();
|
||||||
|
err_led.toggle(true);
|
||||||
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
task::block_on(task::r#yield());
|
task::block_on(task::r#yield());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue