Skip to content

Commit 55c8513

Browse files
committed
Implement restriction-based pin filtering
1 parent 7080743 commit 55c8513

File tree

10 files changed

+149
-181
lines changed

10 files changed

+149
-181
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ strum = "0.27.2"
2828
inquire = "0.9.1"
2929
clap = { version = "4.5.54", features = ["derive"] }
3030
env_logger = "0.11.8"
31-
esp-metadata-generated = { version = "0.3.0", features = ["build-script"], git = "https://github.com/esp-rs/esp-hal", rev = "66c4313eb" }
31+
esp-metadata-generated = { version = "0.3.0", features = ["build-script"], git = "https://github.com/esp-rs/esp-hal", rev = "f9150cbbc" }
3232
log = "0.4.29"
3333
ratatui = { version = "0.30.0", features = ["crossterm", "unstable"] }
3434
somni-expr = "0.2.0"

src/lib.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
use esp_metadata_generated::MemoryRegion;
1+
use esp_metadata_generated::{MemoryRegion, PinInfo};
22
use serde::{Deserialize, Serialize};
33

4+
use crate::modules::Module;
5+
46
pub mod cargo;
57
pub mod config;
68
pub mod modules;
@@ -60,6 +62,28 @@ impl Chip {
6062
.region("dram2_uninit")
6163
.expect("All chips should have a dram2_uninit region")
6264
}
65+
66+
pub fn pins(self) -> &'static [PinInfo] {
67+
self.metadata().pins()
68+
}
69+
70+
pub fn modules(self) -> &'static [Module] {
71+
match self {
72+
Chip::Esp32 => crate::modules::ESP32_MODULES,
73+
Chip::Esp32c2 => crate::modules::ESP32C2_MODULES,
74+
Chip::Esp32c3 => crate::modules::ESP32C3_MODULES,
75+
Chip::Esp32c6 => crate::modules::ESP32C6_MODULES,
76+
Chip::Esp32h2 => crate::modules::ESP32H2_MODULES,
77+
Chip::Esp32s2 => crate::modules::ESP32S2_MODULES,
78+
Chip::Esp32s3 => crate::modules::ESP32S3_MODULES,
79+
}
80+
}
81+
82+
pub fn module_by_name(&self, module_name: &str) -> Option<&'static Module> {
83+
self.modules()
84+
.iter()
85+
.find(|module| module.name == module_name)
86+
}
6387
}
6488

6589
/// This turns a list of strings into a sentence, and appends it to the base string.

