use core::ops::{Deref, DerefMut};
use proc_bitfield::bitfield;
use crate::{RW, WO};
pub struct AudioInterface {
r: &'static mut RegisterBlock,
}
#[repr(C)]
pub struct RegisterBlock {
pub dram_addr: WO<u32>,
pub length: RW<u32>,
pub control: WO<u32>,
pub status: RW<StatusReg>,
pub dac_rate: WO<u32>,
pub bit_rate: WO<u32>,
}
impl AudioInterface {
#[inline(always)]
pub unsafe fn new() -> Self { Self {
r: &mut *(0xA4500000 as *mut RegisterBlock)
}}
}
impl Deref for AudioInterface {
type Target = RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
self.r
}
}
impl DerefMut for AudioInterface {
fn deref_mut(&mut self) -> &mut Self::Target {
self.r
}
}
regfn_wo!(AudioInterface, dram_addr, DRAM_ADDR, u32);
regfn_rw!(AudioInterface, length, LENGTH, u32);
regfn_wo!(AudioInterface, control, CONTROL, u32);
regfn_rw!(AudioInterface, status, STATUS, StatusReg);
regfn_wo!(AudioInterface, dac_rate, DAC_RATE, u32);
regfn_wo!(AudioInterface, bit_rate, BIT_RATE, u32);
bitfield! {
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct StatusReg(pub u32): Debug {
pub clear_interrupt: u32 [wo] @ ..,
pub full: bool [ro] @ 0, pub dac_cntr: u16 [ro] @ 1..=14,
pub bitclock_state: bool [ro] @ 16,
pub abus_word_2: bool [ro] @ 19,
pub word_select: bool [ro] @ 21,
pub data_available: bool [ro] @ 22,
pub dfifo2_loaded: bool [ro] @ 23,
pub dma_enable: bool [ro] @ 25,
pub dma_request: bool [ro] @ 26,
pub dma_busy: bool [ro] @ 27,
pub busy: bool [ro] @ 30,
}
}