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 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}