litex-hal 0.4.0

A embedded HAL crate for LiteX cores
Documentation
#[macro_export]
macro_rules! timer {
    ($(
        $TIMERX:ident: $PACTIMERX:ty,
    )+) => {
        $(
            #[derive(Debug)]
            pub struct $TIMERX {
                registers: $PACTIMERX,
                pub sys_clk: u32,
            }

            impl $TIMERX {
                pub fn new(registers: $PACTIMERX, sys_clk: u32) -> Self {
                    Self { registers, sys_clk }
                }

                pub fn free(self) -> $PACTIMERX {
                    self.registers
                }
            }

            impl<UXX: core::convert::Into<u32>> $crate::hal::blocking::delay::DelayMs<UXX> for $TIMERX {
                fn delay_ms(&mut self, ms: UXX) -> () {
                    let value: u32 = self.sys_clk / 1_000 * ms.into();
                    unsafe {
                        self.registers.en().write(|w| w.bits(0));
                        self.registers.reload().write(|w| w.bits(0));
                        self.registers.load().write(|w| w.bits(value));
                        self.registers.en().write(|w| w.bits(1));
                        self.registers.update_value().write(|w| w.bits(1));
                        while self.registers.value().read().bits() > 0 {
                            self.registers.update_value().write(|w| w.bits(1));
                        }
                    }
                }
            }
        )+
    }
}