fix flash initialization by erasing flash before writing
This commit is contained in:
@@ -183,7 +183,7 @@ impl CardStore {
|
|||||||
log::debug!("writing RawCard to flash");
|
log::debug!("writing RawCard to flash");
|
||||||
let mut serialized_card: [u8; RawCard::SERIALIZED_SIZE] = [0; RawCard::SERIALIZED_SIZE];
|
let mut serialized_card: [u8; RawCard::SERIALIZED_SIZE] = [0; RawCard::SERIALIZED_SIZE];
|
||||||
raw_card.binary_serialize(&mut serialized_card, Endianness::Little);
|
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,
|
CARDS_REGION.offset + entry.offset * RawCard::SERIALIZED_SIZE as u32,
|
||||||
&mut serialized_card,
|
&mut serialized_card,
|
||||||
)?;
|
)?;
|
||||||
@@ -198,7 +198,7 @@ impl CardStore {
|
|||||||
let mut serialized_entry: [u8; AllocationTableEntry::SERIALIZED_SIZE] =
|
let mut serialized_entry: [u8; AllocationTableEntry::SERIALIZED_SIZE] =
|
||||||
[0; AllocationTableEntry::SERIALIZED_SIZE];
|
[0; AllocationTableEntry::SERIALIZED_SIZE];
|
||||||
entry.binary_serialize(&mut serialized_entry, Endianness::Little);
|
entry.binary_serialize(&mut serialized_entry, Endianness::Little);
|
||||||
self.store.write(
|
self.store.write_erase(
|
||||||
ALLOCATION_TABLE_REGION.offset
|
ALLOCATION_TABLE_REGION.offset
|
||||||
+ entry.offset * AllocationTableEntry::SERIALIZED_SIZE as u32,
|
+ entry.offset * AllocationTableEntry::SERIALIZED_SIZE as u32,
|
||||||
&mut serialized_entry,
|
&mut serialized_entry,
|
||||||
|
|||||||
+15
-5
@@ -3,13 +3,12 @@ use embedded_storage::nor_flash::ReadNorFlash;
|
|||||||
use esp_storage::{FlashStorage, FlashStorageError};
|
use esp_storage::{FlashStorage, FlashStorageError};
|
||||||
|
|
||||||
use crate::storage::MAGIC_REGION;
|
use crate::storage::MAGIC_REGION;
|
||||||
use crate::storage::cardstore::COUNT_REGION;
|
|
||||||
|
|
||||||
pub type StoreError = FlashStorageError;
|
pub type StoreError = FlashStorageError;
|
||||||
|
|
||||||
const FLASH_ADDR: u32 = 0x9000;
|
const FLASH_ADDR: u32 = 0x9000;
|
||||||
|
|
||||||
const INITIALIZATION_SIZE: usize = COUNT_REGION.end();
|
const INITIALIZATION_SIZE: usize = 0x1000;
|
||||||
const FLASH_INITIALIZE_MAGIC: u32 = 0xde6de6de;
|
const FLASH_INITIALIZE_MAGIC: u32 = 0xde6de6de;
|
||||||
|
|
||||||
pub struct Store {
|
pub struct Store {
|
||||||
@@ -43,7 +42,17 @@ impl Store {
|
|||||||
self.storage.write(FLASH_ADDR + offset, bytes)
|
self.storage.write(FLASH_ADDR + offset, bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_magic_bytes(storage: &mut FlashStorage) -> Result<bool, StoreError> {
|
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<bool, StoreError> {
|
||||||
let mut magic: [u8; 4] = [0, 0, 0, 0];
|
let mut magic: [u8; 4] = [0, 0, 0, 0];
|
||||||
storage.read(FLASH_ADDR + MAGIC_REGION.offset, &mut magic)?;
|
storage.read(FLASH_ADDR + MAGIC_REGION.offset, &mut magic)?;
|
||||||
log::debug!("Magic bytes are {magic:?}");
|
log::debug!("Magic bytes are {magic:?}");
|
||||||
@@ -51,9 +60,10 @@ impl Store {
|
|||||||
Ok(u32::from_ne_bytes(magic) == FLASH_INITIALIZE_MAGIC)
|
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];
|
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(
|
storage.write(
|
||||||
FLASH_ADDR + MAGIC_REGION.offset,
|
FLASH_ADDR + MAGIC_REGION.offset,
|
||||||
&FLASH_INITIALIZE_MAGIC.to_ne_bytes(),
|
&FLASH_INITIALIZE_MAGIC.to_ne_bytes(),
|
||||||
|
|||||||
Reference in New Issue
Block a user