use crate::atmega2560p::hal::interrupts;
use core::ptr::{read_volatile, write_volatile};
#[repr(C, packed)]
pub struct WatchDog {
pub mcusr: u8,
_pad: [u8; 11],
pub wdtcsr: u8,
}
impl WatchDog {
pub unsafe fn new() -> &'static mut WatchDog {
&mut *(0x54 as *mut WatchDog)
}
pub fn disable(&mut self) {
unsafe {
interrupts::Interrupt::disable(&mut interrupts::Interrupt::new());
}
let mut mcusr = unsafe { read_volatile(&self.mcusr) };
mcusr &= !(1 << 3);
unsafe {
write_volatile(&mut self.mcusr, mcusr);
}
let mut wdtcsr = unsafe { read_volatile(&self.wdtcsr) };
wdtcsr |= (1 << 4) | (1 << 3);
unsafe {
write_volatile(&mut self.wdtcsr, wdtcsr);
write_volatile(&mut self.wdtcsr, 0x00);
interrupts::Interrupt::enable(&mut interrupts::Interrupt::new());
}
}
}