use core::fmt::{self, Write}; const UART: usize = 0x1000_0000; const UART_STATUS: usize = UART + 0x5; const MASK: u8 = 1 << 5; pub struct Uart; impl Uart { pub fn write_byte(src: u8) { unsafe { let status = UART_STATUS as *mut u8; let reg = UART as *mut u8; while core::ptr::read_volatile(status) & MASK == 0 {} core::ptr::write_volatile(reg, src); } } pub fn print(args: fmt::Arguments) { Uart.write_fmt(args).ok(); } } impl Write for Uart { fn write_str(&mut self, s: &str) -> core::fmt::Result { for byte in s.as_bytes() { Self::write_byte(*byte); } Ok(()) } } #[macro_export] macro_rules! uprint { ($($arg:tt)*) => {{ $crate::uart::Uart::print(core::format_args!($($arg)*)); }}; } #[macro_export] macro_rules! uprintln { () => { $crate::uprint!("\n") }; ($($arg:tt)*) => {{ uprint!("{}\n", core::format_args!($($arg)*)); }} }