Skip to content

Commit

Permalink
feat: Add read_flash support to cargo-espflash
Browse files Browse the repository at this point in the history
  • Loading branch information
SergioGasquez committed Feb 1, 2024
1 parent e6c9445 commit df78f3e
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 49 deletions.
9 changes: 6 additions & 3 deletions cargo-espflash/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ use espflash::{
cli::{
self, board_info, checksum_md5, completions, config::Config, connect, erase_flash,
erase_partitions, erase_region, flash_elf_image, monitor::monitor, partition_table,
print_board_info, save_elf_as_image, serial_monitor, ChecksumMd5Args, CompletionsArgs,
ConnectArgs, EraseFlashArgs, EraseRegionArgs, EspflashProgress, FlashConfigArgs,
MonitorArgs, PartitionTableArgs,
print_board_info, read_flash, save_elf_as_image, serial_monitor, ChecksumMd5Args,
CompletionsArgs, ConnectArgs, EraseFlashArgs, EraseRegionArgs, EspflashProgress,
FlashConfigArgs, MonitorArgs, PartitionTableArgs, ReadFlashArgs,
},
error::Error as EspflashError,
flasher::{parse_partition_table, FlashData, FlashSettings},
Expand Down Expand Up @@ -100,6 +100,8 @@ enum Commands {
/// '--to-binary' options, plus the ability to print a partition table
/// in tabular format.
PartitionTable(PartitionTableArgs),
/// Read SPI flash content
ReadFlash(ReadFlashArgs),
/// Generate a binary application image and save it to a local disk
///
/// If the '--merge' option is used, then the bootloader, partition table,
Expand Down Expand Up @@ -219,6 +221,7 @@ fn main() -> Result<()> {
Commands::Flash(args) => flash(args, &config),
Commands::Monitor(args) => serial_monitor(args, &config),
Commands::PartitionTable(args) => partition_table(args),
Commands::ReadFlash(args) => read_flash(args, &config),
Commands::SaveImage(args) => save_image(args),
Commands::ChecksumMd5(args) => checksum_md5(&args, &config),
}
Expand Down
49 changes: 3 additions & 46 deletions espflash/src/bin/espflash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ use espflash::{
cli::{
self, board_info, checksum_md5, completions, config::Config, connect, erase_flash,
erase_partitions, erase_region, flash_elf_image, monitor::monitor, parse_uint32,
partition_table, print_board_info, save_elf_as_image, serial_monitor, ChecksumMd5Args,
CompletionsArgs, ConnectArgs, EraseFlashArgs, EraseRegionArgs, EspflashProgress,
FlashConfigArgs, MonitorArgs, PartitionTableArgs,
partition_table, print_board_info, read_flash, save_elf_as_image, serial_monitor,
ChecksumMd5Args, CompletionsArgs, ConnectArgs, EraseFlashArgs, EraseRegionArgs,
EspflashProgress, FlashConfigArgs, MonitorArgs, PartitionTableArgs, ReadFlashArgs,
},
error::Error,
flasher::{parse_partition_table, FlashData, FlashSettings},
Expand Down Expand Up @@ -121,31 +121,6 @@ struct FlashArgs {
image: PathBuf,
}

#[derive(Debug, Args)]
#[non_exhaustive]
pub struct ReadFlashArgs {
/// Offset to start reading from
#[arg(value_name = "OFFSET", value_parser = parse_uint32)]
pub addr: u32,
/// Size of each individual packet of data
///
/// Defaults to 0x1000 (FLASH_SECTOR_SIZE)
#[arg(long, default_value = "0x1000", value_parser = parse_uint32)]
pub block_size: u32,
/// Connection configuration
#[clap(flatten)]
connect_args: ConnectArgs,
/// Size of the region to erase
#[arg(value_name = "SIZE", value_parser = parse_uint32)]
pub size: u32,
/// Name of binary dump
#[arg(value_name = "FILE")]
pub file: PathBuf,
/// Maximum number of un-acked packets
#[arg(long, default_value = "64", value_parser = parse_uint32)]
pub max_in_flight: u32,
}

#[derive(Debug, Args)]
#[non_exhaustive]
struct SaveImageArgs {
Expand Down Expand Up @@ -322,24 +297,6 @@ fn flash(args: FlashArgs, config: &Config) -> Result<()> {
}
}

fn read_flash(args: ReadFlashArgs, config: &Config) -> Result<()> {
if args.connect_args.no_stub {
return Err(Error::StubRequired.into());
}

let mut flasher = connect(&args.connect_args, config, false, false)?;
print_board_info(&mut flasher)?;
flasher.read_flash(
args.addr,
args.size,
args.block_size,
args.max_in_flight,
args.file,
)?;

Ok(())
}

fn save_image(args: SaveImageArgs) -> Result<()> {
let elf_data = fs::read(&args.image)
.into_diagnostic()
Expand Down
45 changes: 45 additions & 0 deletions espflash/src/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,32 @@ pub struct PartitionTableArgs {
to_csv: bool,
}

/// Reads the content of flash memory and saves it to a file
#[derive(Debug, Args)]
#[non_exhaustive]
pub struct ReadFlashArgs {
/// Offset to start reading from
#[arg(value_name = "OFFSET", value_parser = parse_uint32)]
pub addr: u32,
/// Size of each individual packet of data
///
/// Defaults to 0x1000 (FLASH_SECTOR_SIZE)
#[arg(long, default_value = "0x1000", value_parser = parse_uint32)]
pub block_size: u32,
/// Connection configuration
#[clap(flatten)]
connect_args: ConnectArgs,
/// Size of the region to erase
#[arg(value_name = "SIZE", value_parser = parse_uint32)]
pub size: u32,
/// Name of binary dump
#[arg(value_name = "FILE")]
pub file: PathBuf,
/// Maximum number of un-acked packets
#[arg(long, default_value = "64", value_parser = parse_uint32)]
pub max_in_flight: u32,
}

/// Save the image to disk instead of flashing to device
#[derive(Debug, Args)]
#[non_exhaustive]
Expand Down Expand Up @@ -677,6 +703,25 @@ fn erase_partition(flasher: &mut Flasher, part: &Partition) -> Result<()> {
flasher.erase_region(offset, size).into_diagnostic()
}

/// Read flash content and write it to a file
pub fn read_flash(args: ReadFlashArgs, config: &Config) -> Result<()> {
if args.connect_args.no_stub {
return Err(Error::StubRequired.into());
}

let mut flasher = connect(&args.connect_args, config, false, false)?;
print_board_info(&mut flasher)?;
flasher.read_flash(
args.addr,
args.size,
args.block_size,
args.max_in_flight,
args.file,
)?;

Ok(())
}

/// Convert and display CSV and binary partition tables
pub fn partition_table(args: PartitionTableArgs) -> Result<()> {
if args.to_binary {
Expand Down

0 comments on commit df78f3e

Please sign in to comment.