litex-hal 0.4.0

A embedded HAL crate for LiteX cores
Documentation
#[macro_export]
macro_rules! spi {
    ($(
        $SPIX:ident: ($PACSPIX:ty, $WORD:ty),
    )+) => {
        $(
            #[derive(Debug)]
            pub struct $SPIX {
                registers: $PACSPIX,
            }

            impl $SPIX {
                pub fn new(registers: $PACSPIX) -> Self {
                    Self { registers }
                }

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

            impl $crate::hal::spi::FullDuplex<$WORD> for $SPIX {
                type Error = core::convert::Infallible;

                fn read(&mut self) -> $crate::nb::Result<$WORD, Self::Error> {
                    if self.registers.status.read().done().bit() {
                        Ok(self.registers.miso.read().bits() as $WORD)
                    } else {
                        Err($crate::nb::Error::WouldBlock)
                    }
                }

                fn send(&mut self, word: u8) -> $crate::nb::Result<(), Self::Error> {
                    if self.registers.status.read().done().bit() {
                        unsafe {
                            self.registers.mosi.write(|w| w.bits(word.into()));
                            self.registers.control.write(|w| {
                                w.length().bits(8).start().bit(true)
                            });
                        }
                        Ok(())
                    } else {
                        Err($crate::nb::Error::WouldBlock)
                    }
                }
            }

            impl $crate::hal::blocking::spi::write::Default<u8> for $SPIX {}
            impl $crate::hal::blocking::spi::transfer::Default<u8> for $SPIX {}

            impl From<$PACSPIX> for $SPIX {
                fn from(registers: $PACSPIX) -> $SPIX {
                    $SPIX::new(registers)
                }
            }
        )+
    }
}