os/device/console/
uart_console.rs1use alloc::{string::String, sync::Arc};
4
5use crate::device::{
6 console::{CONSOLES, Console},
7 serial::SerialDriver,
8};
9
10struct UARTConsole {
11 uart: Arc<dyn SerialDriver>,
12}
13
14impl Console for UARTConsole {
15 fn write_str(&self, s: &str) {
16 self.uart.write(s.as_bytes());
17 }
18
19 fn read_char(&self) -> char {
20 let byte = self.uart.read();
21 self.uart.write(&[byte]); byte as char
23 }
24
25 fn read_line(&self, buf: &mut String) {
26 loop {
27 let c = self.read_char();
28 if c == '\n' || c == '\r' {
29 break;
30 }
31 buf.push(c);
32 }
33 }
34
35 fn flush(&self) {
36 }
38}
39
40pub fn init(uart: Arc<dyn SerialDriver>) {
41 let console = Arc::new(UARTConsole { uart });
42 CONSOLES.write().push(console);
43}