sifive/
watchdog.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Watchdog driver.
6
7use 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    /// Watchdog Configuration Register
14    wdogcfg: ReadWrite<u32, cfg::Register>,
15    _reserved0: [u8; 4],
16    /// Watchdog Counter Register
17    wdogcount: ReadWrite<u32>,
18    _reserved1: [u8; 4],
19    /// Watchdog Scaled Counter Register
20    wdogs: ReadWrite<u32>,
21    _reserved2: [u8; 4],
22    /// Watchdog Feed Register
23    wdogfeed: ReadWrite<u32, feed::Register>,
24    /// Watchdog Key Register
25    wdogkey: WriteOnly<u32, key::Register>,
26    /// Watchdog Compare Register
27    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}