#[derive(Clone, Copy)]
pub enum Peripherals {
TWI,
Timer2,
Timer0,
Timer1,
SPI, USART0,
ADC,
}
#[repr(C, packed)]
pub struct Power {
pub prr: u8,
}
impl Power {
pub fn new() -> &'static mut Self {
unsafe { &mut *(0x64 as *mut Self) }
}
pub fn twi(&mut self) {
unsafe {
let mut ctrl_twi = core::ptr::read_volatile(&mut self.prr);
ctrl_twi |= 0x80;
core::ptr::write_volatile(&mut self.prr, ctrl_twi);
}
}
pub fn timer2(&mut self) {
unsafe {
let mut ctrl_timer2 = core::ptr::read_volatile(&mut self.prr);
ctrl_timer2 |= 0x40;
core::ptr::write_volatile(&mut self.prr, ctrl_timer2);
}
}
pub fn timer0(&mut self) {
unsafe {
let mut ctrl_timer0 = core::ptr::read_volatile(&mut self.prr);
ctrl_timer0 |= 0x20;
core::ptr::write_volatile(&mut self.prr, ctrl_timer0);
}
}
pub fn timer1(&mut self) {
unsafe {
let mut ctrl_timer1 = core::ptr::read_volatile(&mut self.prr);
ctrl_timer1 |= 0x8;
core::ptr::write_volatile(&mut self.prr, ctrl_timer1);
}
}
pub fn spi(&mut self) {
unsafe {
let mut ctrl_spi = core::ptr::read_volatile(&mut self.prr);
ctrl_spi |= 0x4;
core::ptr::write_volatile(&mut self.prr, ctrl_spi);
}
}
pub fn usart0(&mut self) {
unsafe {
let mut ctrl_usart0 = core::ptr::read_volatile(&mut self.prr);
ctrl_usart0 |= 0x2;
core::ptr::write_volatile(&mut self.prr, ctrl_usart0);
}
}
pub fn adc(&mut self) {
unsafe {
let mut ctrl_adc = core::ptr::read_volatile(&mut self.prr);
ctrl_adc |= 0x1;
core::ptr::write_volatile(&mut self.prr, ctrl_adc);
}
}
pub fn disable_clock(mode: Peripherals) {
match mode {
Peripherals::TWI => Power::twi(&mut Power::new()),
Peripherals::Timer2 => Power::timer2(&mut Power::new()),
Peripherals::Timer0 => Power::timer0(&mut Power::new()),
Peripherals::Timer1 => Power::timer1(&mut Power::new()),
Peripherals::SPI => Power::spi(&mut Power::new()),
Peripherals::USART0 => Power::usart0(&mut Power::new()),
Peripherals::ADC => Power::adc(&mut Power::new()),
}
}
}