@@ -37,6 +37,49 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
3737 block_sizes : & [ 6 , 6 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 ] ,
3838} ;
3939
40+ pub struct CpuSaveState {
41+ saved_cpu_per_conf_reg : u32 ,
42+ saved_sysclk_conf_reg : u32 ,
43+ }
44+
45+ impl CpuSaveState {
46+ const SYSTEM_CPU_PER_CONF_REG : * mut u32 = 0x600C0008 as * mut u32 ;
47+ const SYSTEM_CPUPERIOD_SEL_M : u32 = 3 ;
48+ const SYSTEM_CPUPERIOD_MAX : u32 = 1 ;
49+
50+ const SYSTEM_SYSCLK_CONF_REG : * mut u32 = 0x600C0058 as * mut u32 ;
51+ const SYSTEM_SOC_CLK_SEL_M : u32 = 3 << 10 ;
52+ const SYSTEM_SOC_CLK_MAX : u32 = 1 << 10 ;
53+
54+ pub const fn new ( ) -> Self {
55+ CpuSaveState {
56+ saved_cpu_per_conf_reg : 0 ,
57+ saved_sysclk_conf_reg : 0 ,
58+ }
59+ }
60+
61+ pub fn set_max_cpu_clock ( & mut self ) {
62+ self . saved_cpu_per_conf_reg = unsafe { Self :: SYSTEM_CPU_PER_CONF_REG . read_volatile ( ) } ;
63+ self . saved_sysclk_conf_reg = unsafe { Self :: SYSTEM_SYSCLK_CONF_REG . read_volatile ( ) } ;
64+
65+ unsafe {
66+ Self :: SYSTEM_CPU_PER_CONF_REG . write_volatile (
67+ ( self . saved_cpu_per_conf_reg & !Self :: SYSTEM_CPUPERIOD_SEL_M )
68+ | Self :: SYSTEM_CPUPERIOD_MAX ,
69+ ) ;
70+ Self :: SYSTEM_SYSCLK_CONF_REG . write_volatile (
71+ ( self . saved_sysclk_conf_reg & !Self :: SYSTEM_SOC_CLK_SEL_M )
72+ | Self :: SYSTEM_SOC_CLK_MAX ,
73+ ) ;
74+ }
75+ }
76+
77+ pub fn restore ( & self ) {
78+ unsafe { Self :: SYSTEM_SYSCLK_CONF_REG . write_volatile ( self . saved_sysclk_conf_reg ) } ;
79+ unsafe { Self :: SYSTEM_CPU_PER_CONF_REG . write_volatile ( self . saved_cpu_per_conf_reg ) } ;
80+ }
81+ }
82+
4083pub fn major_chip_version ( ) -> u8 {
4184 read_field :: < 1 , 184 , 2 > ( )
4285}
0 commit comments