Skip to main content

esp_generate/
modules.rs

1use crate::Chip;
2
3#[derive(Clone, Debug)]
4pub struct Module {
5    pub name: &'static str,
6    pub display_name: &'static str,
7    pub chip: Chip,
8    pub remove_pins: &'static [&'static str],
9}
10
11// TODO: the module data was taken from https://www.espressif.com/en/products/modules and
12// will need to be double checked by actual data sheet information. Also, different modules
13// may not expose otherwise available pins, we should consider listing them as well.
14
15pub const ESP32_MODULES: &[Module] = &[
16    Module {
17        name: "esp32-wroom-32e",
18        display_name: "ESP32-WROOM-32E/32UE (4/8/16MB flash)",
19        chip: Chip::Esp32,
20        remove_pins: &["spi_flash", "esp32_pico_v3"],
21    },
22    Module {
23        name: "esp32-wrover-e",
24        display_name: "ESP32-WROVER-E/IE (4/8/16MB flash, 8MB PSRAM)",
25        chip: Chip::Esp32,
26        remove_pins: &["spi_flash", "spi_psram", "esp32_pico_v3"],
27    },
28    Module {
29        name: "esp32-mini-1",
30        display_name: "ESP32-MINI-1/1U (4MB flash)",
31        chip: Chip::Esp32,
32        remove_pins: &["spi_flash", "esp32_pico_v3"],
33    },
34    Module {
35        name: "esp32-pico-mini-01",
36        display_name: "ESP32-PICO-MINI-02/02U (8MB flash, 2MB PSRAM)",
37        chip: Chip::Esp32,
38        remove_pins: &["spi_flash", "spi_psram"],
39    },
40    Module {
41        name: "esp32-pico-v3-zero",
42        display_name: "ESP32-PICO-V3-ZERO (4MB flash)",
43        chip: Chip::Esp32,
44        remove_pins: &["spi_flash"],
45    },
46    Module {
47        name: "esp32-wroom-32d",
48        display_name: "ESP32-WROOM-32D/32U (4/8/16MB flash)",
49        chip: Chip::Esp32,
50        remove_pins: &["spi_flash", "esp32_pico_v3"],
51    },
52    // ESP32-SOLO-1 omitted, weird single-core ESP32 variant
53    Module {
54        name: "esp32-wroom-32",
55        display_name: "ESP32-WROOM-32 (4MB flash)",
56        chip: Chip::Esp32,
57        remove_pins: &["spi_flash", "esp32_pico_v3"],
58    },
59    Module {
60        name: "esp32-wrover-b",
61        display_name: "ESP32-WROVER-B/IB (4/8/16MB flash, 8MB PSRAM)",
62        chip: Chip::Esp32,
63        remove_pins: &["spi_flash", "spi_psram", "esp32_pico_v3"],
64    },
65    Module {
66        name: "esp32-wroom-da",
67        display_name: "ESP32-WROOM-DA (4/8/16MB flash)",
68        chip: Chip::Esp32,
69        remove_pins: &["spi_flash", "esp32_pico_v3"],
70    },
71    Module {
72        name: "esp32-du1906",
73        display_name: "ESP32-DU1906/DU1906-U (8MB flash, 8MB PSRAM)",
74        chip: Chip::Esp32,
75        remove_pins: &["spi_flash", "spi_psram", "esp32_pico_v3"],
76    },
77];
78
79pub const ESP32C2_MODULES: &[Module] = &[
80    Module {
81        name: "esp32c2-mini-1",
82        display_name: "ESP8684-MINI-1/1U (1/2/4MB flash)",
83        chip: Chip::Esp32c2,
84        remove_pins: &["spi_flash"],
85    },
86    // TODO: these have different pins exposed, maybe separate them?
87    Module {
88        name: "esp32c2-wroom",
89        display_name: "ESP8684-WROOM-01C/02C/02UC/03/04C/05/06C/07 (2/4MB flash)",
90        chip: Chip::Esp32c2,
91        remove_pins: &["spi_flash"],
92    },
93];
94
95pub const ESP32C3_MODULES: &[Module] = &[
96    Module {
97        name: "esp32c3-mini-1",
98        display_name: "ESP32-C3-MINI-1/1U (4MB embedded flash)",
99        chip: Chip::Esp32c3,
100        remove_pins: &["spi_flash"],
101    },
102    Module {
103        name: "esp32c3-wroom-02",
104        display_name: "ESP32-C3-WROOM-02/02U (4MB flash)",
105        chip: Chip::Esp32c3,
106        remove_pins: &["spi_flash"],
107    },
108    // TODO: these have different pins exposed, maybe separate them?
109    Module {
110        name: "esp32c3-wroom-03",
111        display_name: "ESP8685-WROOM-03/04/05/06/07 (2/4MB flash)",
112        chip: Chip::Esp32c3,
113        remove_pins: &["spi_flash"],
114    },
115];
116
117pub const ESP32C5_MODULES: &[Module] = &[
118    Module {
119        name: "esp32c5-wroom-1",
120        display_name: "ESP32-C5-WROOM-1/1U (Without PSRAM)",
121        chip: Chip::Esp32c61,
122        remove_pins: &["spi_flash"],
123    },
124    Module {
125        name: "esp32c5-wroom-1-psram",
126        display_name: "ESP32-C5-WROOM-1/1U (8MB PSRAM)",
127        chip: Chip::Esp32c61,
128        remove_pins: &["spi_flash", "spi_psram"],
129    },
130    Module {
131        name: "esp32c5-mini-1",
132        display_name: "ESP32-C5-MINI-1/1U (Without PSRAM)",
133        chip: Chip::Esp32c61,
134        remove_pins: &["spi_flash"],
135    },
136    Module {
137        name: "esp32c5-mini-1-psram",
138        display_name: "ESP32-C5-MINI-1/1U (8MB PSRAM)",
139        chip: Chip::Esp32c61,
140        remove_pins: &["spi_flash", "spi_psram"],
141    },
142];
143
144pub const ESP32C6_MODULES: &[Module] = &[
145    Module {
146        name: "esp32c6-mini-1",
147        display_name: "ESP32-C6-MINI-1/1U (4/8MB flash)",
148        chip: Chip::Esp32c6,
149        remove_pins: &["spi_flash"],
150    },
151    Module {
152        name: "esp32c6-wroom-1",
153        display_name: "ESP32-C6-WROOM-1/1U (4/8/16MB flash)",
154        chip: Chip::Esp32c6,
155        remove_pins: &["spi_flash"],
156    },
157];
158
159pub const ESP32C61_MODULES: &[Module] = &[
160    Module {
161        name: "esp32c61-wroom-1",
162        display_name: "ESP32-C61-WROOM-1/1U",
163        chip: Chip::Esp32c61,
164        remove_pins: &["spi_flash", "spi_psram"],
165    },
166    Module {
167        name: "esp32c61-mini-1",
168        display_name: "ESP32-C61-MINI-1/1U",
169        chip: Chip::Esp32c61,
170        remove_pins: &["spi_flash"],
171    },
172];
173pub const ESP32H2_MODULES: &[Module] = &[
174    Module {
175        name: "esp32h2-mini-1",
176        display_name: "ESP32-H2-MINI-1/1U (1/2/4MB flash)",
177        chip: Chip::Esp32h2,
178        remove_pins: &["spi_flash"],
179    },
180    Module {
181        name: "esp32h2-wroom-02c",
182        display_name: "ESP32-H2-WROOM-02C (2/4MB flash)",
183        chip: Chip::Esp32h2,
184        remove_pins: &["spi_flash"],
185    },
186];
187
188pub const ESP32S2_MODULES: &[Module] = &[
189    Module {
190        name: "esp32s2-mini-2",
191        display_name: "ESP32-S2-MINI-2/2U (4MB embedded flash)",
192        chip: Chip::Esp32s2,
193        remove_pins: &["spi_flash"],
194    },
195    Module {
196        name: "esp32s2-mini-2-psram",
197        display_name: "ESP32-S2-MINI-2/2U (4MB embedded flash, 2MB PSRAM)",
198        chip: Chip::Esp32s2,
199        remove_pins: &["spi_flash", "spi_psram"],
200    },
201    Module {
202        name: "esp32s2-solo-2",
203        display_name: "ESP32-S2-SOLO-2/2U (4MB flash)",
204        chip: Chip::Esp32s2,
205        remove_pins: &["spi_flash"],
206    },
207    Module {
208        name: "esp32s2-solo-2-psram",
209        display_name: "ESP32-S2-SOLO-2/2U (4MB embedded flash, 2MB PSRAM)",
210        chip: Chip::Esp32s2,
211        remove_pins: &["spi_flash", "spi_psram"],
212    },
213    Module {
214        name: "esp32s2-mini-1",
215        display_name: "ESP32-S2-MINI-1/1U (4MB embedded flash)",
216        chip: Chip::Esp32s2,
217        remove_pins: &["spi_flash"],
218    },
219    Module {
220        name: "esp32s2-mini-1-psram",
221        display_name: "ESP32-S2-MINI-1/1U (4MB embedded flash, 2MB PSRAM)",
222        chip: Chip::Esp32s2,
223        remove_pins: &["spi_flash", "spi_psram"],
224    },
225    Module {
226        name: "esp32s2-solo",
227        display_name: "ESP32-S2-SOLO/SOLO-U (4/8/16MB flash)",
228        chip: Chip::Esp32s2,
229        remove_pins: &["spi_flash"],
230    },
231    Module {
232        name: "esp32s2-solo-psram",
233        display_name: "ESP32-S2-SOLO/SOLO-U (4/8/16MB embedded flash, 2MB PSRAM)",
234        chip: Chip::Esp32s2,
235        remove_pins: &["spi_flash", "spi_psram"],
236    },
237    Module {
238        name: "esp32s2-wrover",
239        display_name: "ESP32-S2-WROVER/WROVER-I (4/8/16MB flash, 2MB PSRAM)",
240        chip: Chip::Esp32s2,
241        remove_pins: &["spi_flash", "spi_psram"],
242    },
243    Module {
244        name: "esp32s2-wroom",
245        display_name: "ESP32-S2-WROOM/WROOM-I (4/8/16MB flash)",
246        chip: Chip::Esp32s2,
247        remove_pins: &["spi_flash"],
248    },
249];
250
251pub const ESP32S3_MODULES: &[Module] = &[
252    Module {
253        name: "esp32s3-wroom-1",
254        display_name: "ESP32-S3-WROOM-1/1U (4/8/16MB flash)",
255        chip: Chip::Esp32s3,
256        remove_pins: &["spi_flash"],
257    },
258    Module {
259        name: "esp32s3-wroom-1-psram",
260        display_name: "ESP32-S3-WROOM-1/1U (4/8/16MB flash, 2MB PSRAM)",
261        chip: Chip::Esp32s3,
262        remove_pins: &["spi_flash", "spi_psram"],
263    },
264    Module {
265        name: "esp32s3-wroom-1-octal-psram",
266        display_name: "ESP32-S3-WROOM-1/1U (4/8/16MB flash, 8/16MB PSRAM)",
267        chip: Chip::Esp32s3,
268        remove_pins: &["spi_flash", "octal_psram"],
269    },
270    Module {
271        name: "esp32s3-wroom-2",
272        display_name: "ESP32-S3-WROOM-2 (16/32MB flash, 8/16MB PSRAM)",
273        chip: Chip::Esp32s3,
274        remove_pins: &["octal_flash", "octal_psram"],
275    },
276    Module {
277        name: "esp32s3-mini-1",
278        display_name: "ESP32-S3-MINI-1/1U (4/8MB embedded flash)",
279        chip: Chip::Esp32s3,
280        remove_pins: &["spi_flash"],
281    },
282    Module {
283        name: "esp32s3-mini-1-psram",
284        display_name: "ESP32-S3-MINI-1/1U (4/8MB embedded flash, 2MB PSRAM)",
285        chip: Chip::Esp32s3,
286        remove_pins: &["spi_flash", "spi_psram"],
287    },
288];
289
290use crate::template::GeneratorOptionItem;
291
292/// Populates the module category in the template options with chip-specific modules.
293pub fn populate_module_category(chip: Chip, options: &mut [GeneratorOptionItem]) {
294    for item in options.iter_mut() {
295        let GeneratorOptionItem::Category(category) = item else {
296            continue;
297        };
298        if category.name != "module" {
299            continue;
300        }
301
302        let template_opt = match category.options.first() {
303            Some(GeneratorOptionItem::Option(opt)) => opt.clone(),
304            _ => {
305                panic!("module category must contain a placeholder !Option");
306            }
307        };
308
309        category.options.clear();
310
311        for module in chip.modules() {
312            let mut opt = template_opt.clone();
313            opt.name = module.name.to_string();
314            opt.display_name = module.display_name.to_string();
315            opt.selection_group = "module".to_string();
316            category.options.push(GeneratorOptionItem::Option(opt));
317        }
318
319        break;
320    }
321}