This commit is contained in:
Robin Müller 2024-09-27 19:55:16 +02:00
parent a1a5156caf
commit ea35221d41
Signed by: muellerr
GPG Key ID: A649FB78196E3849
4 changed files with 13 additions and 17 deletions

View File

@ -4,7 +4,7 @@ use core::convert::Infallible;
/// Simple trait which makes swapping the NVM easier. NVMs only need to implement this interface. /// Simple trait which makes swapping the NVM easier. NVMs only need to implement this interface.
pub trait NvmInterface { pub trait NvmInterface {
fn write(&mut self, address: u32, data: &[u8]) -> Result<(), Infallible>; fn write(&mut self, address: usize, data: &[u8]) -> Result<(), Infallible>;
fn read(&mut self, address: u32, buf: &mut [u8]) -> Result<(), Infallible>; fn read(&mut self, address: usize, buf: &mut [u8]) -> Result<(), Infallible>;
fn verify(&mut self, address: u32, data: &[u8]) -> Result<bool, Infallible>; fn verify(&mut self, address: usize, data: &[u8]) -> Result<bool, Infallible>;
} }

View File

@ -78,15 +78,15 @@ pub struct NvmWrapper(pub M95M01);
// Newtype pattern. We could now more easily swap the used NVM type. // Newtype pattern. We could now more easily swap the used NVM type.
impl NvmInterface for NvmWrapper { impl NvmInterface for NvmWrapper {
fn write(&mut self, address: u32, data: &[u8]) -> Result<(), core::convert::Infallible> { fn write(&mut self, address: usize, data: &[u8]) -> Result<(), core::convert::Infallible> {
self.0.write(address, data) self.0.write(address, data)
} }
fn read(&mut self, address: u32, buf: &mut [u8]) -> Result<(), core::convert::Infallible> { fn read(&mut self, address: usize, buf: &mut [u8]) -> Result<(), core::convert::Infallible> {
self.0.read(address, buf) self.0.read(address, buf)
} }
fn verify(&mut self, address: u32, data: &[u8]) -> Result<bool, core::convert::Infallible> { fn verify(&mut self, address: usize, data: &[u8]) -> Result<bool, core::convert::Infallible> {
self.0.verify(address, data) self.0.verify(address, data)
} }
} }
@ -133,9 +133,9 @@ fn main() -> ! {
} }
} }
nvm.write(BOOTLOADER_CRC_ADDR, &bootloader_crc.to_be_bytes()) nvm.write(BOOTLOADER_CRC_ADDR as usize, &bootloader_crc.to_be_bytes())
.expect("writing CRC failed"); .expect("writing CRC failed");
if let Err(e) = nvm.verify(BOOTLOADER_CRC_ADDR, &bootloader_crc.to_be_bytes()) { if let Err(e) = nvm.verify(BOOTLOADER_CRC_ADDR as usize, &bootloader_crc.to_be_bytes()) {
if RTT_PRINTOUT { if RTT_PRINTOUT {
rprintln!( rprintln!(
"error: CRC verification for bootloader self-flash failed: {:?}", "error: CRC verification for bootloader self-flash failed: {:?}",
@ -185,7 +185,7 @@ fn check_own_crc(sysconfig: &pac::Sysconfig, cp: &cortex_m::Peripherals, nvm: &m
rprintln!("BL CRC blank - prog new CRC"); rprintln!("BL CRC blank - prog new CRC");
} }
// Blank CRC, write it to NVM. // Blank CRC, write it to NVM.
nvm.write(BOOTLOADER_CRC_ADDR, &crc_calc.to_be_bytes()) nvm.write(BOOTLOADER_CRC_ADDR as usize, &crc_calc.to_be_bytes())
.expect("writing CRC failed"); .expect("writing CRC failed");
// The Vorago bootloader resets here. I am not sure why this is done but I think it is // The Vorago bootloader resets here. I am not sure why this is done but I think it is
// necessary because somehow the boot will not work if we just continue as usual. // necessary because somehow the boot will not work if we just continue as usual.

View File

@ -324,12 +324,12 @@ mod app {
let mut buf = [0u8; 4]; let mut buf = [0u8; 4];
cx.local cx.local
.nvm .nvm
.read(base_addr + 32, &mut buf) .read(base_addr as usize + 32, &mut buf)
.expect("reading from NVM failed"); .expect("reading from NVM failed");
buf[0] += 1; buf[0] += 1;
cx.local cx.local
.nvm .nvm
.write(base_addr + 32, &buf) .write(base_addr as usize + 32, &buf)
.expect("writing to NVM failed"); .expect("writing to NVM failed");
let tm = cx let tm = cx
.local .local
@ -405,7 +405,7 @@ mod app {
); );
cx.local cx.local
.nvm .nvm
.write(offset, data) .write(offset as usize, data)
.expect("writing to NVM failed"); .expect("writing to NVM failed");
let tm = cx let tm = cx
.local .local

View File

@ -1,10 +1,6 @@
//! Example application which interfaces with the boot EEPROM. //! Example application which interfaces with the boot EEPROM.
#![no_main] #![no_main]
#![no_std] #![no_std]
use core::fmt::write;
use cortex_m::{asm, register::control::read};
use cortex_m_rt::entry; use cortex_m_rt::entry;
use embedded_hal::delay::DelayNs; use embedded_hal::delay::DelayNs;
use panic_rtt_target as _; use panic_rtt_target as _;
@ -51,7 +47,7 @@ fn main() -> ! {
nvm.read(PAGE_SIZE - 2, &mut read_buf[0..8]).unwrap(); nvm.read(PAGE_SIZE - 2, &mut read_buf[0..8]).unwrap();
assert_eq!(&read_buf[0..8], &write_buf[0..8]); assert_eq!(&read_buf[0..8], &write_buf[0..8]);
nvm.write(0, &orig_content); nvm.write(0, &orig_content).unwrap();
loop { loop {
timer.delay_ms(500); timer.delay_ms(500);
} }