use core::ptr::{read_volatile, write_volatile};
#[derive(Clone, Copy)]
pub enum Peripherals {
TWI,
TIMER2,
TIMER0,
TIMER1,
SPI,
USART0,
ADC,
TIMER5,
TIMER4,
TIMER3,
USART3,
USART2,
USART1,
}
#[repr(C, packed)]
pub struct Power {
pub prr0: u8,
pub prr1: u8,
}
impl Power {
pub unsafe fn new() -> &'static mut Power {
&mut *(0x64 as *mut Power)
}
pub fn disable_clocks(&mut self, mode: Peripherals) {
let mut prr;
match mode {
Peripherals::TWI
| Peripherals::TIMER2
| Peripherals::TIMER0
| Peripherals::TIMER1
| Peripherals::SPI
| Peripherals::USART0
| Peripherals::ADC => {
prr = unsafe { read_volatile(&mut self.prr0) };
}
Peripherals::TIMER5
| Peripherals::TIMER4
| Peripherals::TIMER3
| Peripherals::USART3
| Peripherals::USART2
| Peripherals::USART1 => {
prr = unsafe { read_volatile(&mut self.prr1) };
}
}
match mode {
Peripherals::TWI => {
prr = prr | 0x80;
}
Peripherals::TIMER2 => {
prr = prr | 0x40;
}
Peripherals::TIMER0 => {
prr = prr | 0x20;
}
Peripherals::TIMER1 => {
prr = prr | 0x08;
}
Peripherals::SPI => {
prr = prr | 0x04;
}
Peripherals::USART0 => {
prr = prr | 0x02;
}
Peripherals::ADC => {
prr = prr | 0x01;
}
Peripherals::TIMER5 => {
prr = prr | 0x20;
}
Peripherals::TIMER4 => {
prr = prr | 0x10;
}
Peripherals::TIMER3 => {
prr = prr | 0x08;
}
Peripherals::USART3 => {
prr = prr | 0x04;
}
Peripherals::USART2 => {
prr = prr | 0x02;
}
Peripherals::USART1 => {
prr = prr | 0x01;
}
}
match mode {
Peripherals::TWI
| Peripherals::TIMER2
| Peripherals::TIMER0
| Peripherals::TIMER1
| Peripherals::SPI
| Peripherals::USART0
| Peripherals::ADC => unsafe {
write_volatile(&mut self.prr0, prr);
},
Peripherals::TIMER5
| Peripherals::TIMER4
| Peripherals::TIMER3
| Peripherals::USART3
| Peripherals::USART2
| Peripherals::USART1 => unsafe {
write_volatile(&mut self.prr1, prr);
},
}
}
pub fn enable_clocks(&mut self, mode: Peripherals) {
let mut prr;
match mode {
Peripherals::TWI
| Peripherals::TIMER2
| Peripherals::TIMER0
| Peripherals::TIMER1
| Peripherals::SPI
| Peripherals::USART0
| Peripherals::ADC => {
prr = unsafe { read_volatile(&mut self.prr0) };
}
Peripherals::TIMER5
| Peripherals::TIMER4
| Peripherals::TIMER3
| Peripherals::USART3
| Peripherals::USART2
| Peripherals::USART1 => {
prr = unsafe { read_volatile(&mut self.prr1) };
}
}
match mode {
Peripherals::TWI => {
prr = prr & 0x7F;
}
Peripherals::TIMER2 => {
prr = prr & 0xBF;
}
Peripherals::TIMER0 => {
prr = prr & 0xDF;
}
Peripherals::TIMER1 => {
prr = prr & 0xF7;
}
Peripherals::SPI => {
prr = prr & 0xFB;
}
Peripherals::USART0 => {
prr = prr & 0xFD;
}
Peripherals::ADC => {
prr = prr & 0xFE;
}
Peripherals::TIMER5 => {
prr = prr & 0xDF;
}
Peripherals::TIMER4 => {
prr = prr & 0xEF;
}
Peripherals::TIMER3 => {
prr = prr & 0xF7;
}
Peripherals::USART3 => {
prr = prr & 0xFB;
}
Peripherals::USART2 => {
prr = prr & 0xFD;
}
Peripherals::USART1 => {
prr = prr & 0xFE;
}
}
match mode {
Peripherals::TWI
| Peripherals::TIMER2
| Peripherals::TIMER0
| Peripherals::TIMER1
| Peripherals::SPI
| Peripherals::USART0
| Peripherals::ADC => unsafe {
write_volatile(&mut self.prr0, prr);
},
Peripherals::TIMER5
| Peripherals::TIMER4
| Peripherals::TIMER3
| Peripherals::USART3
| Peripherals::USART2
| Peripherals::USART1 => unsafe {
write_volatile(&mut self.prr1, prr);
},
}
}
}