diff --git a/espflash/src/bin/espflash.rs b/espflash/src/bin/espflash.rs index c909390d..cce8b1f0 100644 --- a/espflash/src/bin/espflash.rs +++ b/espflash/src/bin/espflash.rs @@ -11,7 +11,7 @@ use espflash::{ self, board_info, completions, config::Config, connect, erase_partitions, flash_elf_image, monitor::monitor, parse_partition_table, partition_table, print_board_info, save_elf_as_image, serial_monitor, CompletionsArgs, ConnectArgs, EraseFlashArgs, - EspflashProgress, FlashConfigArgs, MonitorArgs, PartitionTableArgs, + ErasePartsArgs, EspflashProgress, FlashConfigArgs, MonitorArgs, PartitionTableArgs, }, image_format::ImageFormatKind, logging::initialize_logger, @@ -44,6 +44,8 @@ enum Commands { Completions(CompletionsArgs), /// Erase Flash entirely EraseFlash(EraseFlashArgs), + /// Erase specified partitions + EraseParts(ErasePartsArgs), /// Flash an application in ELF format to a connected target device /// /// Given a path to an ELF file, first convert it into the appropriate @@ -151,6 +153,7 @@ fn main() -> Result<()> { Commands::BoardInfo(args) => board_info(&args, &config), Commands::Completions(args) => completions(&args, &mut Cli::command(), "espflash"), Commands::EraseFlash(args) => erase_flash(args, &config), + Commands::EraseParts(args) => erase_parts(args, &config), Commands::Flash(args) => flash(args, &config), Commands::Monitor(args) => serial_monitor(args, &config), Commands::PartitionTable(args) => partition_table(args), @@ -167,6 +170,19 @@ fn erase_flash(args: EraseFlashArgs, config: &Config) -> Result<()> { Ok(()) } +fn erase_parts(args: ErasePartsArgs, config: &Config) -> Result<()> { + let mut flash = connect(&args.connect_args, config)?; + let partition_table = parse_partition_table(&args.partition_table)?; + erase_partitions( + &mut flash, + Some(partition_table), + Some(args.erase_parts), + None, + )?; + + Ok(()) +} + fn flash(args: FlashArgs, config: &Config) -> Result<()> { let mut flasher = connect(&args.connect_args, config)?; diff --git a/espflash/src/cli/mod.rs b/espflash/src/cli/mod.rs index 34aa46fb..b08e593b 100644 --- a/espflash/src/cli/mod.rs +++ b/espflash/src/cli/mod.rs @@ -162,6 +162,7 @@ pub struct MonitorArgs { connect_args: ConnectArgs, } +/// Erase entire flash of target device #[derive(Debug, Args)] pub struct EraseFlashArgs { /// Connection configuration @@ -169,6 +170,21 @@ pub struct EraseFlashArgs { pub connect_args: ConnectArgs, } +/// Erase named partitions based on provided partition table +#[derive(Debug, Args)] +pub struct ErasePartsArgs { + /// Connection configuration + #[clap(flatten)] + pub connect_args: ConnectArgs, + + #[arg(value_name = "LABELS", value_delimiter = ',')] + pub erase_parts: Vec, + + /// Input partition table + #[arg(long, value_name = "FILE")] + pub partition_table: PathBuf, +} + /// Select a serial port and establish a connection with a target device pub fn connect(args: &ConnectArgs, config: &Config) -> Result { let port_info = get_serial_port_info(args, config)?;