use core::ops::Deref;
use proc_bitfield::bitfield;
use crate::RW;
pub struct SerialInterface {
r: &'static mut RegisterBlock,
}
#[repr(C)]
pub struct RegisterBlock {
pub dram_addr: RW<u32>,
pub pif_ad_rd64b: RW<u32>,
pub pif_ad_wr4b: RW<u32>,
_spacer: u32,
pub pif_ad_wr64b: RW<u32>,
pub pif_ad_rd4b: RW<u32>,
pub status: RW<StatusReg>,
}
impl SerialInterface {
#[inline(always)]
pub unsafe fn new() -> Self { Self {
r: &mut *(0xA4800000 as *mut RegisterBlock)
}}
}
impl Deref for SerialInterface {
type Target = RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
self.r
}
}
regfn_rw!(SerialInterface, dram_addr, DRAM_ADDR, u32);
regfn_rw!(SerialInterface, pif_ad_rd64b, PIF_AD_RD64B, u32);
regfn_rw!(SerialInterface, pif_ad_wr4b, PIF_AD_WR4B, u32);
regfn_rw!(SerialInterface, pif_ad_wr64b, PIF_AD_WR64B, u32);
regfn_rw!(SerialInterface, pif_ad_rd4b, PIF_AD_RD4B, u32);
regfn_rw!(SerialInterface, status, STATUS, StatusReg);
bitfield! {
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct StatusReg(pub u32): Debug {
pub whole_register: u32 [wo] @ ..,
pub dma_busy: bool [ro] @ 0,
pub io_busy: bool [ro] @ 1,
pub read_pending: bool [ro] @ 2,
pub dma_error: bool [ro] @ 3,
pub pch_state: u8 [ro] @ 4..=7,
pub dma_state: u8 [ro] @ 8..=11,
pub interrupt: bool @ 12,
}
}