esp32_c3/
sysreg.rs
1use kernel::utilities::registers::interfaces::{ReadWriteable, Readable};
8use kernel::utilities::registers::{register_bitfields, register_structs, ReadWrite};
9use kernel::utilities::StaticRef;
10
11pub const SYS_REG_BASE: StaticRef<SysRegRegisters> =
12 unsafe { StaticRef::new(0x600C_0000 as *const SysRegRegisters) };
13
14register_structs! {
15 pub SysRegRegisters {
16 (0x000 => _reserved0),
17 (0x008 => cpu_per_conf: ReadWrite<u32, CPU_PER_CONF::Register>),
18 (0x00c => _reserved1),
19 (0x010 => perip_clk_en0: ReadWrite<u32, PERIP_CLK_EN0::Register>),
20 (0x014 => _reserved3),
21 (0x058 => sysclk_config: ReadWrite<u32, SYSCLK_CONFIG::Register>),
22 (0x05C => _reserved_unimplemented_yet),
23 (0x1000 => @END),
24 }
25}
26
27register_bitfields![u32,
28 PERIP_CLK_EN0 [
29 TIMERGROUP0 OFFSET(13) NUMBITS(1) []
30 ],
31 CPU_PER_CONF [
32 CPUPERIOD_SEL OFFSET(0) NUMBITS(2) [
33 MHz80 = 0,
34 MHz160 = 1,
35 ],
36 PLL_FREQ_SEL OFFSET(2) NUMBITS(1) [
37 MHz320 = 0,
38 MHz480 = 1
39 ],
40 CPU_WAIT_MODE_FORCE_ON OFFSET(3) NUMBITS(1) [],
41 CPU_WAIT_DELAY_NUM OFFSET(4) NUMBITS(4) [],
42 ],
43 SYSCLK_CONFIG [
44 PRE_DIV_CNT OFFSET(0) NUMBITS(10) [],
45 SOC_CLK_SEL OFFSET(10) NUMBITS(2) [
46 Xtal = 0,
47 Pll = 1,
48 Fosc = 2
49 ],
50 CLK_XTAL_FREQ OFFSET(12) NUMBITS(6) [],
51 ]
52];
53
54#[repr(u32)]
55pub enum PllFrequency {
56 MHz320 = 0,
57 MHz480 = 1,
58}
59
60#[repr(u32)]
61pub enum CpuFrequency {
62 MHz80 = 0,
63 MHz160 = 1,
64}
65
66pub struct SysReg {
67 registers: StaticRef<SysRegRegisters>,
68}
69
70impl SysReg {
71 pub const fn new() -> Self {
72 SysReg {
73 registers: SYS_REG_BASE,
74 }
75 }
76
77 pub fn use_xtal_clock_source(&self) {
78 self.registers
79 .sysclk_config
80 .modify(SYSCLK_CONFIG::SOC_CLK_SEL::Xtal);
81 }
82
83 pub fn use_pll_clock_source(&self, pll_frequency: PllFrequency, cpu_frequency: CpuFrequency) {
84 self.registers
85 .sysclk_config
86 .modify(SYSCLK_CONFIG::SOC_CLK_SEL::Pll);
87 self.registers.cpu_per_conf.modify(
88 CPU_PER_CONF::PLL_FREQ_SEL.val(pll_frequency as u32)
89 + CPU_PER_CONF::CPUPERIOD_SEL.val(cpu_frequency as u32),
90 );
91 }
92
93 pub fn enable_timg0(&self) {
94 self.registers
95 .perip_clk_en0
96 .modify(PERIP_CLK_EN0::TIMERGROUP0::SET);
97 }
98
99 pub fn disable_timg0(&self) {
100 self.registers
101 .perip_clk_en0
102 .modify(PERIP_CLK_EN0::TIMERGROUP0::CLEAR);
103 }
104
105 pub fn is_enabled_timg0(&self) -> bool {
106 self.registers
107 .perip_clk_en0
108 .is_set(PERIP_CLK_EN0::TIMERGROUP0)
109 }
110}