Skip to content

Commit 640873f

Browse files
committed
Split CPU speed config to per-chip files
1 parent 170c33f commit 640873f

File tree

14 files changed

+334
-155
lines changed

14 files changed

+334
-155
lines changed

Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ esp32c61 = []
2424
esp32h2 = []
2525
esp32p4 = []
2626

27-
# use max CPU frequency
28-
max-cpu-frequency = []
29-
3027
[profile.release]
3128
codegen-units = 1
3229
debug = true

build.ps1

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ param(
55

66
function Show-Usage {
77
Write-Host "Usage:"
8-
Write-Host " .\build.ps1 # build all devices"
9-
Write-Host " .\build.ps1 -Device esp32 # build single device"
10-
Write-Host " .\build.ps1 -Features log,max-cpu-frequency # build with specified features"
8+
Write-Host " .\build.ps1 # build all devices"
9+
Write-Host " .\build.ps1 -Device esp32 # build single device"
10+
Write-Host " .\build.ps1 -Features log # build with specified features"
1111
Write-Host ""
1212
Write-Host "Notes:"
1313
Write-Host " - The -Features parameter accepts multiple values or a comma-separated string."

src/chip/esp32.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,49 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
2121
block_sizes: &[7 + 7, 8, 8, 8],
2222
};
2323

24+
pub struct CpuSaveState {
25+
saved_cpu_per_conf_reg: u32,
26+
saved_sysclk_conf_reg: u32,
27+
}
28+
29+
impl CpuSaveState {
30+
const SYSTEM_CPU_PER_CONF_REG: *mut u32 = 0x3FF0003C as *mut u32;
31+
const SYSTEM_CPUPERIOD_SEL_M: u32 = 3;
32+
const SYSTEM_CPUPERIOD_MAX: u32 = 2;
33+
34+
const SYSTEM_SYSCLK_CONF_REG: *mut u32 = 0x3FF48070 as *mut u32;
35+
const SYSTEM_SOC_CLK_SEL_M: u32 = 3 << 27;
36+
const SYSTEM_SOC_CLK_MAX: u32 = 1 << 27;
37+
38+
pub const fn new() -> Self {
39+
CpuSaveState {
40+
saved_cpu_per_conf_reg: 0,
41+
saved_sysclk_conf_reg: 0,
42+
}
43+
}
44+
45+
pub fn set_max_cpu_clock(&mut self) {
46+
self.saved_cpu_per_conf_reg = unsafe { Self::SYSTEM_CPU_PER_CONF_REG.read_volatile() };
47+
self.saved_sysclk_conf_reg = unsafe { Self::SYSTEM_SYSCLK_CONF_REG.read_volatile() };
48+
49+
unsafe {
50+
Self::SYSTEM_CPU_PER_CONF_REG.write_volatile(
51+
(self.saved_cpu_per_conf_reg & !Self::SYSTEM_CPUPERIOD_SEL_M)
52+
| Self::SYSTEM_CPUPERIOD_MAX,
53+
);
54+
Self::SYSTEM_SYSCLK_CONF_REG.write_volatile(
55+
(self.saved_sysclk_conf_reg & !Self::SYSTEM_SOC_CLK_SEL_M)
56+
| Self::SYSTEM_SOC_CLK_MAX,
57+
);
58+
}
59+
}
60+
61+
pub fn restore(&self) {
62+
unsafe { Self::SYSTEM_SYSCLK_CONF_REG.write_volatile(self.saved_sysclk_conf_reg) };
63+
unsafe { Self::SYSTEM_CPU_PER_CONF_REG.write_volatile(self.saved_cpu_per_conf_reg) };
64+
}
65+
}
66+
2467
pub fn major_chip_version() -> u8 {
2568
let eco_bit0 = read_field::<0, 111, 1>() as u32;
2669
let eco_bit1 = read_field::<0, 180, 1>() as u32;

src/chip/esp32c2.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,49 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
3030
block_sizes: &[8, 12, 32, 32],
3131
};
3232

33+
pub struct CpuSaveState {
34+
saved_cpu_per_conf_reg: u32,
35+
saved_sysclk_conf_reg: u32,
36+
}
37+
38+
impl CpuSaveState {
39+
const SYSTEM_CPU_PER_CONF_REG: *mut u32 = 0x600C0008 as *mut u32;
40+
const SYSTEM_CPUPERIOD_SEL_M: u32 = 3;
41+
const SYSTEM_CPUPERIOD_MAX: u32 = 1;
42+
43+
const SYSTEM_SYSCLK_CONF_REG: *mut u32 = 0x600C0058 as *mut u32;
44+
const SYSTEM_SOC_CLK_SEL_M: u32 = 3 << 10;
45+
const SYSTEM_SOC_CLK_MAX: u32 = 1 << 10;
46+
47+
pub const fn new() -> Self {
48+
CpuSaveState {
49+
saved_cpu_per_conf_reg: 0,
50+
saved_sysclk_conf_reg: 0,
51+
}
52+
}
53+
54+
pub fn set_max_cpu_clock(&mut self) {
55+
self.saved_cpu_per_conf_reg = unsafe { Self::SYSTEM_CPU_PER_CONF_REG.read_volatile() };
56+
self.saved_sysclk_conf_reg = unsafe { Self::SYSTEM_SYSCLK_CONF_REG.read_volatile() };
57+
58+
unsafe {
59+
Self::SYSTEM_CPU_PER_CONF_REG.write_volatile(
60+
(self.saved_cpu_per_conf_reg & !Self::SYSTEM_CPUPERIOD_SEL_M)
61+
| Self::SYSTEM_CPUPERIOD_MAX,
62+
);
63+
Self::SYSTEM_SYSCLK_CONF_REG.write_volatile(
64+
(self.saved_sysclk_conf_reg & !Self::SYSTEM_SOC_CLK_SEL_M)
65+
| Self::SYSTEM_SOC_CLK_MAX,
66+
);
67+
}
68+
}
69+
70+
pub fn restore(&self) {
71+
unsafe { Self::SYSTEM_SYSCLK_CONF_REG.write_volatile(self.saved_sysclk_conf_reg) };
72+
unsafe { Self::SYSTEM_CPU_PER_CONF_REG.write_volatile(self.saved_cpu_per_conf_reg) };
73+
}
74+
}
75+
3376
pub fn major_chip_version() -> u8 {
3477
read_field::<2, 52, 2>()
3578
}

src/chip/esp32c3.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
4083
pub fn major_chip_version() -> u8 {
4184
read_field::<1, 184, 2>()
4285
}

src/chip/esp32c5.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,18 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
3030
block_sizes: &[6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8],
3131
};
3232

