1use crate::peripherals::Rtc;
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub enum RtcMode {
16 FreeRunning,
18 Periodic,
20}
21
22pub struct RtcDriver<'d> {
24 _rtc: Rtc<'d>,
25}
26
27pub const RTC_CLOCK_HZ: u32 = 32_768;
29
30impl<'d> RtcDriver<'d> {
31 pub fn new(rtc: Rtc<'d>) -> Self {
33 Self { _rtc: rtc }
34 }
35
36 fn regs(&self) -> &'static ws63_pac::rtc::RegisterBlock {
37 unsafe { &*Rtc::ptr() }
39 }
40
41 pub fn configure(&mut self, mode: RtcMode, load_value: u32) {
48 unsafe {
49 self.regs().rtc_load_count().write(|w| w.bits(load_value));
50 }
51
52 let mut ctrl: u32 = 0;
53 ctrl |= 0x01; if matches!(mode, RtcMode::Periodic) {
55 ctrl |= 1 << 1; }
57 ctrl |= 1 << 2; unsafe {
60 self.regs().rtc_control().write(|w| w.bits(ctrl));
61 }
62 }
63
64 pub fn enable(&mut self) {
66 let ctrl = self.regs().rtc_control().read().bits();
67 unsafe {
68 self.regs().rtc_control().write(|w| w.bits(ctrl | 0x01));
69 }
70 }
71
72 pub fn disable(&mut self) {
74 let ctrl = self.regs().rtc_control().read().bits();
75 unsafe {
76 self.regs().rtc_control().write(|w| w.bits(ctrl & !0x01));
77 }
78 }
79
80 pub fn set_load(&mut self, load_value: u32) {
82 unsafe {
83 self.regs().rtc_load_count().write(|w| w.bits(load_value));
84 }
85 }
86
87 pub fn current_value(&self) -> u32 {
89 self.regs().rtc_current_value().read().bits()
90 }
91
92 pub fn enable_interrupt(&mut self) {
94 let ctrl = self.regs().rtc_control().read().bits();
95 unsafe {
96 self.regs().rtc_control().write(|w| w.bits(ctrl & !(1 << 2)));
97 }
98 }
99
100 pub fn disable_interrupt(&mut self) {
102 let ctrl = self.regs().rtc_control().read().bits();
103 unsafe {
104 self.regs().rtc_control().write(|w| w.bits(ctrl | (1 << 2)));
105 }
106 }
107
108 pub fn interrupt_pending(&self) -> bool {
110 self.regs().rtc_int_status().read().bits() & 0x01 != 0
111 }
112
113 pub fn clear_interrupt(&self) {
115 let _ = self.regs().rtc_eoi().read().bits();
116 }
117}