From cf3ace4d2d3570b338cc9a50c7aecba8a8b8ff4b Mon Sep 17 00:00:00 2001 From: topquark12 Date: Wed, 13 Jan 2021 17:30:12 +0800 Subject: [PATCH] flash_store: get addresses from linker Reviewed-on: https://git.m-labs.hk/M-Labs/thermostat/pulls/49 Co-Authored-By: topquark12 Co-Committed-By: topquark12 --- memory.x | 4 +++- src/flash_store.rs | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/memory.x b/memory.x index c0ae171..c4751ec 100644 --- a/memory.x +++ b/memory.x @@ -11,5 +11,7 @@ MEMORY CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K } -_stack_start = ORIGIN(CCMRAM) + LENGTH(CCMRAM); +_flash_start = ORIGIN(FLASH); +_config_start = ORIGIN(CONFIG); _dfu_msg = ORIGIN(DFU_MSG); +_stack_start = ORIGIN(CCMRAM) + LENGTH(CCMRAM); diff --git a/src/flash_store.rs b/src/flash_store.rs index f69e534..ef9f651 100644 --- a/src/flash_store.rs +++ b/src/flash_store.rs @@ -8,18 +8,29 @@ use sfkv::{Store, StoreBackend}; /// 16 KiB pub const FLASH_SECTOR_SIZE: usize = 0x4000; pub const FLASH_SECTOR: u8 = 12; -pub const FLASH_SECTOR_OFFSET: usize = 0x10_0000; static mut BACKUP_SPACE: [u8; FLASH_SECTOR_SIZE] = [0; FLASH_SECTOR_SIZE]; +extern "C" { + // These are from memory.x + static _config_start: usize; + static _flash_start: usize; +} + pub struct FlashBackend { flash: FLASH, } +fn get_offset() -> usize { + unsafe { + (&_config_start as *const usize as usize) - (&_flash_start as *const usize as usize) + } +} + impl StoreBackend for FlashBackend { type Data = [u8]; fn data(&self) -> &Self::Data { - &self.flash.read()[FLASH_SECTOR_OFFSET..(FLASH_SECTOR_OFFSET + FLASH_SECTOR_SIZE)] + &self.flash.read()[get_offset()..(get_offset() + FLASH_SECTOR_SIZE)] } type Error = Error; @@ -30,10 +41,9 @@ impl StoreBackend for FlashBackend { fn program(&mut self, offset: usize, payload: &[u8]) -> Result<(), Self::Error> { self.flash.unlocked() - .program(FLASH_SECTOR_OFFSET + offset, payload.iter().cloned()) + .program(get_offset() + offset, payload.iter().cloned()) } - fn backup_space(&self) -> &'static mut [u8] { unsafe { &mut BACKUP_SPACE } }