From 567e2587cc0562ace74505ee3e9d53585e1e5f6c Mon Sep 17 00:00:00 2001 From: Samuel Tardieu <sam@rfc1149.net> Date: Sat, 16 Nov 2024 00:49:07 +0100 Subject: [PATCH] Add firmware-updater flash --skip-firmware-version-check --- firmware-updater/src/cli.rs | 3 +++ firmware-updater/src/main.rs | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/firmware-updater/src/cli.rs b/firmware-updater/src/cli.rs index 6b15114..cf85517 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 5008987..da22922 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 { -- GitLab