mirror of
https://github.com/XunilGroup/XunilOS.git
synced 2026-06-02 12:44:24 +02:00
2a73c3aeb4
interrupts with IRQ and syscalls, make phys_to_virt checked, recreate stack on aarch64, make serial console finally line wrap and have max height correctly, add U64Buf for when i need number debug, rename mouse and keyboard files to kmi and merge them, add non-working pl050 support
88 lines
2.1 KiB
Rust
88 lines
2.1 KiB
Rust
use crate::arch::arch::safe_lock;
|
|
|
|
const KMI0_BASE: u64 = 0xFFFF_0000_0905_0000;
|
|
const KMI1_BASE: u64 = 0xFFFF_0000_0906_0000;
|
|
const KMI_CR: u64 = 0x00;
|
|
const KMI_STAT: u64 = 0x04;
|
|
const KMI_DATA: u64 = 0x08;
|
|
|
|
pub unsafe fn kmi_write(base: u64, kmi_type: u64, val: u8) {
|
|
let data = (base + kmi_type) as *mut u32;
|
|
unsafe { data.write_volatile(val as u32) };
|
|
}
|
|
|
|
pub fn kmi_read(base: u64, kmi_type: u64) -> u8 {
|
|
let data = (base + kmi_type) as *const u32;
|
|
unsafe { data.read_volatile() as u8 }
|
|
}
|
|
|
|
pub unsafe fn read_mouse_control() -> u8 {
|
|
kmi_read(KMI1_BASE, KMI_STAT)
|
|
}
|
|
|
|
pub unsafe fn read_mouse_data() -> u8 {
|
|
kmi_read(KMI1_BASE, KMI_DATA)
|
|
}
|
|
|
|
pub unsafe fn read_keyboard_control() -> u8 {
|
|
kmi_read(KMI0_BASE, KMI_STAT)
|
|
}
|
|
pub unsafe fn read_keyboard_data() -> u8 {
|
|
kmi_read(KMI0_BASE, KMI_DATA)
|
|
}
|
|
|
|
pub unsafe fn setup_kmi() -> u8 {
|
|
safe_lock(|| unsafe {
|
|
let cr0 = (KMI0_BASE + KMI_CR) as *mut u32;
|
|
cr0.write_volatile(0x14); // enable keyboard
|
|
|
|
kmi_write(KMI0_BASE, KMI_DATA, 0xFF); // reset keyboard
|
|
|
|
if kmi_read(KMI0_BASE, KMI_DATA) != 0xFA {
|
|
// ACK
|
|
return 2;
|
|
}
|
|
|
|
if kmi_read(KMI0_BASE, KMI_DATA) != 0xAA {
|
|
// self-test passed
|
|
return 3;
|
|
}
|
|
|
|
kmi_write(KMI0_BASE, KMI_DATA, 0xF4); // enable keyboard data reporting
|
|
|
|
if kmi_read(KMI0_BASE, KMI_DATA) != 0xFA {
|
|
// ACK
|
|
return 4;
|
|
}
|
|
|
|
let cr1 = (KMI1_BASE + KMI_CR) as *mut u32;
|
|
cr1.write_volatile(0x14); // enable mouse
|
|
|
|
kmi_write(KMI1_BASE, KMI_DATA, 0xFF); // reset mouse
|
|
|
|
if kmi_read(KMI1_BASE, KMI_DATA) != 0xFA {
|
|
// ACK
|
|
return 5;
|
|
}
|
|
|
|
if kmi_read(KMI1_BASE, KMI_DATA) != 0xAA {
|
|
// self-test passed
|
|
return 6;
|
|
}
|
|
|
|
if kmi_read(KMI1_BASE, KMI_DATA) != 0x00 {
|
|
// mouse ID
|
|
return 7;
|
|
}
|
|
|
|
kmi_write(KMI1_BASE, KMI_DATA, 0xF4); // enable mouse data reporting
|
|
|
|
if kmi_read(KMI1_BASE, KMI_DATA) != 0xFA {
|
|
// ACK
|
|
return 8;
|
|
}
|
|
|
|
return 9;
|
|
})
|
|
}
|