#![allow(dead_code)]
use crate::arch::x86::device::io_port::{IoPort, ReadWriteAccess, WriteOnlyAccess};
pub struct SerialPort {
data: IoPort<u8, ReadWriteAccess>,
int_en: IoPort<u8, WriteOnlyAccess>,
fifo_ctrl: IoPort<u8, WriteOnlyAccess>,
line_ctrl: IoPort<u8, WriteOnlyAccess>,
modem_ctrl: IoPort<u8, WriteOnlyAccess>,
line_status: IoPort<u8, ReadWriteAccess>,
modem_status: IoPort<u8, ReadWriteAccess>,
}
impl SerialPort {
pub const unsafe fn new(port: u16) -> Self {
let data = IoPort::new(port);
let int_en = IoPort::new(port + 1);
let fifo_ctrl = IoPort::new(port + 2);
let line_ctrl = IoPort::new(port + 3);
let modem_ctrl = IoPort::new(port + 4);
let line_status = IoPort::new(port + 5);
let modem_status = IoPort::new(port + 6);
Self {
data,
int_en,
fifo_ctrl,
line_ctrl,
modem_ctrl,
line_status,
modem_status,
}
}
pub fn init(&self) {
self.int_en.write(0x00);
self.line_ctrl.write(0x80);
self.data.write(0x03);
self.int_en.write(0x00);
self.line_ctrl.write(0x03);
self.fifo_ctrl.write(0xC7);
self.modem_ctrl.write(0x0B);
self.int_en.write(0x01);
}
#[inline]
pub fn send(&self, data: u8) {
self.data.write(data);
}
#[inline]
pub fn recv(&self) -> u8 {
self.data.read()
}
#[inline]
pub fn line_status(&self) -> u8 {
self.line_status.read()
}
}