use bitflags::bitflags;
use safe_mmio::fields::{ReadOnly, ReadPure, ReadPureWrite, ReadWrite, WriteOnly};
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
#[derive(Copy, Clone, Debug, Eq, FromBytes, Immutable, IntoBytes, KnownLayout, PartialEq)]
#[repr(transparent)]
pub struct Lcr(u32);
bitflags! {
impl Lcr: u32 {
const DLAB = 1 << 7;
const BC = 1 << 6;
const EPS = 1 << 4;
const PEN = 1 << 3;
const STOP = 1 << 2;
}
}
impl Lcr {
pub const DLS_5: Self = Self(0b00);
pub const DLS_6: Self = Self(0b01);
pub const DLS_7: Self = Self(0b10);
pub const DLS_8: Self = Self(0b11);
}
#[derive(Copy, Clone, Debug, Eq, FromBytes, Immutable, IntoBytes, KnownLayout, PartialEq)]
#[repr(transparent)]
pub struct Mcr(u32);
bitflags! {
impl Mcr: u32 {
const SIRE = 1 << 6;
const AFCE = 1 << 5;
const LB = 1 << 4;
const OUT2 = 1 << 3;
const OUT1 = 1 << 2;
const RTS = 1 << 1;
const DTR = 1 << 0;
}
}
#[derive(Copy, Clone, Debug, Eq, FromBytes, Immutable, IntoBytes, KnownLayout, PartialEq)]
#[repr(transparent)]
pub struct Lsr(u32);
bitflags! {
impl Lsr: u32 {
const RFE = 1 << 7;
const TEMT = 1 << 6;
const THRE = 1 << 5;
const BI = 1 << 4;
const FE = 1 << 3;
const PE = 1 << 2;
const OE = 1 << 1;
const DR = 1 << 0;
}
}
#[derive(Copy, Clone, Debug, Eq, FromBytes, Immutable, IntoBytes, KnownLayout, PartialEq)]
#[repr(transparent)]
pub struct Msr(u32);
bitflags! {
impl Msr: u32 {
const DCD = 1 << 7;
const RI = 1 << 6;
const DSR = 1 << 5;
const CTS = 1 << 4;
const DDCD = 1 << 3;
const TERI = 1 << 2;
const DDSR = 1 << 1;
const DCTS = 1 << 0;
}
}
#[derive(Copy, Clone, Debug, Eq, FromBytes, Immutable, IntoBytes, KnownLayout, PartialEq)]
#[repr(transparent)]
pub struct Usr(u32);
bitflags! {
impl Usr: u32 {
const RFF = 1 << 4;
const RFNE = 1 << 3;
const TFE = 1 << 2;
const TFNF = 1 << 1;
const BUSY = 1 << 0;
}
}
#[derive(Copy, Clone, Debug, Eq, FromBytes, Immutable, IntoBytes, KnownLayout, PartialEq)]
#[repr(transparent)]
pub struct Fcr(u32);
bitflags! {
impl Fcr: u32 {
const DMAM = 1 << 3;
const XFIFOR = 1 << 2;
const RFIFOR = 1 << 1;
const FIFOE = 1 << 0;
}
}
impl Fcr {
pub const RT_1_CHAR: Self = Self(0b00 << 6);
pub const RT_QUARTER_FULL: Self = Self(0b01 << 6);
pub const RT_HALF_FULL: Self = Self(0b10 << 6);
pub const RT_2_LESS: Self = Self(0b11 << 6);
pub const TET_EMPTY: Self = Self(0b00 << 4);
pub const TET_2_CHARS: Self = Self(0b01 << 4);
pub const TET_QUARTER_FULL: Self = Self(0b10 << 4);
pub const TET_HALF_FULL: Self = Self(0b11 << 4);
}
#[derive(Clone, Eq, FromBytes, Immutable, IntoBytes, KnownLayout, PartialEq)]
#[repr(C, align(4))]
pub struct Registers {
pub rbr_thr_dll: ReadWrite<u32>,
pub dlh_ier: ReadPureWrite<u32>,
pub iir_fcr: ReadPureWrite<u32>,
pub lcr: ReadPureWrite<Lcr>,
pub mcr: ReadPureWrite<Mcr>,
pub lsr: ReadOnly<Lsr>,
pub msr: ReadOnly<Msr>,
pub scr: ReadPureWrite<u32>,
pub lpdll: ReadPureWrite<u32>,
pub lpdlh: ReadPureWrite<u32>,
reserved: [u32; 2],
pub srbr_sthr: [ReadWrite<u32>; 16],
pub far: ReadWrite<u32>,
pub tfr: ReadOnly<u32>,
pub rfw: WriteOnly<u32>,
pub usr: ReadPure<Usr>,
pub tfl: ReadPure<u32>,
pub rfl: ReadPure<u32>,
pub srr: WriteOnly<u32>,
pub srts: ReadPureWrite<u32>,
pub sbcr: ReadPureWrite<u32>,
pub sdmam: ReadPureWrite<u32>,
pub sfe: ReadPureWrite<u32>,
pub srt: ReadPureWrite<u32>,
pub stet: ReadPureWrite<u32>,
pub htx: ReadPureWrite<u32>,
pub dmasa: WriteOnly<u32>,
unused_1: [u32; 5],
pub dlf: ReadPureWrite<u32>,
unused_2: [u32; 12],
pub cpr: ReadPure<u32>,
pub ucv: ReadPure<u32>,
pub ctr: ReadPure<u32>,
}