1use kernel::utilities::registers::interfaces::Writeable;
8use kernel::utilities::registers::{register_bitfields, ReadWrite, WriteOnly};
9use kernel::utilities::StaticRef;
10
11#[repr(C)]
12pub struct WatchdogRegisters {
13 wdogcfg: ReadWrite<u32, cfg::Register>,
15 _reserved0: [u8; 4],
16 wdogcount: ReadWrite<u32>,
18 _reserved1: [u8; 4],
19 wdogs: ReadWrite<u32>,
21 _reserved2: [u8; 4],
22 wdogfeed: ReadWrite<u32, feed::Register>,
24 wdogkey: WriteOnly<u32, key::Register>,
26 wdogcmp: ReadWrite<u32>,
28}
29
30register_bitfields![u32,
31 cfg [
32 cmpip OFFSET(28) NUMBITS(1) [],
33 encoreawake OFFSET(13) NUMBITS(1) [],
34 enalways OFFSET(12) NUMBITS(1) [],
35 zerocmp OFFSET(9) NUMBITS(1) [],
36 rsten OFFSET(8) NUMBITS(1) [],
37 scale OFFSET(0) NUMBITS(4) []
38 ],
39 key [
40 key OFFSET(0) NUMBITS(32) []
41 ],
42 feed [
43 feed OFFSET(0) NUMBITS(32) []
44 ]
45];
46
47pub struct Watchdog {
48 registers: StaticRef<WatchdogRegisters>,
49}
50
51impl Watchdog {
52 pub const fn new(base: StaticRef<WatchdogRegisters>) -> Watchdog {
53 Watchdog { registers: base }
54 }
55
56 fn unlock(&self) {
57 self.registers.wdogkey.write(key::key.val(0x51F15E));
58 }
59
60 fn feed(&self) {
61 self.unlock();
62 self.registers.wdogfeed.write(feed::feed.val(0xD09F00D));
63 }
64
65 pub fn disable(&self) {
66 self.unlock();
67 self.registers.wdogcfg.write(
68 cfg::scale.val(0)
69 + cfg::rsten::CLEAR
70 + cfg::zerocmp::CLEAR
71 + cfg::enalways::CLEAR
72 + cfg::encoreawake::CLEAR,
73 );
74 self.feed();
75 }
76}