use crate::{
arch::device::io_port::WriteOnlyAccess,
info,
io::{IoPort, sensitive_io_port},
};
sensitive_io_port! {
unsafe {
static MASTER_CMD: IoPort<u8, WriteOnlyAccess> = IoPort::new(0x20);
static MASTER_DATA: IoPort<u8, WriteOnlyAccess> = IoPort::new(0x21);
static SLAVE_CMD: IoPort<u8, WriteOnlyAccess> = IoPort::new(0xA0);
static SLAVE_DATA: IoPort<u8, WriteOnlyAccess> = IoPort::new(0xA1);
}
}
const IRQ_OFFSET: u8 = 0x20;
pub fn init_and_disable() {
info!("Initializing PIC as disabled");
set_mask(0xff, 0xff);
}
fn set_mask(master_mask: u8, slave_mask: u8) {
MASTER_CMD.write(0x11);
SLAVE_CMD.write(0x11);
MASTER_DATA.write(IRQ_OFFSET);
SLAVE_DATA.write(IRQ_OFFSET + 0x08);
MASTER_DATA.write(4);
SLAVE_DATA.write(2);
MASTER_DATA.write(1);
SLAVE_DATA.write(1);
MASTER_DATA.write(master_mask);
SLAVE_DATA.write(slave_mask);
}