forked from M-Labs/zynq-rs
54 lines
1.2 KiB
Rust
54 lines
1.2 KiB
Rust
use crate::uart::Uart;
|
|
use crate::mutex::Mutex;
|
|
|
|
const UART_RATE: u32 = 115_200;
|
|
static mut UART: Option<Uart> = None;
|
|
static mut UART_MUTEX: Mutex = Mutex::new_unlocked();
|
|
|
|
#[doc(hidden)]
|
|
fn get_uart() -> &'static mut Uart {
|
|
unsafe {
|
|
match &mut UART {
|
|
None => {
|
|
let uart = Uart::serial(UART_RATE);
|
|
UART = Some(uart);
|
|
UART.as_mut().unwrap()
|
|
}
|
|
Some(uart) => uart,
|
|
}
|
|
}
|
|
}
|
|
|
|
// call f(UART) with UART locked via UART_MUTEX
|
|
pub fn with_uart<F>(f: F) where F: Fn(&mut Uart) -> () {
|
|
unsafe {
|
|
UART_MUTEX.acquire();
|
|
}
|
|
f(get_uart());
|
|
unsafe {
|
|
UART_MUTEX.release();
|
|
}
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! print {
|
|
($($arg:tt)*) => ({
|
|
crate::stdio::with_uart(|uart| {
|
|
use core::fmt::Write;
|
|
let _ = write!(uart, $($arg)*);
|
|
});
|
|
})
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! println {
|
|
($($arg:tt)*) => ({
|
|
crate::stdio::with_uart(|uart| {
|
|
use core::fmt::Write;
|
|
let _ = write!(uart, $($arg)*);
|
|
let _ = write!(uart, "\r\n");
|
|
while !uart.tx_fifo_empty() {}
|
|
});
|
|
})
|
|
}
|