From cd9999330a4b01c857b6120726e65371280bc0ae Mon Sep 17 00:00:00 2001 From: 9names <60134748+9names@users.noreply.github.com> Date: Fri, 2 Feb 2024 21:54:53 +1100 Subject: [PATCH 1/5] Add cmd to erase multiple sectors --- build.sh | 1 + src/algo.rs | 21 +++++++++++++++++++++ src/main.rs | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/build.sh b/build.sh index b0e5f67..33066dc 100755 --- a/build.sh +++ b/build.sh @@ -30,5 +30,6 @@ cat < Result<(), ErrorCode>; + /// Erase a number of sectors. May only be called after init() with FUNCTION_ERASE + fn erase_sectors(&mut self, addr: u32, qty: u32) -> Result<(), ErrorCode>; + /// Program bytes. May only be called after init() with FUNCTION_PROGRAM fn program_page(&mut self, addr: u32, size: u32, data: *const u8) -> Result<(), ErrorCode>; } @@ -102,6 +105,24 @@ macro_rules! algo { Err(e) => e.get(), } } + /// Erase a number of sectors on the flash chip. + /// Will use block erase commands when possible to improve performance + /// + /// # Safety + /// + /// Will erase the given sectors. Pass a valid sector address and valid range of sectors. + #[no_mangle] + #[link_section = ".entry"] + pub unsafe extern "C" fn EraseSectors(addr: u32, qty: u32) -> u32 { + if !_IS_INIT { + return 1; + } + let this = &mut *_ALGO_INSTANCE.as_mut_ptr(); + match <$type as FlashAlgo>::erase_sectors(this, addr, qty) { + Ok(()) => 0, + Err(e) => e.get(), + } + } /// Write to a page on the flash chip. /// /// # Safety diff --git a/src/main.rs b/src/main.rs index d181a73..d1b39fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,6 +80,12 @@ impl FlashAlgo for RP2040Algo { Ok(()) } + fn erase_sectors(&mut self, addr: u32, qty: u32) -> Result<(), ErrorCode> { + let erase_size = SECTOR_SIZE * qty; + (self.funcs.flash_range_erase)(addr - FLASH_BASE, erase_size, BLOCK_SIZE, BLOCK_ERASE_CMD); + Ok(()) + } + fn program_page(&mut self, addr: u32, size: u32, data: *const u8) -> Result<(), ErrorCode> { (self.funcs.flash_range_program)(addr - FLASH_BASE, data, size); Ok(()) From 9ba29f84a468a0f0ad1d581398c6c3609c5ab4ab Mon Sep 17 00:00:00 2001 From: 9names <60134748+9names@users.noreply.github.com> Date: Fri, 9 Feb 2024 20:37:39 +1100 Subject: [PATCH 2/5] Replace EraseSectors with EraseRange for a more flexible algo --- src/algo.rs | 15 ++++++++------- src/main.rs | 11 ++++++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/algo.rs b/src/algo.rs index 5a550ff..f4e6632 100644 --- a/src/algo.rs +++ b/src/algo.rs @@ -23,8 +23,8 @@ pub trait FlashAlgo: Sized + 'static { /// Erase sector. May only be called after init() with FUNCTION_ERASE fn erase_sector(&mut self, addr: u32) -> Result<(), ErrorCode>; - /// Erase a number of sectors. May only be called after init() with FUNCTION_ERASE - fn erase_sectors(&mut self, addr: u32, qty: u32) -> Result<(), ErrorCode>; + /// Erase a range of memory. May only be called after init() with FUNCTION_ERASE + fn erase_range(&mut self, start_addr: u32, end_addr: u32) -> Result<(), ErrorCode>; /// Program bytes. May only be called after init() with FUNCTION_PROGRAM fn program_page(&mut self, addr: u32, size: u32, data: *const u8) -> Result<(), ErrorCode>; @@ -105,20 +105,21 @@ macro_rules! algo { Err(e) => e.get(), } } - /// Erase a number of sectors on the flash chip. - /// Will use block erase commands when possible to improve performance + /// Erase a range of memory on the flash chip. + /// Algo can use page/block erase commands to improve performance vs EraseSector /// /// # Safety /// - /// Will erase the given sectors. Pass a valid sector address and valid range of sectors. + /// Will erase all memory inside the address range. + /// Must pass a valid sector start and end address. #[no_mangle] #[link_section = ".entry"] - pub unsafe extern "C" fn EraseSectors(addr: u32, qty: u32) -> u32 { + pub unsafe extern "C" fn EraseRange(start_addr: u32, end_addr: u32) -> u32 { if !_IS_INIT { return 1; } let this = &mut *_ALGO_INSTANCE.as_mut_ptr(); - match <$type as FlashAlgo>::erase_sectors(this, addr, qty) { + match <$type as FlashAlgo>::erase_range(this, start_addr, end_addr) { Ok(()) => 0, Err(e) => e.get(), } diff --git a/src/main.rs b/src/main.rs index d1b39fe..ad7987d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,9 +80,14 @@ impl FlashAlgo for RP2040Algo { Ok(()) } - fn erase_sectors(&mut self, addr: u32, qty: u32) -> Result<(), ErrorCode> { - let erase_size = SECTOR_SIZE * qty; - (self.funcs.flash_range_erase)(addr - FLASH_BASE, erase_size, BLOCK_SIZE, BLOCK_ERASE_CMD); + fn erase_range(&mut self, start_addr: u32, end_addr: u32) -> Result<(), ErrorCode> { + let erase_size = end_addr - start_addr; + (self.funcs.flash_range_erase)( + start_addr - FLASH_BASE, + erase_size, + BLOCK_SIZE, + BLOCK_ERASE_CMD, + ); Ok(()) } From b35a565ddc147085a66610d580efb56702b0451b Mon Sep 17 00:00:00 2001 From: 9names <60134748+9names@users.noreply.github.com> Date: Sat, 10 Feb 2024 16:24:00 +1100 Subject: [PATCH 3/5] Export erase_range in build --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 33066dc..7940c33 100755 --- a/build.sh +++ b/build.sh @@ -30,6 +30,6 @@ cat < Date: Sat, 10 Feb 2024 18:17:50 +1100 Subject: [PATCH 4/5] Add 1 to the range in erase_range to get correct erase length --- src/main.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index ad7987d..15a17f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -81,13 +81,8 @@ impl FlashAlgo for RP2040Algo { } fn erase_range(&mut self, start_addr: u32, end_addr: u32) -> Result<(), ErrorCode> { - let erase_size = end_addr - start_addr; - (self.funcs.flash_range_erase)( - start_addr - FLASH_BASE, - erase_size, - BLOCK_SIZE, - BLOCK_ERASE_CMD, - ); + let size = (end_addr - start_addr) + 1; + (self.funcs.flash_range_erase)(start_addr - FLASH_BASE, size, BLOCK_SIZE, BLOCK_ERASE_CMD); Ok(()) } From 7ef68407da903c059f9de79210df386ad0943534 Mon Sep 17 00:00:00 2001 From: 9names <60134748+9names@users.noreply.github.com> Date: Sat, 10 Feb 2024 18:45:58 +1100 Subject: [PATCH 5/5] Update algo with exclusive range --- src/main.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 15a17f3..4ae8bfd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -81,8 +81,12 @@ impl FlashAlgo for RP2040Algo { } fn erase_range(&mut self, start_addr: u32, end_addr: u32) -> Result<(), ErrorCode> { - let size = (end_addr - start_addr) + 1; - (self.funcs.flash_range_erase)(start_addr - FLASH_BASE, size, BLOCK_SIZE, BLOCK_ERASE_CMD); + (self.funcs.flash_range_erase)( + start_addr - FLASH_BASE, + end_addr - start_addr, + BLOCK_SIZE, + BLOCK_ERASE_CMD, + ); Ok(()) }