keyboard through PCI&VirtIO
This commit is contained in:
24
src/main.rs
24
src/main.rs
@@ -16,11 +16,15 @@ use log::info;
|
||||
|
||||
use crate::{
|
||||
io::init_log,
|
||||
pci::scan_pci_for_virtio_keyboard,
|
||||
riscv::enable_supervisor_interrupt,
|
||||
scheduler::{SCHEDULER, idle},
|
||||
user::{proc2, test},
|
||||
vga::Vga,
|
||||
virtio::{Virtqueue, input::{VirtioInputDriver, init_plic_m_mode}},
|
||||
virtio::{
|
||||
Virtqueue,
|
||||
input::{VirtioPciDriver, init_plic_pci},
|
||||
},
|
||||
virtual_fs::init_file_system,
|
||||
};
|
||||
|
||||
@@ -32,6 +36,7 @@ mod fs;
|
||||
mod interrupt;
|
||||
mod io;
|
||||
mod panic_handler;
|
||||
mod pci;
|
||||
mod process;
|
||||
mod riscv;
|
||||
mod scheduler;
|
||||
@@ -57,9 +62,8 @@ const _: () = assert!(core::mem::size_of::<usize>() == core::mem::size_of::<u64>
|
||||
|
||||
// 1. Allouer de la mémoire statique alignée pour la queue
|
||||
static mut KBD_QUEUE: Virtqueue = unsafe { core::mem::zeroed() };
|
||||
// 2. Initialisation (adresse 0x10001000 typique pour QEMU virt machine)
|
||||
pub static mut KBD_DRIVER: VirtioInputDriver =
|
||||
unsafe { VirtioInputDriver::new(0x10001000, &mut KBD_QUEUE) };
|
||||
pub static mut KBD_DRIVER: Option<VirtioPciDriver> = None;
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn supervisor_mode_entry() {
|
||||
unsafe {
|
||||
@@ -84,8 +88,16 @@ pub extern "C" fn supervisor_mode_entry() {
|
||||
enable_supervisor_interrupt();
|
||||
|
||||
unsafe {
|
||||
KBD_DRIVER.init();
|
||||
init_plic_m_mode();
|
||||
let pci_info = scan_pci_for_virtio_keyboard().unwrap();
|
||||
KBD_DRIVER = Some(VirtioPciDriver::new(
|
||||
pci_info.common_cfg,
|
||||
pci_info.notify_cfg,
|
||||
pci_info.isr_cfg,
|
||||
pci_info.notify_multiplier,
|
||||
&mut KBD_QUEUE,
|
||||
));
|
||||
KBD_DRIVER.as_mut().unwrap().init();
|
||||
init_plic_pci(34);
|
||||
}
|
||||
idle();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user