33+
pub struct CpuSaveState {}
34+
35+
impl CpuSaveState {
36+
pub const fn new() -> Self {
37+
CpuSaveState {}
38+
}
39+
40+
pub fn set_max_cpu_clock(&mut self) {}
41+
42+
pub fn restore(&self) {}
43+
}
44+
3345
pub fn major_chip_version() -> u8 {
3446
read_field::<1, 68, 2>()
3547
}

src/chip/esp32c6.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,37 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
2121
block_sizes: &[6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8],
2222
};
2323

24+
pub struct CpuSaveState {
25+
saved_sysclk_conf_reg: u32,
26+
}
27+
28+
impl CpuSaveState {
29+
const PCR_SYSCLK_CONF_REG: *mut u32 = 0x60096110 as *mut u32;
30+
31+
const PCR_SOC_CLK_SEL_M: u32 = 3 << 16;
32+
const PCR_SOC_CLK_MAX: u32 = 1 << 16;
33+
34+
pub const fn new() -> Self {
35+
CpuSaveState {
36+
saved_sysclk_conf_reg: 0,
37+
}
38+
}
39+
40+
pub fn set_max_cpu_clock(&mut self) {
41+
self.saved_sysclk_conf_reg = unsafe { Self::PCR_SYSCLK_CONF_REG.read_volatile() };
42+
43+
unsafe {
44+
Self::PCR_SYSCLK_CONF_REG.write_volatile(
45+
(self.saved_sysclk_conf_reg & !Self::PCR_SOC_CLK_SEL_M) | Self::PCR_SOC_CLK_MAX,
46+
)
47+
};
48+
}
49+
50+
pub fn restore(&self) {
51+
unsafe { Self::PCR_SYSCLK_CONF_REG.write_volatile(self.saved_sysclk_conf_reg) };
52+
}
53+
}
54+
2455
pub fn major_chip_version() -> u8 {
2556
read_field::<1, 118, 2>()
2657
}

src/chip/esp32c61.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,18 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
3030
block_sizes: &[6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8],
3131
};
3232

33+
pub struct CpuSaveState {}
34+
35+
impl CpuSaveState {
36+
pub const fn new() -> Self {
37+
CpuSaveState {}
38+
}
39+
40+
pub fn set_max_cpu_clock(&mut self) {}
41+
42+
pub fn restore(&self) {}
43+
}
44+
3345
pub fn major_chip_version() -> u8 {
3446
read_field::<1, 68, 2>()
3547
}

src/chip/esp32h2.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,37 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
2121
block_sizes: &[6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8],
2222
};
2323

24+
pub struct CpuSaveState {
25+
saved_sysclk_conf_reg: u32,
26+
}
27+
28+
impl CpuSaveState {
29+
const PCR_SYSCLK_CONF_REG: *mut u32 = 0x6009610c as *mut u32;
30+
31+
const PCR_SOC_CLK_SEL_M: u32 = 3 << 16;
32+
const PCR_SOC_CLK_MAX: u32 = 1 << 16;
33+
34+
pub const fn new() -> Self {
35+
CpuSaveState {
36+
saved_sysclk_conf_reg: 0,
37+
}
38+
}
39+
40+
pub fn set_max_cpu_clock(&mut self) {
41+
self.saved_sysclk_conf_reg = unsafe { Self::PCR_SYSCLK_CONF_REG.read_volatile() };
42+
43+
unsafe {
44+
Self::PCR_SYSCLK_CONF_REG.write_volatile(
45+
(self.saved_sysclk_conf_reg & !Self::PCR_SOC_CLK_SEL_M) | Self::PCR_SOC_CLK_MAX,
46+
)
47+
};
48+
}
49+
50+
pub fn restore(&self) {
51+
unsafe { Self::PCR_SYSCLK_CONF_REG.write_volatile(self.saved_sysclk_conf_reg) };
52+
}
53+
}
54+
2455
pub fn major_chip_version() -> u8 {
2556
read_field::<1, 117, 2>()
2657
}

src/chip/esp32p4.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ pub const EFUSE_INFO: EfuseInfo = EfuseInfo {
4848
block_sizes: &[6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8],
4949
};
5050

51+
pub struct CpuSaveState {}
52+
53+
impl CpuSaveState {
54+
pub const fn new() -> Self {
55+
CpuSaveState {}
56+
}
57+
58+
pub fn set_max_cpu_clock(&mut self) {}
59+
60+
pub fn restore(&self) {}
61+
}
62+
5163
pub fn major_chip_version() -> u8 {
5264
let lo = read_field::<1, 68, 2>();
5365
let hi = read_field::<1, 87, 1>();

0 commit comments

Comments
 (0)