use core::mem::offset_of;
use crate::hwcore::addr::MmioAddr;
use crate::hwcore::regs::access::{Ro, Rw};
#[repr(C)]
pub struct DsiRegs {
pub vr: Ro<u32>,
pub cr: Rw<u32>,
pub ccr: Rw<u32>,
pub lvcidr: Rw<u32>,
pub lcolcr: Rw<u32>,
pub lpcr: Rw<u32>,
pub lpmcr: Rw<u32>,
_reserved_01c: [u32; 4],
pub pcr: Rw<u32>,
pub gvcidr: Rw<u32>,
pub mcr: Rw<u32>,
pub vmcr: Rw<u32>,
pub vpcr: Rw<u32>,
pub vccr: Rw<u32>,
pub vnpcr: Rw<u32>,
pub vhsacr: Rw<u32>,
pub vhbpcr: Rw<u32>,
pub vlcr: Rw<u32>,
pub vvsacr: Rw<u32>,
pub vvbpcr: Rw<u32>,
pub vvfpcr: Rw<u32>,
pub vvacr: Rw<u32>,
pub lccr: Rw<u32>,
pub cmcr: Rw<u32>,
pub ghcr: Rw<u32>,
_reserved_070: u32,
pub gpsr: Ro<u32>,
pub tccr0: Rw<u32>,
_reserved_07c: [u32; 6],
pub clcr: Rw<u32>,
pub cltcr: Rw<u32>,
pub dltcr: Rw<u32>,
pub pctlr: Rw<u32>,
pub pconfr: Rw<u32>,
_reserved_0a8: [u32; 2],
pub psr: Ro<u32>,
_reserved_0b4: [u32; 2],
pub isr0: Ro<u32>,
pub isr1: Ro<u32>,
_reserved_0c4: [u32; 2],
pub ier0: Rw<u32>,
pub ier1: Rw<u32>,
_reserved_0d4: u32,
pub fir0: Rw<u32>,
pub fir1: Rw<u32>,
}
const _: () = assert!(offset_of!(DsiRegs, vr) == 0x000);
const _: () = assert!(offset_of!(DsiRegs, cr) == 0x004);
const _: () = assert!(offset_of!(DsiRegs, ccr) == 0x008);
const _: () = assert!(offset_of!(DsiRegs, lvcidr) == 0x00C);
const _: () = assert!(offset_of!(DsiRegs, lcolcr) == 0x010);
const _: () = assert!(offset_of!(DsiRegs, lpcr) == 0x014);
const _: () = assert!(offset_of!(DsiRegs, lpmcr) == 0x018);
const _: () = assert!(offset_of!(DsiRegs, pcr) == 0x02C);
const _: () = assert!(offset_of!(DsiRegs, gvcidr) == 0x030);
const _: () = assert!(offset_of!(DsiRegs, mcr) == 0x034);
const _: () = assert!(offset_of!(DsiRegs, vmcr) == 0x038);
const _: () = assert!(offset_of!(DsiRegs, vpcr) == 0x03C);
const _: () = assert!(offset_of!(DsiRegs, vccr) == 0x040);
const _: () = assert!(offset_of!(DsiRegs, vnpcr) == 0x044);
const _: () = assert!(offset_of!(DsiRegs, vhsacr) == 0x048);
const _: () = assert!(offset_of!(DsiRegs, vhbpcr) == 0x04C);
const _: () = assert!(offset_of!(DsiRegs, vlcr) == 0x050);
const _: () = assert!(offset_of!(DsiRegs, vvsacr) == 0x054);
const _: () = assert!(offset_of!(DsiRegs, vvbpcr) == 0x058);
const _: () = assert!(offset_of!(DsiRegs, vvfpcr) == 0x05C);
const _: () = assert!(offset_of!(DsiRegs, vvacr) == 0x060);
pub const LCCR_OFFSET_IS_0X64: () = assert!(offset_of!(DsiRegs, lccr) == 0x064);
const _: () = assert!(offset_of!(DsiRegs, cmcr) == 0x068);
const _: () = assert!(offset_of!(DsiRegs, ghcr) == 0x06C);
const _: () = assert!(offset_of!(DsiRegs, gpsr) == 0x074);
const _: () = assert!(offset_of!(DsiRegs, tccr0) == 0x078);
const _: () = assert!(offset_of!(DsiRegs, clcr) == 0x094);
const _: () = assert!(offset_of!(DsiRegs, cltcr) == 0x098);
const _: () = assert!(offset_of!(DsiRegs, dltcr) == 0x09C);
const _: () = assert!(offset_of!(DsiRegs, pctlr) == 0x0A0);
const _: () = assert!(offset_of!(DsiRegs, pconfr) == 0x0A4);
const _: () = assert!(offset_of!(DsiRegs, psr) == 0x0B0);
const _: () = assert!(offset_of!(DsiRegs, isr0) == 0x0BC);
const _: () = assert!(offset_of!(DsiRegs, isr1) == 0x0C0);
const _: () = assert!(offset_of!(DsiRegs, ier0) == 0x0CC);
const _: () = assert!(offset_of!(DsiRegs, ier1) == 0x0D0);
const _: () = assert!(offset_of!(DsiRegs, fir0) == 0x0D8);
const _: () = assert!(offset_of!(DsiRegs, fir1) == 0x0DC);
#[repr(C)]
pub struct DsiWrapperRegs {
pub wcfgr: Rw<u32>,
pub wcr: Rw<u32>,
pub wier: Rw<u32>,
pub wisr: Ro<u32>,
pub wifcr: Rw<u32>,
_reserved_014: u32,
pub wpcr0: Rw<u32>,
_reserved_01c: [u32; 5],
pub wrpcr: Rw<u32>,
}
const _: () = assert!(offset_of!(DsiWrapperRegs, wcfgr) == 0x000);
const _: () = assert!(offset_of!(DsiWrapperRegs, wcr) == 0x004);
const _: () = assert!(offset_of!(DsiWrapperRegs, wier) == 0x008);
const _: () = assert!(offset_of!(DsiWrapperRegs, wisr) == 0x00C);
const _: () = assert!(offset_of!(DsiWrapperRegs, wifcr) == 0x010);
const _: () = assert!(offset_of!(DsiWrapperRegs, wpcr0) == 0x018);
const _: () = assert!(offset_of!(DsiWrapperRegs, wrpcr) == 0x030);
pub const DSI_HOST_BASE: usize = 0x5000_0000;
pub const DSI_WRAPPER_BASE: usize = 0x5000_0400;
pub struct Dsi {
base: MmioAddr<DsiRegs>,
}
impl Dsi {
pub const unsafe fn new() -> Self {
Self {
base: unsafe { MmioAddr::new(DSI_HOST_BASE) },
}
}
#[inline]
pub fn regs(&self) -> &DsiRegs {
unsafe { &*self.base.as_ptr() }
}
}
pub struct DsiWrapper {
base: MmioAddr<DsiWrapperRegs>,
}
impl DsiWrapper {
pub const unsafe fn new() -> Self {
Self {
base: unsafe { MmioAddr::new(DSI_WRAPPER_BASE) },
}
}
#[inline]
pub fn regs(&self) -> &DsiWrapperRegs {
unsafe { &*self.base.as_ptr() }
}
}
#[cfg(test)]
mod tests {
use super::*;
use core::mem::size_of;
#[test]
fn host_block_is_at_least_psr_offset_plus_one_word() {
assert!(size_of::<DsiRegs>() >= 0x0B4);
}
#[test]
fn wrapper_block_is_at_least_wrpcr_offset_plus_one_word() {
assert!(size_of::<DsiWrapperRegs>() >= 0x034);
}
#[test]
fn lccr_offset_const_evaluates() {
let _: () = LCCR_OFFSET_IS_0X64;
}
}