diff --git a/firmware-updater/src/cli.rs b/firmware-updater/src/cli.rs index 6b151141e994b362108217eed36283040b3f06d3..cf855176f2009701f63b7cdfb4b75d529f78c657 100644 --- a/firmware-updater/src/cli.rs +++ b/firmware-updater/src/cli.rs @@ -43,6 +43,9 @@ pub struct FlashArgs { /// Do not program (verify only) #[clap(short, long, conflicts_with = "no_verify")] pub no_program: bool, + /// Do not try to initially read the current firmware version + #[clap(long)] + pub skip_firmware_version_check: bool, /// I²C bus to use #[clap(short, long, default_value = "8")] pub i2c_bus: u8, diff --git a/firmware-updater/src/main.rs b/firmware-updater/src/main.rs index 5008987756d388ab53180fcd9f4b2238067773b5..da22922955e0ebd0a0816bd96b1c8d8b6a7b21e2 100644 --- a/firmware-updater/src/main.rs +++ b/firmware-updater/src/main.rs @@ -6,6 +6,7 @@ use elf::ParseError; use elf_loader::Firmware; use indicatif::{HumanBytes, MultiProgress, ProgressBar, ProgressFinish, ProgressStyle}; use rppal::i2c::{self, I2c}; +use semver::Version; use std::{borrow::Cow, fmt::Debug, sync::LazyLock, thread, time::Duration}; use tele0592::{device, Bootloader as _, Device as _}; @@ -123,13 +124,21 @@ fn cmd_flash(args: &FlashArgs) -> Result<()> { let firmware = check_success(&bar, || Firmware::load(&args.firmware))?; // Switch to bootloader mode - let bar = bars.add(msg("Checking running program")); - let (mut i2c, program) = check_success(&bar, || { - let mut i2c = I2c::with_bus(args.i2c_bus)?; - let program = bootloader::active_program(&mut i2c)?; - Ok::<_, Error>((i2c, program)) - })?; - bar.set_message(format!("Checking running program: {program}")); + let mut i2c = I2c::with_bus(args.i2c_bus)?; + let program = if args.skip_firmware_version_check { + ActiveProgram::Controller { + version: Version::parse("0.0.0").unwrap(), + bootloader: true, + } + } else { + let bar = bars.add(msg("Checking running program")); + let program = check_success(&bar, || { + let program = bootloader::active_program(&mut i2c)?; + Ok::<_, Error>(program) + })?; + bar.set_message(format!("Checking running program: {program}")); + program + }; match program { ActiveProgram::Bootloader { .. } => {} ActiveProgram::Controller {