use core::ptr::NonNull;
use tock_registers::register_bitfields;
register_bitfields! [
u32,
PMU_PWR_CON0 [
POWERMODE0_EN OFFSET(0) NUMBITS(1),
PMU1_PWR_BYPASS OFFSET(1) NUMBITS(1),
PMU1_BUS_BYPASS OFFSET(2) NUMBITS(1),
WAKEUP_BYPASS OFFSET(3) NUMBITS(1),
PMIC_BYPASS OFFSET(4) NUMBITS(1),
RESET_BYPASS OFFSET(5) NUMBITS(1),
FREQ_SWITCH_BYPASS OFFSET(6) NUMBITS(1),
OSC_DIS_BYPASS OFFSET(7) NUMBITS(1),
PMU1_PWR_GATE_ENA OFFSET(8) NUMBITS(1),
PMU1_PWR_GATE_SFTENA OFFSET(9) NUMBITS(1),
PMU1_MEM_PWR_GATE_SFTENA OFFSET(10) NUMBITS(1),
PMU1_BUS_IDLE_ENA OFFSET(11) NUMBITS(1),
PMU1_BUS_IDLE_SFTENA OFFSET(12) NUMBITS(1),
BIU_AUTO_PMU1 OFFSET(13) NUMBITS(1),
POWER_OFF_IO_ENA OFFSET(14) NUMBITS(1),
RESERVED15 OFFSET(15) NUMBITS(1),
WRITE_ENABLE OFFSET(16) NUMBITS(16)
],
];
#[derive(Clone, Copy)]
pub struct PmuRegs {
base_addr: NonNull<u8>,
}
unsafe impl Send for PmuRegs {}
impl PmuRegs {
pub const fn new(base_addr: NonNull<u8>) -> Self {
Self { base_addr }
}
pub fn read_u32(&self, offset: usize) -> u32 {
unsafe { core::ptr::read_volatile(self.base_addr.as_ptr().add(offset) as *const u32) }
}
pub fn write_u32(&self, offset: usize, value: u32) {
unsafe {
core::ptr::write_volatile(self.base_addr.as_ptr().add(offset) as *mut u32, value);
}
}
}