src/main.rs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use esp_generate::{
1414
};
1515
use inquire::{Select, Text};
1616
use ratatui::crossterm::event;
17+
use std::fmt::Write;
1718
use std::{
1819
collections::HashMap,
1920
env, fs,
@@ -403,22 +404,51 @@ fn main() -> Result<()> {
403404
}
404405

405406
if let Some(ref module_name) = selected_module {
406-
if let Some(module) = esp_generate::modules::find_module(module_name) {
407-
// Only set module-selected if there are GPIOs to reserve,
408-
// otherwise the generated code would have unused `peripherals` variable
409-
if !module.reserved_gpios.is_empty() {
410-
selected.push("module-selected".to_string());
411-
if module.octal_psram {
412-
selected.push("octal-psram".to_string());
413-
}
414-
let reserved_gpio_code = module
415-
.reserved_gpios
407+
if let Some(module) = chip.module_by_name(module_name) {
408+
let restricted_pins = chip.pins().iter().filter(|pin| {
409+
module
410+
.remove_pins
411+
.iter()
412+
.any(|lim| pin.limitations.contains(&lim))
413+
});
414+
let strapping_pins = chip
415+
.pins()
416+
.iter()
417+
.filter(|pin| pin.limitations.contains(&"strapping"))
418+
.collect::<Vec<_>>();
419+
420+
let mut reserved_gpio_code = String::new();
421+
422+
if !strapping_pins.is_empty() {
423+
let strapping = strapping_pins
416424
.iter()
417-
.map(|g| format!(" let _ = peripherals.GPIO{g};"))
425+
.map(|pin| format!("// - GPIO{}", pin.pin))
418426
.collect::<Vec<_>>()
419427
.join("\n");
420-
variables.push(("reserved_gpio_code".to_string(), reserved_gpio_code));
428+
writeln!(
429+
&mut reserved_gpio_code,
430+
r#"// The following pins are used to bootstrap the chip. They are available
431+
// for use, but check the datasheet of the module for more information on them.
432+
{strapping}"#
433+
)
434+
.unwrap();
421435
}
436+
437+
// Only set module-selected if there are GPIOs to reserve
438+
if restricted_pins.clone().next().is_some() {
439+
let pin_plucker = restricted_pins
440+
.map(|pin| format!(" let _ = peripherals.GPIO{};", pin.pin))
441+
.collect::<Vec<_>>()
442+
.join("\n");
443+
writeln!(
444+
&mut reserved_gpio_code,
445+
r#"// These GPIO pins are in use by some feature of the module and should not be used.
446+
{pin_plucker}"#
447+
)
448+
.unwrap();
449+
};
450+
451+
variables.push(("reserved_gpio_code".to_string(), reserved_gpio_code));
422452
}
423453
}
424454

src/modules.rs

Lines changed: 71 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -5,184 +5,128 @@ pub struct Module {
55
pub name: &'static str,
66
pub display_name: &'static str,
77
pub chip: Chip,
8-
pub reserved_gpios: &'static [u8],
9-
pub octal_psram: bool,
8+
pub remove_pins: &'static [&'static str],
109
}
1110

12-
pub const MODULES: &[Module] = &[
13-
// ESP32-C6 modules (in-package flash, SPI flash pins 24-26,28-30 not exposed in HAL)
11+
pub const ESP32_MODULES: &[Module] = &[
1412
Module {
15-
name: "esp32c6-wroom-1",
16-
display_name: "ESP32-C6-WROOM-1 (4MB flash)",
17-
chip: Chip::Esp32c6,
18-
reserved_gpios: &[],
19-
octal_psram: false,
20-
},
21-
Module {
22-
name: "esp32c6-wroom-1u",
23-
display_name: "ESP32-C6-WROOM-1U (4MB flash, U.FL)",
24-
chip: Chip::Esp32c6,
25-
reserved_gpios: &[],
26-
octal_psram: false,
27-
},
28-
Module {
29-
name: "esp32c6-mini-1",
30-
display_name: "ESP32-C6-MINI-1 (4/8MB flash)",
31-
chip: Chip::Esp32c6,
32-
reserved_gpios: &[],
33-
octal_psram: false,
34-
},
35-
// ESP32-S3 modules (SPI flash pins 26-32 not exposed in HAL)
36-
// Quad flash/PSRAM modules: no additional reserved pins
37-
// Octal flash/PSRAM modules: pins 33-37 connected to octal flash/PSRAM
38-
Module {
39-
name: "esp32s3-wroom-1",
40-
display_name: "ESP32-S3-WROOM-1 (quad flash/PSRAM)",
41-
chip: Chip::Esp32s3,
42-
reserved_gpios: &[],
43-
octal_psram: false,
44-
},
45-
Module {
46-
name: "esp32s3-wroom-1u",
47-
display_name: "ESP32-S3-WROOM-1U (quad flash/PSRAM, U.FL)",
48-
chip: Chip::Esp32s3,
49-
reserved_gpios: &[],
50-
octal_psram: false,
51-
},
52-
Module {
53-
name: "esp32s3-wroom-2",
54-
display_name: "ESP32-S3-WROOM-2 (octal flash/PSRAM)",
55-
chip: Chip::Esp32s3,
56-
reserved_gpios: &[33, 34, 35, 36, 37],
57-
octal_psram: true,
13+
name: "esp32-wroom-32e",
14+
display_name: "ESP32-WROOM-32E/32UE (4/8/16MB flash)",
15+
chip: Chip::Esp32,
16+
remove_pins: &["spi_flash", "esp32_pico_v3"],
5817
},
5918
Module {
60-
name: "esp32s3-mini-1",
61-
display_name: "ESP32-S3-MINI-1 (quad flash/PSRAM)",
62-
chip: Chip::Esp32s3,
63-
reserved_gpios: &[],
64-
octal_psram: false,
19+
name: "esp32-wrover-e",
20+
display_name: "ESP32-WROVER-E/IE (8MB PSRAM)",
21+
chip: Chip::Esp32,
22+
remove_pins: &["spi_flash", "spi_psram", "esp32_pico_v3"],
6523
},
6624
Module {
67-
name: "esp32s3-mini-1u",
68-
display_name: "ESP32-S3-MINI-1U (quad flash/PSRAM, U.FL)",
69-
chip: Chip::Esp32s3,
70-
reserved_gpios: &[],
71-
octal_psram: false,
25+
name: "esp32-mini-1",
26+
display_name: "ESP32-MINI-1 (4MB flash)",
27+
chip: Chip::Esp32,
28+
remove_pins: &["spi_flash", "esp32_pico_v3"],
7229
},
73-
// ESP32-C3 modules (in-package flash, SPI flash pins 11-17 not exposed in HAL)
30+
];
31+
32+
pub const ESP32C2_MODULES: &[Module] = &[Module {
33+
name: "esp32c2-mini-1",
34+
display_name: "ESP32-C2-MINI-1 (2/4MB flash)",
35+
chip: Chip::Esp32c2,
36+
remove_pins: &["spi_flash"],
37+
}];
38+
39+
pub const ESP32C3_MODULES: &[Module] = &[
7440
Module {
7541
name: "esp32c3-wroom-02",
76-
display_name: "ESP32-C3-WROOM-02 (4MB flash)",
77-
chip: Chip::Esp32c3,
78-
reserved_gpios: &[],
79-
octal_psram: false,
80-
},
81-
Module {
82-
name: "esp32c3-wroom-02u",
83-
display_name: "ESP32-C3-WROOM-02U (4MB flash, U.FL)",
42+
display_name: "ESP32-C3-WROOM-02/02U (4MB flash)",
8443
chip: Chip::Esp32c3,
85-
reserved_gpios: &[],
86-
octal_psram: false,
44+
remove_pins: &["spi_flash"],
8745
},
8846
Module {
8947
name: "esp32c3-mini-1",
9048
display_name: "ESP32-C3-MINI-1 (4MB flash)",
9149
chip: Chip::Esp32c3,
92-
reserved_gpios: &[],
93-
octal_psram: false,
50+
remove_pins: &["spi_flash"],
9451
},
95-
// ESP32 modules (SPI flash pins 6-11 not exposed in HAL)
96-
// WROVER-E has PSRAM on pins 16, 17 which need to be reserved
52+
];
53+
54+
pub const ESP32C6_MODULES: &[Module] = &[
9755
Module {
98-
name: "esp32-wroom-32e",
99-
display_name: "ESP32-WROOM-32E (4/8/16MB flash)",
100-
chip: Chip::Esp32,
101-
reserved_gpios: &[],
102-
octal_psram: false,
56+
name: "esp32c6-wroom-1",
57+
display_name: "ESP32-C6-WROOM-1/1U (4MB flash)",
58+
chip: Chip::Esp32c6,
59+
remove_pins: &["spi_flash"],
10360
},
10461
Module {
105-
name: "esp32-wroom-32ue",
106-
display_name: "ESP32-WROOM-32UE (4/8/16MB flash, U.FL)",
107-
chip: Chip::Esp32,
108-
reserved_gpios: &[],
109-
octal_psram: false,
62+
name: "esp32c6-mini-1",
63+
display_name: "ESP32-C6-MINI-1 (4/8MB flash)",
64+
chip: Chip::Esp32c6,
65+
remove_pins: &["spi_flash"],
11066
},
67+
];
68+
69+
pub const ESP32H2_MODULES: &[Module] = &[
11170
Module {
112-
name: "esp32-wrover-e",
113-
display_name: "ESP32-WROVER-E (8MB PSRAM)",
114-
chip: Chip::Esp32,
115-
reserved_gpios: &[16, 17],
116-
octal_psram: false,
71+
name: "esp32h2-wroom-02",
72+
display_name: "ESP32-H2-WROOM-02 (4MB flash)",
73+
chip: Chip::Esp32h2,
74+
remove_pins: &["spi_flash"],
11775
},
11876
Module {
119-
name: "esp32-mini-1",
120-
display_name: "ESP32-MINI-1 (4MB flash)",
121-
chip: Chip::Esp32,
122-
reserved_gpios: &[],
123-
octal_psram: false,
77+
name: "esp32h2-mini-1",
78+
display_name: "ESP32-H2-MINI-1 (4MB flash)",
79+
chip: Chip::Esp32h2,
80+
remove_pins: &["spi_flash"],
12481
},
125-
// ESP32-S2 modules (SPI flash pins 26-32 not exposed in HAL)
82+
];
83+
84+
pub const ESP32S2_MODULES: &[Module] = &[
12685
Module {
12786
name: "esp32s2-wroom",
12887
display_name: "ESP32-S2-WROOM (4MB flash)",
12988
chip: Chip::Esp32s2,
130-
reserved_gpios: &[],
131-
octal_psram: false,
89+
remove_pins: &["spi_flash"],
13290
},
13391
Module {
13492
name: "esp32s2-wrover",
13593
display_name: "ESP32-S2-WROVER (2MB PSRAM)",
13694
chip: Chip::Esp32s2,
137-
reserved_gpios: &[],
138-
octal_psram: false,
95+
remove_pins: &["spi_flash", "spi_psram"],
13996
},
14097
Module {
14198
name: "esp32s2-mini-1",
14299
display_name: "ESP32-S2-MINI-1 (4MB flash)",
143100
chip: Chip::Esp32s2,
144-
reserved_gpios: &[],
145-
octal_psram: false,
101+
remove_pins: &["spi_flash"],
146102
},
147-
// ESP32-C2 modules (SPI flash pins 11-17 not exposed in HAL)
103+
];
104+
105+
pub const ESP32S3_MODULES: &[Module] = &[
148106
Module {
149-
name: "esp32c2-mini-1",
150-
display_name: "ESP32-C2-MINI-1 (2/4MB flash)",
151-
chip: Chip::Esp32c2,
152-
reserved_gpios: &[],
153-
octal_psram: false,
107+
name: "esp32s3-wroom-1",
108+
display_name: "ESP32-S3-WROOM-1/1U (quad flash/PSRAM)",
109+
chip: Chip::Esp32s3,
110+
remove_pins: &["spi_flash"],
154111
},
155-
// ESP32-H2 modules (in-package flash, no reserved GPIOs)
156112
Module {
157-
name: "esp32h2-wroom-02",
158-
display_name: "ESP32-H2-WROOM-02 (4MB flash)",
159-
chip: Chip::Esp32h2,
160-
reserved_gpios: &[],
161-
octal_psram: false,
113+
name: "esp32s3-wroom-2",
114+
display_name: "ESP32-S3-WROOM-2 (octal flash/PSRAM)",
115+
chip: Chip::Esp32s3,
116+
remove_pins: &[],
162117
},
163118
Module {
164-
name: "esp32h2-mini-1",
165-
display_name: "ESP32-H2-MINI-1 (4MB flash)",
166-
chip: Chip::Esp32h2,
167-
reserved_gpios: &[],
168-
octal_psram: false,
119+
name: "esp32s3-mini-1",
120+
display_name: "ESP32-S3-MINI-1/1U (quad flash/PSRAM)",
121+
chip: Chip::Esp32s3,
122+
remove_pins: &[],
169123
},
170124
];
171125

172-
pub fn modules_for_chip(chip: Chip) -> Vec<&'static Module> {
173-
MODULES.iter().filter(|m| m.chip == chip).collect()
174-
}
175-
176-
pub fn find_module(name: &str) -> Option<&'static Module> {
177-
MODULES.iter().find(|m| m.name == name)
178-
}
179-
180126
use crate::template::GeneratorOptionItem;
181127

182128
/// Populates the module category in the template options with chip-specific modules.
183129
pub fn populate_module_category(chip: Chip, options: &mut [GeneratorOptionItem]) {
184-
let modules = modules_for_chip(chip);
185-
186130
for item in options.iter_mut() {
187131
let GeneratorOptionItem::Category(category) = item else {
188132
continue;
@@ -200,7 +144,7 @@ pub fn populate_module_category(chip: Chip, options: &mut [GeneratorOptionItem])
200144

201145
category.options.clear();
202146

203-
for module in modules {
147+
for module in chip.modules() {
204148
let mut opt = template_opt.clone();
205149
opt.name = module.name.to_string();
206150
opt.display_name = module.display_name.to_string();

0 commit comments

Comments
 (0)