Support for the error LED on Kasli-SoC #100
@ -183,6 +183,20 @@ pub fn main_core0() {
|
|||||||
println!("");
|
println!("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
{
|
||||||
|
let mut err_cdwn = timer.countdown();
|
||||||
|
let mut err_state = true;
|
||||||
|
let mut led = zynq::error_led::ErrorLED::error_led();
|
||||||
|
task::spawn( async move {
|
||||||
|
loop {
|
||||||
|
led.toggle(err_state);
|
||||||
|
err_state = !err_state;
|
||||||
|
delay(&mut err_cdwn, Milliseconds(1000)).await;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let eth = zynq::eth::Eth::eth0(HWADDR.clone());
|
let eth = zynq::eth::Eth::eth0(HWADDR.clone());
|
||||||
println!("Eth on");
|
println!("Eth on");
|
||||||
|
|
||||||
|
116
libboard_zynq/src/error_led.rs
Normal file
116
libboard_zynq/src/error_led.rs
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
use libregister::{RegisterRW, RegisterW};
|
||||||
|
use libregister::{register, register_at, register_bit, register_bits};
|
||||||
|
use super::slcr;
|
||||||
|
|
||||||
|
pub struct ErrorLED {
|
||||||
|
regs: RegisterBlock,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ErrorLED {
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
pub fn error_led() -> Self {
|
||||||
|
slcr::RegisterBlock::unlocked(|slcr| {
|
||||||
|
// Error LED at MIO pin 37
|
||||||
|
slcr.mio_pin_37.write(
|
||||||
|
slcr::MioPin37::zeroed()
|
||||||
|
.l3_sel(0b000)
|
||||||
|
.io_type(slcr::IoBufferType::Lvcmos25)
|
||||||
|
.pullup(true)
|
||||||
|
.disable_rcvr(true)
|
||||||
|
);
|
||||||
|
// reset
|
||||||
|
slcr.gpio_rst_ctrl.reset_gpio();
|
||||||
|
});
|
||||||
|
|
||||||
|
Self::error_led_common(0xFFFF - 0x0080)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn error_led_common(gpio_output_mask: u16) -> Self {
|
||||||
|
// Setup register block
|
||||||
|
let self_ = Self {
|
||||||
|
regs: RegisterBlock::error_led(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Setup GPIO output mask
|
||||||
|
self_.regs.gpio_output_mask.modify(|_, w| {
|
||||||
|
w.mask(gpio_output_mask)
|
||||||
|
});
|
||||||
|
|
||||||
|
self_.regs.gpio_direction.modify(|_, w| {
|
||||||
|
w.lederr(true)
|
||||||
|
});
|
||||||
|
|
||||||
|
self_
|
||||||
|
}
|
||||||
|
|
||||||
|
fn led_oe(&mut self, oe: bool) {
|
||||||
|
self.regs.gpio_output_enable.modify(|_, w| {
|
||||||
|
w.lederr(oe)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn led_o(&mut self, o: bool) {
|
||||||
|
self.regs.gpio_output_mask.modify(|_, w| {
|
||||||
|
w.lederr_o(o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn toggle(&mut self, state: bool) {
|
||||||
|
self.led_o(state);
|
||||||
|
self.led_oe(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub struct RegisterBlock {
|
||||||
|
pub gpio_output_mask: &'static mut GPIOOutputMask,
|
||||||
|
pub gpio_direction: &'static mut GPIODirection,
|
||||||
|
pub gpio_output_enable: &'static mut GPIOOutputEnable,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RegisterBlock {
|
||||||
|
pub fn error_led() -> Self {
|
||||||
|
Self {
|
||||||
|
gpio_output_mask: GPIOOutputMask::new(),
|
||||||
|
gpio_direction: GPIODirection::new(),
|
||||||
|
gpio_output_enable: GPIOOutputEnable::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
register!(gpio_output_mask,
|
||||||
|
/// MASK_DATA_1_LSW:
|
||||||
|
/// Maskable output data for MIO[47:32]
|
||||||
|
GPIOOutputMask, RW, u32);
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
register_at!(GPIOOutputMask, 0xE000A008, new);
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
register_bit!(gpio_output_mask,
|
||||||
|
/// Output for LED_ERR (MIO[37])
|
||||||
|
lederr_o, 5);
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
register_bits!(gpio_output_mask,
|
||||||
|
mask, u16, 16, 31);
|
||||||
|
|
||||||
|
register!(gpio_direction,
|
||||||
|
/// DIRM_1:
|
||||||
|
/// Direction mode for MIO[53:32]; 0/1 = in/out
|
||||||
|
GPIODirection, RW, u32);
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
register_at!(GPIODirection, 0xE000A244, new);
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
register_bit!(gpio_direction,
|
||||||
|
/// Direction for LED_ERR
|
||||||
|
lederr, 5);
|
||||||
|
|
||||||
|
register!(gpio_output_enable,
|
||||||
|
/// OEN_1:
|
||||||
|
/// Output enable for MIO[53:32]
|
||||||
|
GPIOOutputEnable, RW, u32);
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
register_at!(GPIOOutputEnable, 0xE000A248, new);
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
register_bit!(gpio_output_enable,
|
||||||
|
/// Output enable for LED_ERR
|
||||||
|
lederr, 5);
|
||||||
|
|
@ -23,3 +23,5 @@ pub mod sdio;
|
|||||||
pub mod i2c;
|
pub mod i2c;
|
||||||
pub mod logger;
|
pub mod logger;
|
||||||
pub mod ps7_init;
|
pub mod ps7_init;
|
||||||
|
#[cfg(feature="target_kasli_soc")]
|
||||||
|
pub mod error_led;
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
use libboard_zynq::{print, println};
|
use libboard_zynq::{print, println};
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
use libboard_zynq::error_led::ErrorLED;
|
||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
fn panic(info: &core::panic::PanicInfo) -> ! {
|
fn panic(info: &core::panic::PanicInfo) -> ! {
|
||||||
@ -13,6 +15,10 @@ fn panic(info: &core::panic::PanicInfo) -> ! {
|
|||||||
} else {
|
} else {
|
||||||
println!("");
|
println!("");
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
{
|
||||||
|
let mut err_led = ErrorLED::error_led();
|
||||||
|
err_led.toggle(true);
|
||||||
|
}
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user