Skip to content

Commit 41eb732

Browse files
authored
Support loading flash settings from the config file (#627)
* Support storing flash settings in the config file Allow loading the flash frequency, size, and mode from the config file. * Apply serde renames to the flash frequencies and sizes Rename the FlashFrequency, FlashMode, and FlashSize enum variants to more user-friendly names. Note that will break attempting to deserialize these values that were serialized by old versions of the code. However, I did not see anywhere currently using serialization for this field. The serialization support was added in #528, for probe-rs/probe-rs#1952, but as best I can tell it doesn't look like this functionality ended up being used in the probe-rs code. * Document the `[flash]` config section in the crate README.md files
1 parent 15991b5 commit 41eb732

File tree

8 files changed

+164
-177
lines changed

8 files changed

+164
-177
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## [Unreleased]
99

1010
### Added
11+
- Support loading flash size, frequency, and mode from the config file (#627)
1112

1213
### Fixed
1314
- Fixed help text for size parameter of read-flash subcommand

cargo-espflash/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ The configuration file allows you to define various parameters for your applicat
135135
```toml
136136
partition_table = "path/to/custom/partition-table.bin"
137137
```
138+
- Flash settings
139+
```toml
140+
[flash]
141+
mode = "qio"
142+
size = "8MB"
143+
frequency = "80MHz"
144+
```
138145

139146
You can have a local and/or a global configuration file:
140147

cargo-espflash/src/main.rs

Lines changed: 21 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ use clap::{Args, CommandFactory, Parser, Subcommand};
99
use espflash::{
1010
cli::{
1111
self, board_info, checksum_md5, completions, config::Config, connect, erase_flash,
12-
erase_partitions, erase_region, flash_elf_image, monitor::monitor, partition_table,
13-
print_board_info, read_flash, save_elf_as_image, serial_monitor, ChecksumMd5Args,
14-
CompletionsArgs, ConnectArgs, EraseFlashArgs, EraseRegionArgs, EspflashProgress,
15-
FlashConfigArgs, MonitorArgs, PartitionTableArgs, ReadFlashArgs,
12+
erase_partitions, erase_region, flash_elf_image, make_flash_data, monitor::monitor,
13+
partition_table, print_board_info, read_flash, save_elf_as_image, serial_monitor,
14+
ChecksumMd5Args, CompletionsArgs, ConnectArgs, EraseFlashArgs, EraseRegionArgs,
15+
EspflashProgress, FlashConfigArgs, MonitorArgs, PartitionTableArgs, ReadFlashArgs,
1616
},
1717
error::Error as EspflashError,
18-
flasher::{parse_partition_table, FlashData, FlashSettings},
18+
flasher::parse_partition_table,
1919
logging::initialize_logger,
2020
targets::{Chip, XtalFrequency},
2121
update::check_for_update,
@@ -267,12 +267,14 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
267267
args.flash_args.no_verify,
268268
args.flash_args.no_skip,
269269
)?;
270-
flasher.verify_minimum_revision(args.flash_args.min_chip_rev)?;
270+
flasher.verify_minimum_revision(args.flash_args.image.min_chip_rev)?;
271271

272-
// If the user has provided a flash size via a command-line argument, we'll
272+
// If the user has provided a flash size via a command-line argument or config, we'll
273273
// override the detected (or default) value with this.
274274
if let Some(flash_size) = args.build_args.flash_config_args.flash_size {
275275
flasher.set_flash_size(flash_size);
276+
} else if let Some(flash_size) = config.flash.size {
277+
flasher.set_flash_size(flash_size);
276278
}
277279

278280
let chip = flasher.chip();
@@ -292,40 +294,12 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
292294
if args.flash_args.ram {
293295
flasher.load_elf_to_ram(&elf_data, Some(&mut EspflashProgress::default()))?;
294296
} else {
295-
let bootloader = args
296-
.flash_args
297-
.bootloader
298-
.as_deref()
299-
.or(config.bootloader.as_deref())
300-
.or(build_ctx.bootloader_path.as_deref());
301-
302-
let partition_table = args
303-
.flash_args
304-
.partition_table
305-
.as_deref()
306-
.or(config.partition_table.as_deref())
307-
.or(build_ctx.partition_table_path.as_deref());
308-
309-
if let Some(path) = &bootloader {
310-
println!("Bootloader: {}", path.display());
311-
}
312-
if let Some(path) = &partition_table {
313-
println!("Partition table: {}", path.display());
314-
}
315-
316-
let flash_settings = FlashSettings::new(
317-
args.build_args.flash_config_args.flash_mode,
318-
args.build_args.flash_config_args.flash_size,
319-
args.build_args.flash_config_args.flash_freq,
320-
);
321-
322-
let flash_data = FlashData::new(
323-
bootloader,
324-
partition_table,
325-
args.flash_args.partition_table_offset,
326-
args.flash_args.target_app_partition,
327-
flash_settings,
328-
args.flash_args.min_chip_rev,
297+
let flash_data = make_flash_data(
298+
args.flash_args.image,
299+
&args.build_args.flash_config_args,
300+
config,
301+
build_ctx.bootloader_path.as_deref(),
302+
build_ctx.partition_table_path.as_deref(),
329303
)?;
330304

331305
if args.flash_args.erase_parts.is_some() || args.flash_args.erase_data_parts.is_some() {
@@ -532,47 +506,18 @@ fn save_image(args: SaveImageArgs, config: &Config) -> Result<()> {
532506
let build_ctx = build(&args.build_args, &cargo_config, args.save_image_args.chip)?;
533507
let elf_data = fs::read(build_ctx.artifact_path).into_diagnostic()?;
534508

535-
let bootloader = args
536-
.save_image_args
537-
.bootloader
538-
.as_deref()
539-
.or(config.bootloader.as_deref())
540-
.or(build_ctx.bootloader_path.as_deref())
541-
.map(|p| p.to_path_buf());
542-
543-
let partition_table = args
544-
.save_image_args
545-
.partition_table
546-
.as_deref()
547-
.or(config.partition_table.as_deref())
548-
.or(build_ctx.partition_table_path.as_deref())
549-
.map(|p| p.to_path_buf());
550-
551509
// Since we have no `Flasher` instance and as such cannot print the board
552510
// information, we will print whatever information we _do_ have.
553511
println!("Chip type: {}", args.save_image_args.chip);
554512
println!("Merge: {}", args.save_image_args.merge);
555513
println!("Skip padding: {}", args.save_image_args.skip_padding);
556-
if let Some(path) = &args.save_image_args.bootloader {
557-
println!("Bootloader: {}", path.display());
558-
}
559-
if let Some(path) = &args.save_image_args.partition_table {
560-
println!("Partition table: {}", path.display());
561-
}
562514

563-
let flash_settings = FlashSettings::new(
564-
args.build_args.flash_config_args.flash_mode,
565-
args.build_args.flash_config_args.flash_size,
566-
args.build_args.flash_config_args.flash_freq,
567-
);
568-
569-
let flash_data = FlashData::new(
570-
bootloader.as_deref(),
571-
partition_table.as_deref(),
572-
args.save_image_args.partition_table_offset,
573-
args.save_image_args.target_app_partition,
574-
flash_settings,
575-
args.save_image_args.min_chip_rev,
515+
let flash_data = make_flash_data(
516+
args.save_image_args.image,
517+
&args.build_args.flash_config_args,
518+
config,
519+
build_ctx.bootloader_path.as_deref(),
520+
build_ctx.partition_table_path.as_deref(),
576521
)?;
577522

578523
let xtal_freq = args

espflash/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ The configuration file allows you to define various parameters for your applicat
149149
```toml
150150
partition_table = "path/to/custom/partition-table.bin"
151151
```
152+
- Flash settings
153+
```toml
154+
[flash]
155+
mode = "qio"
156+
size = "8MB"
157+
frequency = "80MHz"
158+
```
152159

153160
You can have a local and/or a global configuration file:
154161

espflash/src/bin/espflash.rs

Lines changed: 22 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ use clap::{Args, CommandFactory, Parser, Subcommand};
88
use espflash::{
99
cli::{
1010
self, board_info, checksum_md5, completions, config::Config, connect, erase_flash,
11-
erase_partitions, erase_region, flash_elf_image, monitor::monitor, parse_uint32,
12-
partition_table, print_board_info, read_flash, save_elf_as_image, serial_monitor,
13-
ChecksumMd5Args, CompletionsArgs, ConnectArgs, EraseFlashArgs, EraseRegionArgs,
14-
EspflashProgress, FlashConfigArgs, MonitorArgs, PartitionTableArgs, ReadFlashArgs,
11+
erase_partitions, erase_region, flash_elf_image, make_flash_data, monitor::monitor,
12+
parse_uint32, partition_table, print_board_info, read_flash, save_elf_as_image,
13+
serial_monitor, ChecksumMd5Args, CompletionsArgs, ConnectArgs, EraseFlashArgs,
14+
EraseRegionArgs, EspflashProgress, FlashConfigArgs, MonitorArgs, PartitionTableArgs,
15+
ReadFlashArgs,
1516
},
1617
error::Error,
17-
flasher::{parse_partition_table, FlashData, FlashSettings},
18+
flasher::parse_partition_table,
1819
logging::initialize_logger,
1920
targets::{Chip, XtalFrequency},
2021
update::check_for_update,
@@ -161,7 +162,7 @@ fn main() -> Result<()> {
161162
// displayed.
162163
check_for_update(env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
163164

164-
// Load any user configuraiton, if present.
165+
// Load any user configuration, if present.
165166
let config = Config::load()?;
166167

167168
// Execute the correct action based on the provided subcommand and its
@@ -212,12 +213,14 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
212213
args.flash_args.no_verify,
213214
args.flash_args.no_skip,
214215
)?;
215-
flasher.verify_minimum_revision(args.flash_args.min_chip_rev)?;
216+
flasher.verify_minimum_revision(args.flash_args.image.min_chip_rev)?;
216217

217218
// If the user has provided a flash size via a command-line argument, we'll
218219
// override the detected (or default) value with this.
219220
if let Some(flash_size) = args.flash_config_args.flash_size {
220221
flasher.set_flash_size(flash_size);
222+
} else if let Some(flash_size) = config.flash.size {
223+
flasher.set_flash_size(flash_size);
221224
}
222225

223226
print_board_info(&mut flasher)?;
@@ -232,37 +235,12 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
232235
if args.flash_args.ram {
233236
flasher.load_elf_to_ram(&elf_data, Some(&mut EspflashProgress::default()))?;
234237
} else {
235-
let bootloader = args
236-
.flash_args
237-
.bootloader
238-
.as_deref()
239-
.or(config.bootloader.as_deref());
240-
let partition_table = args
241-
.flash_args
242-
.partition_table
243-
.as_deref()
244-
.or(config.partition_table.as_deref());
245-
246-
if let Some(path) = bootloader {
247-
println!("Bootloader: {}", path.display());
248-
}
249-
if let Some(path) = partition_table {
250-
println!("Partition table: {}", path.display());
251-
}
252-
253-
let flash_settings = FlashSettings::new(
254-
args.flash_config_args.flash_mode,
255-
args.flash_config_args.flash_size,
256-
args.flash_config_args.flash_freq,
257-
);
258-
259-
let flash_data = FlashData::new(
260-
bootloader,
261-
partition_table,
262-
args.flash_args.partition_table_offset,
263-
args.flash_args.target_app_partition,
264-
flash_settings,
265-
args.flash_args.min_chip_rev,
238+
let flash_data = make_flash_data(
239+
args.flash_args.image,
240+
&args.flash_config_args,
241+
config,
242+
None,
243+
None,
266244
)?;
267245

268246
if args.flash_args.erase_parts.is_some() || args.flash_args.erase_data_parts.is_some() {
@@ -306,42 +284,18 @@ fn save_image(args: SaveImageArgs, config: &Config) -> Result<()> {
306284
.into_diagnostic()
307285
.wrap_err_with(|| format!("Failed to open image {}", args.image.display()))?;
308286

309-
let bootloader = args
310-
.save_image_args
311-
.bootloader
312-
.as_deref()
313-
.or(config.bootloader.as_deref());
314-
let partition_table = args
315-
.save_image_args
316-
.partition_table
317-
.as_deref()
318-
.or(config.partition_table.as_deref());
319-
320287
// Since we have no `Flasher` instance and as such cannot print the board
321288
// information, we will print whatever information we _do_ have.
322289
println!("Chip type: {}", args.save_image_args.chip);
323290
println!("Merge: {}", args.save_image_args.merge);
324291
println!("Skip padding: {}", args.save_image_args.skip_padding);
325-
if let Some(path) = &bootloader {
326-
println!("Bootloader: {}", path.display());
327-
}
328-
if let Some(path) = &partition_table {
329-
println!("Partition table: {}", path.display());
330-
}
331292

332-
let flash_settings = FlashSettings::new(
333-
args.flash_config_args.flash_mode,
334-
args.flash_config_args.flash_size,
335-
args.flash_config_args.flash_freq,
336-
);
337-
338-
let flash_data = FlashData::new(
339-
bootloader,
340-
partition_table,
341-
args.save_image_args.partition_table_offset,
342-
args.save_image_args.target_app_partition,
343-
flash_settings,
344-
args.save_image_args.min_chip_rev,
293+
let flash_data = make_flash_data(
294+
args.save_image_args.image,
295+
&args.flash_config_args,
296+
config,
297+
None,
298+
None,
345299
)?;
346300

347301
let xtal_freq = args

espflash/src/cli/config.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use serde::{Deserialize, Serialize};
2020
use serialport::UsbPortInfo;
2121

2222
use crate::error::Error;
23+
use crate::flasher::FlashSettings;
2324

2425
/// A configured, known serial connection
2526
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
@@ -89,6 +90,9 @@ pub struct Config {
8990
/// Preferred USB devices
9091
#[serde(default)]
9192
pub usb_device: Vec<UsbDevice>,
93+
/// Flash settings
94+
#[serde(default)]
95+
pub flash: FlashSettings,
9296
/// Path of the file to save the configuration to
9397
#[serde(skip)]
9498
save_path: PathBuf,

0 commit comments

Comments
 (0)