use core::marker::PhantomData; use super::io::Io; /// Generic PIO #[derive(Copy, Clone)] pub struct Pio { port: u16, value: PhantomData, } impl Pio { /// Create a PIO from a given port pub fn new(port: u16) -> Self { Pio:: { port: port, value: PhantomData, } } } /// Read/Write for byte PIO impl Io for Pio { type Value = u8; /// Read fn read(&self) -> u8 { let value: u8; unsafe { asm!("in $0, $1" : "={al}"(value) : "{dx}"(self.port) : "memory" : "intel", "volatile"); } value } /// Write fn write(&mut self, value: u8) { unsafe { asm!("out $1, $0" : : "{al}"(value), "{dx}"(self.port) : "memory" : "intel", "volatile"); } } } /// Read/Write for word PIO impl Io for Pio { type Value = u16; /// Read fn read(&self) -> u16 { let value: u16; unsafe { asm!("in $0, $1" : "={ax}"(value) : "{dx}"(self.port) : "memory" : "intel", "volatile"); } value } /// Write fn write(&mut self, value: u16) { unsafe { asm!("out $1, $0" : : "{ax}"(value), "{dx}"(self.port) : "memory" : "intel", "volatile"); } } } /// Read/Write for doubleword PIO impl Io for Pio { type Value = u32; /// Read fn read(&self) -> u32 { let value: u32; unsafe { asm!("in $0, $1" : "={eax}"(value) : "{dx}"(self.port) : "memory" : "intel", "volatile"); } value } /// Write fn write(&mut self, value: u32) { unsafe { asm!("out $1, $0" : : "{eax}"(value), "{dx}"(self.port) : "memory" : "intel", "volatile"); } } }