41 lines
1.3 KiB
Rust
41 lines
1.3 KiB
Rust
#![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<D: InputDevice>(device: D, irq: Option<CapSlot>, 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)
|
|
}
|