os/device/console/
uart_console.rs

1//! UART 控制台驱动模块
2
3use 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]); // 回显
22        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        // UART 通常不需要显式刷新
37    }
38}
39
40pub fn init(uart: Arc<dyn SerialDriver>) {
41    let console = Arc::new(UARTConsole { uart });
42    CONSOLES.write().push(console);
43}