#![no_std] #![no_main] extern crate libkos; use libkos::device::{self, KIND_UART_16550, KIND_VIRTIO}; use port_input_device::InputDevice; use types::bounded::CapSlot; #[unsafe(no_mangle)] extern "C" fn main() { let ep = CapSlot::new(0).unwrap(); // Init hands over the keyboard (virtio) or, failing that, the UART. let dev = device::receive_device(ep); match (dev.kind, dev.mmio) { (KIND_VIRTIO, Some(mmio)) => { if let Some(d) = driver_input_virtio::VirtioInputDevice::try_new(mmio) { run(d, dev.irq, ep); } } (KIND_UART_16550, Some(mmio)) => { if let Some(d) = driver_input_uart::UartInputDevice::new(mmio) { run(d, dev.irq, ep); } } _ => {} } libkos::println!("input: no usable input device, exiting"); libkos::syscall::exit(); } /// Serves `device`, woken by its interrupt when it has one. #[inline(never)] fn run(device: D, irq: Option, ep: CapSlot) -> ! { let mut srv = match irq.filter(|irq| device::bind_irq(*irq).is_ok()) { Some(irq) => input_server::server::InputServer::with_irq(device, irq), None => input_server::server::InputServer::new(device), }; server_framework::serve(&mut srv, ep) }