diff options
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/init/earlyprintk.rs | 7 | ||||
| -rw-r--r-- | kernel/src/io/output/serial/uart_16550.rs | 32 | ||||
| -rw-r--r-- | kernel/src/lib.rs | 1 |
3 files changed, 19 insertions, 21 deletions
diff --git a/kernel/src/init/earlyprintk.rs b/kernel/src/init/earlyprintk.rs index a217a92..1748620 100644 --- a/kernel/src/init/earlyprintk.rs +++ b/kernel/src/init/earlyprintk.rs @@ -3,11 +3,12 @@ use spin::{lazylock::LazyLock, mutex::Mutex}; use crate::io::output::serial::uart_16550::Uart16550; // TODO: use linkme instead -pub static EARLY_PRINTK_SERIAL: LazyLock<Option<Mutex<Uart16550>>> = - LazyLock::new(|| match unsafe { Uart16550::init([const { None }; 4]) } { +pub static EARLY_PRINTK_SERIAL: LazyLock<Option<Mutex<Uart16550>>> = LazyLock::new(|| { + match unsafe { Uart16550::init([Some(Default::default()), None, None, None]) } { Ok(o) => Some(Mutex::new(o)), Err(_) => None, - }); + } +}); #[macro_export] // TODO: configurable via option or arguments diff --git a/kernel/src/io/output/serial/uart_16550.rs b/kernel/src/io/output/serial/uart_16550.rs index acdebda..2df3668 100644 --- a/kernel/src/io/output/serial/uart_16550.rs +++ b/kernel/src/io/output/serial/uart_16550.rs @@ -1,8 +1,12 @@ +use core::array; + +use strum::{EnumIter, IntoEnumIterator}; use uart_16550::{ Config, Uart16550Tty, Uart16550TtyError, backend::{PioBackend, PortIoAddress}, }; +#[derive(EnumIter)] #[repr(u16)] // TODO: parse & validate via acpi alors scratch enum SerialPortAddress { @@ -35,23 +39,15 @@ impl Uart16550 { // TODO: more type safe mut config: [Option<Config>; 4], ) -> Result<Self, Uart16550TtyError<PortIoAddress>> { - unsafe { - Ok(Self { - coms: [ - init_port(&mut config[0], SerialPortAddress::COM1)?, - init_port(&mut config[1], SerialPortAddress::COM2)?, - init_port(&mut config[2], SerialPortAddress::COM3)?, - init_port(&mut config[3], SerialPortAddress::COM4)?, - ], - }) - } - } -} + let mut addrs = SerialPortAddress::iter(); -#[inline(always)] -unsafe fn init_port( - cfg: &mut Option<Config>, - addr: SerialPortAddress, -) -> Result<Option<Uart16550Tty<PioBackend>>, Uart16550TtyError<PortIoAddress>> { - cfg.take().map(|c| unsafe { Uart16550Tty::new_port(addr.into(), c) }).transpose() + Ok(Self { + coms: array::try_from_fn(|i| { + config[i] + .take() + .map(|c| unsafe { Uart16550Tty::new_port(addrs.next().unwrap().into(), c) }) + .transpose() + })?, + }) + } } diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index ed7bd16..eb1ab68 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +#![feature(array_try_from_fn)] pub mod init; pub mod io; |
