keyboard through PCI&VirtIO

This commit is contained in:
2026-03-07 09:59:39 +01:00
parent 9b6aec28f5
commit 3947663b13
9 changed files with 325 additions and 153 deletions

View File

@@ -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();
}