parent
4029e6d2d3
commit
a76bfbc7f8
@ -0,0 +1,64 @@
|
||||
use syscall::io::*;
|
||||
|
||||
pub static mut MASTER: Pic = Pic::new(0x20);
|
||||
pub static mut SLAVE: Pic = Pic::new(0xA0);
|
||||
|
||||
pub unsafe fn init() {
|
||||
// Start initialization
|
||||
MASTER.cmd.write(0x11);
|
||||
SLAVE.cmd.write(0x11);
|
||||
|
||||
// Set offsets
|
||||
MASTER.data.write(0x20);
|
||||
SLAVE.data.write(0x28);
|
||||
|
||||
// Set up cascade
|
||||
MASTER.data.write(4);
|
||||
SLAVE.data.write(2);
|
||||
|
||||
// Set up interrupt mode (1 is 8086/88 mode, 2 is auto EOI)
|
||||
MASTER.data.write(1);
|
||||
SLAVE.data.write(1);
|
||||
|
||||
// Unmask interrupts
|
||||
MASTER.data.write(0);
|
||||
SLAVE.data.write(0);
|
||||
|
||||
// Ack remaining interrupts
|
||||
MASTER.ack();
|
||||
SLAVE.ack();
|
||||
}
|
||||
|
||||
pub struct Pic {
|
||||
cmd: Pio<u8>,
|
||||
data: Pio<u8>,
|
||||
}
|
||||
|
||||
impl Pic {
|
||||
pub const fn new(port: u16) -> Pic {
|
||||
Pic {
|
||||
cmd: Pio::new(port),
|
||||
data: Pio::new(port + 1),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ack(&mut self) {
|
||||
self.cmd.write(0x20);
|
||||
}
|
||||
|
||||
pub fn mask_set(&mut self, irq: u8) {
|
||||
assert!(irq < 8);
|
||||
|
||||
let mut mask = self.data.read();
|
||||
mask |= 1 << irq;
|
||||
self.data.write(mask);
|
||||
}
|
||||
|
||||
pub fn mask_clear(&mut self, irq: u8) {
|
||||
assert!(irq < 8);
|
||||
|
||||
let mut mask = self.data.read();
|
||||
mask &= !(1 << irq);
|
||||
self.data.write(mask);
|
||||
}
|
||||
}
|
Loading…
Reference in new issue