litex_hal/
uart.rs

1#[macro_export]
2macro_rules! uart {
3    ($(
4        $UARTX:ident: $PACUARTX:ty,
5    )+) => {
6        $(
7            #[derive(Debug)]
8            pub struct $UARTX {
9                registers: $PACUARTX,
10            }
11
12            impl $UARTX {
13                pub fn new(registers: $PACUARTX) -> Self {
14                    Self { registers }
15                }
16
17                pub fn free(self) -> $PACUARTX {
18                    self.registers
19                }
20            }
21
22            impl $crate::hal::serial::Write<u8> for $UARTX {
23                type Error = core::convert::Infallible;
24
25                fn write(&mut self, word: u8) -> $crate::nb::Result<(), Self::Error> {
26                    // Wait until TXFULL is `0`
27                    if self.registers.txfull().read().bits() != 0 {
28                        Err($crate::nb::Error::WouldBlock)
29                    } else {
30                        unsafe {
31                            self.registers.rxtx().write(|w| w.rxtx().bits(word.into()));
32                        }
33                        Ok(())
34                    }
35                }
36                fn flush(&mut self) -> $crate::nb::Result<(), Self::Error> {
37                    if self.registers.txempty().read().bits() != 0 {
38                        Ok(())
39                    } else {
40                        Err($crate::nb::Error::WouldBlock)
41                    }
42                }
43            }
44
45            impl $crate::hal::blocking::serial::write::Default<u8> for $UARTX {}
46
47            impl core::fmt::Write for $UARTX {
48                fn write_str(&mut self, s: &str) -> core::fmt::Result {
49                    use $crate::hal::prelude::*;
50                    self.bwrite_all(s.as_bytes()).ok();
51                    Ok(())
52                }
53            }
54
55            impl From<$PACUARTX> for $UARTX {
56                fn from(registers: $PACUARTX) -> $UARTX {
57                    $UARTX::new(registers)
58                }
59            }
60        )+
61    }
62}