1pub const MEMORY_END: usize = 0x8800_0000;
2
3pub const MMIO: &[(usize, usize)] = &[
4 (0x0010_0000, 0x00_2000), (0x2000000, 0x10000),
6 (0xc000000, 0x210000), (0x10000000, 0x9000), ];
9
10pub type BlockDeviceImpl = crate::drivers::block::VirtIOBlock;
11pub type CharDeviceImpl = crate::drivers::chardev::NS16550a<VIRT_UART>;
12
13pub const VIRT_PLIC: usize = 0xC00_0000;
14pub const VIRT_UART: usize = 0x1000_0000;
15#[allow(unused)]
16pub const VIRTGPU_XRES: u32 = 1280;
17#[allow(unused)]
18pub const VIRTGPU_YRES: u32 = 800;
19
20use crate::drivers::block::BLOCK_DEVICE;
21use crate::drivers::chardev::{CharDevice, UART};
22use crate::drivers::plic::{IntrTargetPriority, PLIC};
23use crate::drivers::{KEYBOARD_DEVICE, MOUSE_DEVICE};
24
25pub fn device_init() {
26 use riscv::register::sie;
27 let mut plic = unsafe { PLIC::new(VIRT_PLIC) };
28 let hart_id: usize = 0;
29 let supervisor = IntrTargetPriority::Supervisor;
30 let machine = IntrTargetPriority::Machine;
31 plic.set_threshold(hart_id, supervisor, 0);
32 plic.set_threshold(hart_id, machine, 1);
33 for intr_src_id in [5usize, 6, 8, 10] {
35 plic.enable(hart_id, supervisor, intr_src_id);
36 plic.set_priority(intr_src_id, 1);
37 }
38 unsafe {
39 sie::set_sext();
40 }
41}
42
43pub fn irq_handler() {
44 let mut plic = unsafe { PLIC::new(VIRT_PLIC) };
45 let intr_src_id = plic.claim(0, IntrTargetPriority::Supervisor);
46 match intr_src_id {
47 5 => KEYBOARD_DEVICE.handle_irq(),
48 6 => MOUSE_DEVICE.handle_irq(),
49 8 => BLOCK_DEVICE.handle_irq(),
50 10 => UART.handle_irq(),
51 _ => panic!("unsupported IRQ {}", intr_src_id),
52 }
53 plic.complete(0, IntrTargetPriority::Supervisor, intr_src_id);
54}