From 1c68c62ebdbfdad0ad0a9cc8d7718baf6a3c94e8 Mon Sep 17 00:00:00 2001 From: Mathias Date: Tue, 18 Apr 2023 13:48:37 +0200 Subject: [PATCH 1/3] Implement embedded-storage traits for full flash struct --- embassy-stm32/src/flash/common.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/embassy-stm32/src/flash/common.rs b/embassy-stm32/src/flash/common.rs index 1189e447..95fe2612 100644 --- a/embassy-stm32/src/flash/common.rs +++ b/embassy-stm32/src/flash/common.rs @@ -162,6 +162,35 @@ impl FlashRegion { } } +impl embedded_storage::nor_flash::ErrorType for Flash<'_> { + type Error = Error; +} + +impl embedded_storage::nor_flash::ReadNorFlash for Flash<'_> { + const READ_SIZE: usize = 1; + + fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error> { + self.blocking_read(offset, bytes) + } + + fn capacity(&self) -> usize { + FLASH_SIZE + } +} + +impl embedded_storage::nor_flash::NorFlash for Flash<'_> { + const WRITE_SIZE: usize = 8; + const ERASE_SIZE: usize = 2048; + + fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error> { + self.blocking_write(offset, bytes) + } + + fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> { + self.blocking_erase(from, to) + } +} + foreach_flash_region! { ($type_name:ident, $write_size:literal, $erase_size:literal) => { impl crate::_generated::flash_regions::$type_name<'_> { From 095f5ef279b58da0e3b63559b4f1a039538673c9 Mon Sep 17 00:00:00 2001 From: Mathias Date: Tue, 18 Apr 2023 15:49:33 +0200 Subject: [PATCH 2/3] Add MAX_ERASE_SIZE const in build script, and use it in flash-wide implementation of embedded-storage traits --- embassy-stm32/build.rs | 8 ++++++++ embassy-stm32/src/flash/common.rs | 6 +++--- embassy-stm32/src/flash/mod.rs | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index c7d12e13..7959cca0 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -255,6 +255,14 @@ fn main() { ]; }); + let max_erase_size = flash_memory_regions + .iter() + .map(|region| region.settings.as_ref().unwrap().erase_size) + .max() + .unwrap(); + + g.extend(quote! { pub const MAX_ERASE_SIZE: u32 = #max_erase_size }); + g.extend(quote! { pub mod flash_regions { #flash_regions } }); // ======== diff --git a/embassy-stm32/src/flash/common.rs b/embassy-stm32/src/flash/common.rs index 95fe2612..6d7f5597 100644 --- a/embassy-stm32/src/flash/common.rs +++ b/embassy-stm32/src/flash/common.rs @@ -2,7 +2,7 @@ use atomic_polyfill::{fence, Ordering}; use embassy_hal_common::drop::OnDrop; use embassy_hal_common::{into_ref, PeripheralRef}; -use super::{family, Error, FlashLayout, FlashRegion, FlashSector, FLASH_BASE, FLASH_SIZE, WRITE_SIZE}; +use super::{family, Error, FlashLayout, FlashRegion, FlashSector, FLASH_BASE, FLASH_SIZE, MAX_ERASE_SIZE, WRITE_SIZE}; use crate::flash::FlashBank; use crate::Peripheral; @@ -179,8 +179,8 @@ impl embedded_storage::nor_flash::ReadNorFlash for Flash<'_> { } impl embedded_storage::nor_flash::NorFlash for Flash<'_> { - const WRITE_SIZE: usize = 8; - const ERASE_SIZE: usize = 2048; + const WRITE_SIZE: usize = WRITE_SIZE; + const ERASE_SIZE: usize = MAX_ERASE_SIZE; fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error> { self.blocking_write(offset, bytes) diff --git a/embassy-stm32/src/flash/mod.rs b/embassy-stm32/src/flash/mod.rs index 231ff1f9..7d5596b1 100644 --- a/embassy-stm32/src/flash/mod.rs +++ b/embassy-stm32/src/flash/mod.rs @@ -7,6 +7,7 @@ mod common; pub use common::*; pub use crate::_generated::flash_regions::*; +pub use crate::_generated::MAX_ERASE_SIZE; pub use crate::pac::{FLASH_BASE, FLASH_SIZE, WRITE_SIZE}; #[derive(Debug)] From bba8b0ded52383e9a958e11322ac5c75d01e70de Mon Sep 17 00:00:00 2001 From: Mathias Date: Tue, 18 Apr 2023 15:54:13 +0200 Subject: [PATCH 3/3] Missing semi-colon --- embassy-stm32/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 7959cca0..a85d3db6 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -261,7 +261,7 @@ fn main() { .max() .unwrap(); - g.extend(quote! { pub const MAX_ERASE_SIZE: u32 = #max_erase_size }); + g.extend(quote! { pub const MAX_ERASE_SIZE: usize = #max_erase_size as usize; }); g.extend(quote! { pub mod flash_regions { #flash_regions } });