Skip to content

Commit 39fbdac

Browse files
author
Joseph Ross
authored
Add --target-app-partition argument to flash command (#461)
* Add `--target-app-partition` argument to flash command. (For #459) # Conflicts: # cargo-espflash/src/main.rs # espflash/src/bin/espflash.rs # espflash/src/cli/mod.rs # espflash/src/flasher/mod.rs # espflash/src/image_format/idf_bootloader.rs # espflash/src/targets/esp32.rs # espflash/src/targets/esp32c2.rs # espflash/src/targets/esp32c3.rs # espflash/src/targets/esp32c6.rs # espflash/src/targets/esp32h2.rs # espflash/src/targets/esp32s2.rs # espflash/src/targets/esp32s3.rs # espflash/src/targets/esp8266.rs # espflash/src/targets/mod.rs * Update CHANGELOG.md
1 parent eaf14ae commit 39fbdac

File tree

16 files changed

+74
-14
lines changed

16 files changed

+74
-14
lines changed

CHANGELOG.md

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

1212
- Read esp-println generated defmt messages (#466)
13+
- Add --target-app-partition argument to flash command (#461)
1314

1415
### Fixed
1516

cargo-espflash/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
323323
&elf_data,
324324
bootloader,
325325
partition_table,
326+
args.flash_args.target_app_partition,
326327
args.flash_args.format.or(metadata.format),
327328
args.build_args.flash_config_args.flash_mode,
328329
args.build_args.flash_config_args.flash_size,
@@ -564,6 +565,7 @@ fn save_image(args: SaveImageArgs) -> Result<()> {
564565
args.save_image_args.merge,
565566
bootloader,
566567
partition_table,
568+
args.save_image_args.target_app_partition,
567569
args.save_image_args.skip_padding,
568570
)?;
569571

espflash/src/bin/espflash.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
245245
&elf_data,
246246
bootloader,
247247
partition_table,
248+
args.flash_args.target_app_partition,
248249
args.flash_args.format,
249250
args.flash_config_args.flash_mode,
250251
args.flash_config_args.flash_size,
@@ -307,6 +308,7 @@ fn save_image(args: SaveImageArgs) -> Result<()> {
307308
args.save_image_args.merge,
308309
args.save_image_args.bootloader,
309310
args.save_image_args.partition_table,
311+
args.save_image_args.target_app_partition,
310312
args.save_image_args.skip_padding,
311313
)?;
312314

espflash/src/cli/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ pub struct FlashArgs {
135135
/// Path to a CSV file containing partition table
136136
#[arg(long, value_name = "FILE")]
137137
pub partition_table: Option<PathBuf>,
138+
/// Label of target app partition
139+
#[arg(long, value_name = "LABEL")]
140+
pub target_app_partition: Option<String>,
138141
/// Load the application to RAM instead of Flash
139142
#[arg(long)]
140143
pub ram: bool,
@@ -178,6 +181,9 @@ pub struct SaveImageArgs {
178181
/// Custom partition table for merging
179182
#[arg(long, short = 'T', requires = "merge", value_name = "FILE")]
180183
pub partition_table: Option<PathBuf>,
184+
/// Label of target app partition
185+
#[arg(long, value_name = "LABEL")]
186+
pub target_app_partition: Option<String>,
181187
/// Don't pad the image to the flash size
182188
#[arg(long, short = 'P', requires = "merge")]
183189
pub skip_padding: bool,
@@ -325,6 +331,7 @@ pub fn save_elf_as_image(
325331
merge: bool,
326332
bootloader_path: Option<PathBuf>,
327333
partition_table_path: Option<PathBuf>,
334+
target_app_partition: Option<String>,
328335
skip_padding: bool,
329336
) -> Result<()> {
330337
let image = ElfFirmwareImage::try_from(elf_data)?;
@@ -366,6 +373,7 @@ pub fn save_elf_as_image(
366373
&image,
367374
bootloader,
368375
partition_table,
376+
target_app_partition,
369377
image_format,
370378
None,
371379
flash_mode,
@@ -406,6 +414,7 @@ pub fn save_elf_as_image(
406414
&image,
407415
None,
408416
None,
417+
None,
409418
image_format,
410419
None,
411420
flash_mode,
@@ -519,6 +528,7 @@ pub fn flash_elf_image(
519528
elf_data: &[u8],
520529
bootloader: Option<&Path>,
521530
partition_table: Option<PartitionTable>,
531+
target_app_partition: Option<String>,
522532
image_format: Option<ImageFormatKind>,
523533
flash_mode: Option<FlashMode>,
524534
flash_size: Option<FlashSize>,
@@ -541,6 +551,7 @@ pub fn flash_elf_image(
541551
elf_data,
542552
bootloader,
543553
partition_table,
554+
target_app_partition,
544555
image_format,
545556
flash_mode,
546557
flash_size,

espflash/src/error.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ use crate::{
2222
#[derive(Debug, Diagnostic, Error)]
2323
#[non_exhaustive]
2424
pub enum Error {
25+
#[error("App partition not found")]
26+
#[diagnostic(code(espflash::app_partition_not_found))]
27+
AppPartitionNotFound,
28+
2529
#[error("Operation was cancelled by the user")]
2630
#[diagnostic(code(espflash::cancelled))]
2731
Cancelled,

espflash/src/flasher/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,7 @@ impl Flasher {
769769
elf_data: &[u8],
770770
bootloader: Option<Vec<u8>>,
771771
partition_table: Option<PartitionTable>,
772+
target_app_partition: Option<String>,
772773
image_format: Option<ImageFormatKind>,
773774
flash_mode: Option<FlashMode>,
774775
flash_size: Option<FlashSize>,
@@ -796,6 +797,7 @@ impl Flasher {
796797
&image,
797798
bootloader,
798799
partition_table,
800+
target_app_partition,
799801
image_format,
800802
chip_revision,
801803
flash_mode,
@@ -844,6 +846,7 @@ impl Flasher {
844846
elf_data: &[u8],
845847
bootloader: Option<Vec<u8>>,
846848
partition_table: Option<PartitionTable>,
849+
target_app_partition: Option<String>,
847850
flash_mode: Option<FlashMode>,
848851
flash_size: Option<FlashSize>,
849852
flash_freq: Option<FlashFrequency>,
@@ -853,6 +856,7 @@ impl Flasher {
853856
elf_data,
854857
bootloader,
855858
partition_table,
859+
target_app_partition,
856860
None,
857861
flash_mode,
858862
flash_size,

espflash/src/image_format/idf_bootloader.rs

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::{borrow::Cow, io::Write, iter::once, mem::size_of};
22

33
use bytemuck::{bytes_of, from_bytes};
4-
use esp_idf_part::{PartitionTable, Type};
4+
use esp_idf_part::{Partition, PartitionTable, Type};
55
use sha2::{Digest, Sha256};
66

77
use crate::{
@@ -35,6 +35,7 @@ impl<'a> IdfBootloaderFormat<'a> {
3535
chip: Chip,
3636
params: Esp32Params,
3737
partition_table: Option<PartitionTable>,
38+
target_app_partition: Option<String>,
3839
bootloader: Option<Vec<u8>>,
3940
flash_mode: Option<FlashMode>,
4041
flash_size: Option<FlashSize>,
@@ -144,17 +145,27 @@ impl<'a> IdfBootloaderFormat<'a> {
144145
let hash = hasher.finalize();
145146
data.write_all(&hash)?;
146147

147-
// The default partition table contains the "factory" partition, and if a user
148-
// provides a partition table via command-line then the validation step confirms
149-
// that at least one "app" partition is present. We prefer the "factory"
150-
// partition, and use any available "app" partitions if not present.
151-
let factory_partition = partition_table
152-
.find("factory")
153-
.or_else(|| partition_table.find_by_type(Type::App))
154-
.unwrap();
148+
let target_app_partition: &Partition =
149+
// Use the target app partition if provided
150+
if let Some(target_partition) = target_app_partition {
151+
partition_table
152+
.find(&target_partition)
153+
.ok_or(Error::AppPartitionNotFound)?
154+
} else {
155+
156+
// The default partition table contains the "factory" partition, and if a user
157+
// provides a partition table via command-line then the validation step confirms
158+
// that at least one "app" partition is present. We prefer the "factory"
159+
// partition, and use any available "app" partitions if not present.
160+
161+
partition_table
162+
.find("factory")
163+
.or_else(|| partition_table.find_by_type(Type::App))
164+
.ok_or(Error::AppPartitionNotFound)?
165+
};
155166

156167
let app_size = data.len() as u32;
157-
let part_size = factory_partition.size();
168+
let part_size = target_app_partition.size();
158169

159170
// The size of the application must not exceed the size of the factory
160171
// partition.
@@ -163,7 +174,7 @@ impl<'a> IdfBootloaderFormat<'a> {
163174
}
164175

165176
let flash_segment = RomSegment {
166-
addr: factory_partition.offset(),
177+
addr: target_app_partition.offset(),
167178
data: Cow::Owned(data),
168179
};
169180

@@ -313,9 +324,18 @@ pub mod tests {
313324
let expected_bin = fs::read("tests/resources/esp32_hal_blinky.bin").unwrap();
314325

315326
let image = ElfFirmwareImage::try_from(input_bytes.as_slice()).unwrap();
316-
let flash_image =
317-
IdfBootloaderFormat::new(&image, Chip::Esp32, PARAMS, None, None, None, None, None)
318-
.unwrap();
327+
let flash_image = IdfBootloaderFormat::new(
328+
&image,
329+
Chip::Esp32,
330+
PARAMS,
331+
None,
332+
None,
333+
None,
334+
None,
335+
None,
336+
None,
337+
)
338+
.unwrap();
319339

320340
let segments = flash_image.flash_segments().collect::<Vec<_>>();
321341
assert_eq!(segments.len(), 3);

espflash/src/targets/esp32.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ impl Target for Esp32 {
155155
image: &'a dyn FirmwareImage<'a>,
156156
bootloader: Option<Vec<u8>>,
157157
partition_table: Option<PartitionTable>,
158+
target_app_partition: Option<String>,
158159
image_format: Option<ImageFormatKind>,
159160
_chip_revision: Option<(u32, u32)>,
160161
flash_mode: Option<FlashMode>,
@@ -169,6 +170,7 @@ impl Target for Esp32 {
169170
Chip::Esp32,
170171
PARAMS,
171172
partition_table,
173+
target_app_partition,
172174
bootloader,
173175
flash_mode,
174176
flash_size,

espflash/src/targets/esp32c2.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ impl Target for Esp32c2 {
8989
image: &'a dyn FirmwareImage<'a>,
9090
bootloader: Option<Vec<u8>>,
9191
partition_table: Option<PartitionTable>,
92+
target_app_partition: Option<String>,
9293
image_format: Option<ImageFormatKind>,
9394
_chip_revision: Option<(u32, u32)>,
9495
flash_mode: Option<FlashMode>,
@@ -103,6 +104,7 @@ impl Target for Esp32c2 {
103104
Chip::Esp32c2,
104105
PARAMS,
105106
partition_table,
107+
target_app_partition,
106108
bootloader,
107109
flash_mode,
108110
flash_size,

espflash/src/targets/esp32c3.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ impl Target for Esp32c3 {
7676
image: &'a dyn FirmwareImage<'a>,
7777
bootloader: Option<Vec<u8>>,
7878
partition_table: Option<PartitionTable>,
79+
target_app_partition: Option<String>,
7980
image_format: Option<ImageFormatKind>,
8081
chip_revision: Option<(u32, u32)>,
8182
flash_mode: Option<FlashMode>,
@@ -90,6 +91,7 @@ impl Target for Esp32c3 {
9091
Chip::Esp32c3,
9192
PARAMS,
9293
partition_table,
94+
target_app_partition,
9395
bootloader,
9496
flash_mode,
9597
flash_size,

0 commit comments

Comments
 (0)