From 1412e1b7d14fe36f4d30ddca06261992d4dda4e2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 14 Jan 2025 01:21:20 +0100 Subject: [PATCH] bootloader tweak --- bootloader/README.md | 5 ++--- bootloader/src/main.rs | 12 ++++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/bootloader/README.md b/bootloader/README.md index 3e2918f..6b8b409 100644 --- a/bootloader/README.md +++ b/bootloader/README.md @@ -36,9 +36,8 @@ The bootloader performs the following steps: 1. The application will calculate the checksum of itself if the bootloader CRC is blank (all zeroes or all ones). If the CRC is not blank and the checksum check fails, it will immediately boot application image A. Otherwise, it proceeds to the next step. -2. Read the boot slot from a reserved section at the end of the EEPROM. It is assumed that the full - 128 kB are copied from the ST EEPROM to the code RAM at startup. The boot slot is read from - the code RAM directly. +2. Read the boot slot from a reserved section at the end of the EEPROM. If no valid value is read, + select boot slot A. 3. Check the checksum of the boot slot. If that checksum is valid, it will boot that slot. If not, it will proceed to the next step. 4. Check the checksum of the other slot . If that checksum is valid, it will boot that slot. If diff --git a/bootloader/src/main.rs b/bootloader/src/main.rs index 4df8675..dd8a028 100644 --- a/bootloader/src/main.rs +++ b/bootloader/src/main.rs @@ -158,14 +158,10 @@ fn main() -> ! { // Check bootloader's CRC (and write it if blank) check_own_crc(&dp.sysconfig, &cp, &mut nvm, &mut timer); - // This is technically read from the EEPROM. We assume that the full 128 kB were copied - // from the EEPROM to the code RAM and read the boot slot from the code ram directly. - let preferred_app = AppSel::try_from(unsafe { - (PREFERRED_SLOT_OFFSET as *const u8) - .read_unaligned() - .to_be() - }) - .unwrap_or(AppSel::A); + let mut preferred_app_raw = [0; 1]; + nvm.read(PREFERRED_SLOT_OFFSET as usize, &mut preferred_app_raw) + .expect("reading preferred slot failed"); + let preferred_app = AppSel::try_from(preferred_app_raw[0]).unwrap_or(AppSel::A); let other_app = if preferred_app == AppSel::A { AppSel::B } else {