use rdif_serial::InterfaceRaw;
use super::{Kind, Ns16550, Ns16550IrqHandler, Ns16550Reciever, Ns16550Sender};
#[derive(Clone, Debug)]
pub struct Port {
port: u16,
}
impl Kind for Port {
fn read_reg(&self, reg: u8) -> u8 {
unsafe { x86::io::inb(self.port + reg as u16) }
}
fn write_reg(&self, reg: u8, val: u8) {
unsafe { x86::io::outb(self.port + reg as u16, val) }
}
fn get_base(&self) -> usize {
self.port as _
}
}
impl Ns16550<Port> {
pub fn new_port(port: u16, clock_freq: u32) -> Ns16550<Port> {
let base = Port { port };
Ns16550 {
base: base.clone(),
clock_freq,
irq: Some(Ns16550IrqHandler { base: base.clone() }),
tx: Some(crate::Sender::Ns16550Sender(Ns16550Sender {
base: base.clone(),
})),
rx: Some(crate::Reciever::Ns16550Reciever(Ns16550Reciever { base })),
}
}
pub fn new_port_boxed(port: u16, clock_freq: u32) -> rdif_serial::BSerial {
let mut serial = Ns16550::new_port(port, clock_freq);
serial.open();
rdif_serial::SerialDyn::new_boxed(serial)
}
pub fn take_tx(&mut self) -> Option<crate::Sender> {
self.tx.take()
}
pub fn take_rx(&mut self) -> Option<crate::Reciever> {
self.rx.take()
}
}