Skip to content

Commit 3d91a9b

Browse files
API improvements (#512)
* refactor: Use structs to simplify some functions args * refactor: Refactor FlashData so it can be reused in other functions * style: Remove unnecesary comments * docs: Udpate changelog * fix: Fix rebase errors * fix: Rebase errors
1 parent b52303e commit 3d91a9b

File tree

16 files changed

+276
-401
lines changed

16 files changed

+276
-401
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1818
- Add `Serialize` and `Deserialize` to `FlashFrequency`, `FlashMode` and `FlashSize`. (#528)
1919
- Add `checksum-md5` command (#536)
2020
- Add verify and skipping of unchanged flash regions - add `--no-verify` and `--no-skip` (#538)
21+
- Add --min-chip-rev argument to specify minimum chip revision (#252)
2122

2223
### Fixed
2324

@@ -27,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2728
- Fixed a missed `flush` call that may be causing communication errors (#521)
2829

2930
### Changed
31+
- Created `FlashData` and `FlashSettings` structs to reduce number of input arguments in some functions (#512)
3032

3133
- espflash will now exit with an error if `defmt` is selected but not usable (#524)
3234

cargo-espflash/src/main.rs

+35-27
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use espflash::{
1515
FlashConfigArgs, MonitorArgs, PartitionTableArgs,
1616
},
1717
error::Error as EspflashError,
18+
flasher::{FlashData, FlashSettings},
1819
image_format::ImageFormatKind,
1920
logging::initialize_logger,
2021
targets::Chip,
@@ -313,33 +314,32 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
313314
println!("Partition table: {}", path.display());
314315
}
315316

316-
let partition_table = match partition_table {
317-
Some(path) => Some(parse_partition_table(path)?),
318-
None => None,
319-
};
317+
let flash_settings = FlashSettings::new(
318+
args.build_args.flash_config_args.flash_mode,
319+
args.build_args.flash_config_args.flash_size,
320+
args.build_args.flash_config_args.flash_freq,
321+
);
322+
323+
let flash_data = FlashData::new(
324+
bootloader,
325+
partition_table,
326+
args.flash_args.partition_table_offset,
327+
args.flash_args.format.or(metadata.format),
328+
args.flash_args.target_app_partition,
329+
flash_settings,
330+
args.flash_args.min_chip_rev,
331+
)?;
320332

321333
if args.flash_args.erase_parts.is_some() || args.flash_args.erase_data_parts.is_some() {
322334
erase_partitions(
323335
&mut flasher,
324-
partition_table.clone(),
336+
flash_data.partition_table.clone(),
325337
args.flash_args.erase_parts,
326338
args.flash_args.erase_data_parts,
327339
)?;
328340
}
329341

330-
flash_elf_image(
331-
&mut flasher,
332-
&elf_data,
333-
bootloader,
334-
partition_table,
335-
args.flash_args.target_app_partition,
336-
args.flash_args.format.or(metadata.format),
337-
args.build_args.flash_config_args.flash_mode,
338-
args.build_args.flash_config_args.flash_size,
339-
args.build_args.flash_config_args.flash_freq,
340-
args.flash_args.partition_table_offset,
341-
args.flash_args.min_chip_rev,
342-
)?;
342+
flash_elf_image(&mut flasher, &elf_data, flash_data)?;
343343
}
344344

345345
if args.flash_args.monitor {
@@ -564,20 +564,28 @@ fn save_image(args: SaveImageArgs) -> Result<()> {
564564
println!("Partition table: {}", path.display());
565565
}
566566

567-
save_elf_as_image(
568-
args.save_image_args.chip,
569-
args.save_image_args.min_chip_rev,
570-
&elf_data,
571-
args.save_image_args.file,
572-
args.format.or(metadata.format),
567+
let flash_settings = FlashSettings::new(
573568
args.build_args.flash_config_args.flash_mode,
574569
args.build_args.flash_config_args.flash_size,
575570
args.build_args.flash_config_args.flash_freq,
571+
);
572+
573+
let flash_data = FlashData::new(
574+
bootloader.as_deref(),
575+
partition_table.as_deref(),
576576
args.save_image_args.partition_table_offset,
577-
args.save_image_args.merge,
578-
bootloader,
579-
partition_table,
577+
args.format.or(metadata.format),
580578
args.save_image_args.target_app_partition,
579+
flash_settings,
580+
args.save_image_args.min_chip_rev,
581+
)?;
582+
583+
save_elf_as_image(
584+
&elf_data,
585+
args.save_image_args.chip,
586+
args.save_image_args.file,
587+
flash_data,
588+
args.save_image_args.merge,
581589
args.save_image_args.skip_padding,
582590
)?;
583591

espflash/src/bin/espflash.rs

+35-27
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use espflash::{
1414
EspflashProgress, FlashConfigArgs, MonitorArgs, PartitionTableArgs,
1515
},
1616
error::Error,
17+
flasher::{FlashData, FlashSettings},
1718
image_format::ImageFormatKind,
1819
logging::initialize_logger,
1920
targets::Chip,
@@ -237,33 +238,32 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
237238
println!("Partition table: {}", path.display());
238239
}
239240

240-
let partition_table = match partition_table {
241-
Some(path) => Some(parse_partition_table(path)?),
242-
None => None,
243-
};
241+
let flash_settings = FlashSettings::new(
242+
args.flash_config_args.flash_mode,
243+
args.flash_config_args.flash_size,
244+
args.flash_config_args.flash_freq,
245+
);
246+
247+
let flash_data = FlashData::new(
248+
bootloader,
249+
partition_table,
250+
args.flash_args.partition_table_offset,
251+
args.flash_args.format,
252+
args.flash_args.target_app_partition,
253+
flash_settings,
254+
args.flash_args.min_chip_rev,
255+
)?;
244256

245257
if args.flash_args.erase_parts.is_some() || args.flash_args.erase_data_parts.is_some() {
246258
erase_partitions(
247259
&mut flasher,
248-
partition_table.clone(),
260+
flash_data.partition_table.clone(),
249261
args.flash_args.erase_parts,
250262
args.flash_args.erase_data_parts,
251263
)?;
252264
}
253265

254-
flash_elf_image(
255-
&mut flasher,
256-
&elf_data,
257-
bootloader,
258-
partition_table,
259-
args.flash_args.target_app_partition,
260-
args.flash_args.format,
261-
args.flash_config_args.flash_mode,
262-
args.flash_config_args.flash_size,
263-
args.flash_config_args.flash_freq,
264-
args.flash_args.partition_table_offset,
265-
args.flash_args.min_chip_rev,
266-
)?;
266+
flash_elf_image(&mut flasher, &elf_data, flash_data)?;
267267
}
268268

269269
if args.flash_args.monitor {
@@ -309,20 +309,28 @@ fn save_image(args: SaveImageArgs) -> Result<()> {
309309
println!("Partition table: {}", path.display());
310310
}
311311

312-
save_elf_as_image(
313-
args.save_image_args.chip,
314-
args.save_image_args.min_chip_rev,
315-
&elf_data,
316-
args.save_image_args.file,
317-
args.format,
312+
let flash_settings = FlashSettings::new(
318313
args.flash_config_args.flash_mode,
319314
args.flash_config_args.flash_size,
320315
args.flash_config_args.flash_freq,
316+
);
317+
318+
let flash_data = FlashData::new(
319+
args.save_image_args.bootloader.as_deref(),
320+
args.save_image_args.partition_table.as_deref(),
321321
args.save_image_args.partition_table_offset,
322-
args.save_image_args.merge,
323-
args.save_image_args.bootloader,
324-
args.save_image_args.partition_table,
322+
args.format,
325323
args.save_image_args.target_app_partition,
324+
flash_settings,
325+
args.save_image_args.min_chip_rev,
326+
)?;
327+
328+
save_elf_as_image(
329+
&elf_data,
330+
args.save_image_args.chip,
331+
args.save_image_args.file,
332+
flash_data,
333+
args.save_image_args.merge,
326334
args.save_image_args.skip_padding,
327335
)?;
328336

espflash/src/cli/mod.rs

+13-101
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use self::{
3535
use crate::{
3636
elf::ElfFirmwareImage,
3737
error::{Error, MissingPartition, MissingPartitionTable},
38-
flasher::{FlashFrequency, FlashMode, FlashSize, Flasher, ProgressCallbacks},
38+
flasher::{FlashData, FlashFrequency, FlashMode, FlashSize, Flasher, ProgressCallbacks},
3939
image_format::ImageFormatKind,
4040
interface::Interface,
4141
targets::Chip,
@@ -418,69 +418,21 @@ pub fn serial_monitor(args: MonitorArgs, config: &Config) -> Result<()> {
418418

419419
/// Convert the provided firmware image from ELF to binary
420420
pub fn save_elf_as_image(
421-
chip: Chip,
422-
min_rev_full: u16,
423421
elf_data: &[u8],
422+
chip: Chip,
424423
image_path: PathBuf,
425-
image_format: Option<ImageFormatKind>,
426-
flash_mode: Option<FlashMode>,
427-
flash_size: Option<FlashSize>,
428-
flash_freq: Option<FlashFrequency>,
429-
partition_table_offset: Option<u32>,
424+
flash_data: FlashData,
430425
merge: bool,
431-
bootloader_path: Option<PathBuf>,
432-
partition_table_path: Option<PathBuf>,
433-
target_app_partition: Option<String>,
434426
skip_padding: bool,
435427
) -> Result<()> {
436428
let image = ElfFirmwareImage::try_from(elf_data)?;
437429

438430
if merge {
439-
// merge_bin is TRUE
440-
// merge bootloader, partition table and app binaries
441-
// basic functionality, only merge 3 binaries
442-
443-
// If the '-B' option is provided, load the bootloader binary file at the
444-
// specified path.
445-
let bootloader = if let Some(bootloader_path) = bootloader_path {
446-
let path = fs::canonicalize(bootloader_path).into_diagnostic()?;
447-
let data = fs::read(path).into_diagnostic()?;
448-
449-
Some(data)
450-
} else {
451-
None
452-
};
453-
454-
// If the '-T' option is provided, load the partition table from
455-
// the CSV or binary file at the specified path.
456-
let partition_table = if let Some(partition_table_path) = partition_table_path {
457-
let path = fs::canonicalize(partition_table_path).into_diagnostic()?;
458-
let data = fs::read(path)
459-
.into_diagnostic()
460-
.wrap_err("Failed to open partition table")?;
461-
462-
let table = PartitionTable::try_from(data).into_diagnostic()?;
463-
464-
Some(table)
465-
} else {
466-
None
467-
};
468-
469431
// To get a chip revision, the connection is needed
470432
// For simplicity, the revision None is used
471-
let image = chip.into_target().get_flash_image(
472-
&image,
473-
bootloader,
474-
partition_table,
475-
target_app_partition,
476-
image_format,
477-
None,
478-
min_rev_full,
479-
flash_mode,
480-
flash_size,
481-
flash_freq,
482-
partition_table_offset,
483-
)?;
433+
let image = chip
434+
.into_target()
435+
.get_flash_image(&image, flash_data.clone(), None)?;
484436

485437
display_image_size(image.app_size(), image.part_size());
486438

@@ -505,25 +457,16 @@ pub fn save_elf_as_image(
505457
// Take flash_size as input parameter, if None, use default value of 4Mb
506458
let padding_bytes = vec![
507459
0xffu8;
508-
flash_size.unwrap_or_default().size() as usize
460+
flash_data.flash_settings.size.unwrap_or_default().size()
461+
as usize
509462
- file.metadata().into_diagnostic()?.len() as usize
510463
];
511464
file.write_all(&padding_bytes).into_diagnostic()?;
512465
}
513466
} else {
514-
let image = chip.into_target().get_flash_image(
515-
&image,
516-
None,
517-
None,
518-
None,
519-
image_format,
520-
None,
521-
min_rev_full,
522-
flash_mode,
523-
flash_size,
524-
flash_freq,
525-
partition_table_offset,
526-
)?;
467+
let image = chip
468+
.into_target()
469+
.get_flash_image(&image, flash_data, None)?;
527470

528471
display_image_size(image.app_size(), image.part_size());
529472

@@ -629,42 +572,11 @@ pub fn erase_region(args: EraseRegionArgs, config: &Config) -> Result<()> {
629572
pub fn flash_elf_image(
630573
flasher: &mut Flasher,
631574
elf_data: &[u8],
632-
bootloader: Option<&Path>,
633-
partition_table: Option<PartitionTable>,
634-
target_app_partition: Option<String>,
635-
image_format: Option<ImageFormatKind>,
636-
flash_mode: Option<FlashMode>,
637-
flash_size: Option<FlashSize>,
638-
flash_freq: Option<FlashFrequency>,
639-
partition_table_offset: Option<u32>,
640-
min_rev_full: u16,
575+
flash_data: FlashData,
641576
) -> Result<()> {
642-
// If the '--bootloader' option is provided, load the binary file at the
643-
// specified path.
644-
let bootloader = if let Some(path) = bootloader {
645-
let path = fs::canonicalize(path).into_diagnostic()?;
646-
let data = fs::read(path).into_diagnostic()?;
647-
648-
Some(data)
649-
} else {
650-
None
651-
};
652-
653577
// Load the ELF data, optionally using the provider bootloader/partition
654578
// table/image format, to the device's flash memory.
655-
flasher.load_elf_to_flash_with_format(
656-
elf_data,
657-
bootloader,
658-
partition_table,
659-
target_app_partition,
660-
image_format,
661-
flash_mode,
662-
flash_size,
663-
flash_freq,
664-
partition_table_offset,
665-
min_rev_full,
666-
Some(&mut EspflashProgress::default()),
667-
)?;
579+
flasher.load_elf_to_flash(elf_data, flash_data, Some(&mut EspflashProgress::default()))?;
668580
info!("Flashing has completed!");
669581

670582
Ok(())

0 commit comments

Comments
 (0)