flash_store: get addresses from linker
Reviewed-on: #49 Co-Authored-By: topquark12 <aw@m-labs.hk> Co-Committed-By: topquark12 <aw@m-labs.hk>
This commit is contained in:
parent
f6802635a4
commit
cf3ace4d2d
4
memory.x
4
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);
|
||||
|
@ -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 }
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user