From e65162249db5f880edc9d2ac2e18e4c5ddd6653d Mon Sep 17 00:00:00 2001 From: rhetenor Date: Sat, 29 Aug 2026 14:43:15 +0000 Subject: [PATCH] fix flash initialization by erasing flash before writing --- src/storage/cardstore.rs | 4 ++-- src/storage/store.rs | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/storage/cardstore.rs b/src/storage/cardstore.rs index db4fe20..44ff686 100644 --- a/src/storage/cardstore.rs +++ b/src/storage/cardstore.rs @@ -183,7 +183,7 @@ impl CardStore { log::debug!("writing RawCard to flash"); let mut serialized_card: [u8; RawCard::SERIALIZED_SIZE] = [0; RawCard::SERIALIZED_SIZE]; raw_card.binary_serialize(&mut serialized_card, Endianness::Little); - self.store.write( + self.store.write_erase( CARDS_REGION.offset + entry.offset * RawCard::SERIALIZED_SIZE as u32, &mut serialized_card, )?; @@ -198,7 +198,7 @@ impl CardStore { let mut serialized_entry: [u8; AllocationTableEntry::SERIALIZED_SIZE] = [0; AllocationTableEntry::SERIALIZED_SIZE]; entry.binary_serialize(&mut serialized_entry, Endianness::Little); - self.store.write( + self.store.write_erase( ALLOCATION_TABLE_REGION.offset + entry.offset * AllocationTableEntry::SERIALIZED_SIZE as u32, &mut serialized_entry, diff --git a/src/storage/store.rs b/src/storage/store.rs index c9702db..42f18bf 100644 --- a/src/storage/store.rs +++ b/src/storage/store.rs @@ -3,13 +3,12 @@ use embedded_storage::nor_flash::ReadNorFlash; use esp_storage::{FlashStorage, FlashStorageError}; use crate::storage::MAGIC_REGION; -use crate::storage::cardstore::COUNT_REGION; pub type StoreError = FlashStorageError; const FLASH_ADDR: u32 = 0x9000; -const INITIALIZATION_SIZE: usize = COUNT_REGION.end(); +const INITIALIZATION_SIZE: usize = 0x1000; const FLASH_INITIALIZE_MAGIC: u32 = 0xde6de6de; pub struct Store { @@ -43,7 +42,17 @@ impl Store { self.storage.write(FLASH_ADDR + offset, bytes) } - fn has_magic_bytes(storage: &mut FlashStorage) -> Result { + pub fn write_erase(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), StoreError> { + log::debug!( + "Erasing and Writing {} bytes at offset 0x{offset:08x}", + bytes.len() + ); + self.storage + .erase(FLASH_ADDR + offset, FLASH_ADDR + bytes.len() as u32)?; + self.storage.write(FLASH_ADDR + offset, bytes) + } + + pub fn has_magic_bytes(storage: &mut FlashStorage) -> Result { let mut magic: [u8; 4] = [0, 0, 0, 0]; storage.read(FLASH_ADDR + MAGIC_REGION.offset, &mut magic)?; log::debug!("Magic bytes are {magic:?}"); @@ -51,9 +60,10 @@ impl Store { Ok(u32::from_ne_bytes(magic) == FLASH_INITIALIZE_MAGIC) } - fn initialize_flash(storage: &mut FlashStorage) -> Result<(), StoreError> { + pub fn initialize_flash(storage: &mut FlashStorage) -> Result<(), StoreError> { + storage.erase(FLASH_ADDR, FLASH_ADDR + INITIALIZATION_SIZE as u32)?; let zeros: [u8; INITIALIZATION_SIZE] = [0; INITIALIZATION_SIZE]; - storage.write(FLASH_ADDR, &zeros)?; + storage.write(FLASH_ADDR + MAGIC_REGION.end() as u32, &zeros)?; storage.write( FLASH_ADDR + MAGIC_REGION.offset, &FLASH_INITIALIZE_MAGIC.to_ne_bytes(),