#![no_std]
use core::marker::PhantomData;
mod rw;
pub use rw::*;
impl PortReadWrite for u8 {}
impl PortReadWrite for u16 {}
impl PortReadWrite for u32 {}
#[repr(transparent)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct ReadOnlyPort<T: PortRead> {
address: PortAddress,
marker: PhantomData<T>,
}
impl<T: PortRead> ReadOnlyPort<T> {
pub const unsafe fn new(address: PortAddress) -> Self {
ReadOnlyPort {
address,
marker: PhantomData,
}
}
pub const fn address(&self) -> PortAddress {
self.address
}
pub fn read(&self) -> T {
unsafe { T::read(self.address()) }
}
}
#[repr(transparent)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct WriteOnlyPort<T: PortWrite> {
address: PortAddress,
marker: PhantomData<T>,
}
impl<T: PortWrite> WriteOnlyPort<T> {
pub const unsafe fn new(address: PortAddress) -> Self {
WriteOnlyPort {
address,
marker: PhantomData,
}
}
pub const fn address(&self) -> PortAddress {
self.address
}
pub fn write(&mut self, value: T) {
unsafe { T::write(self.address(), value) }
}
}
#[repr(transparent)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct ReadWritePort<T: PortReadWrite> {
address: PortAddress,
marker: PhantomData<T>,
}
impl<T: PortReadWrite> ReadWritePort<T> {
pub const unsafe fn new(address: PortAddress) -> Self {
ReadWritePort {
address,
marker: PhantomData,
}
}
pub const fn address(&self) -> PortAddress {
self.address
}
pub fn read(&self) -> T {
unsafe { T::read(self.address()) }
}
pub fn write(&mut self, value: T) {
unsafe { T::write(self.address(), value) }
}
}