mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-22 06:42:32 +00:00
Add AltFlashLayout for supported F4 chips
This commit is contained in:
parent
89129babf9
commit
91d8afd371
@ -910,10 +910,18 @@ macro_rules! {} {{
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn get_flash_region_type_name(name: &str) -> String {
|
||||
name.replace("BANK_", "Bank").replace("REGION_", "Region")
|
||||
fn get_flash_region_name(name: &str) -> String {
|
||||
let name = name.replace("BANK_", "BANK").replace("REGION_", "REGION");
|
||||
if name.contains("REGION") {
|
||||
name
|
||||
} else {
|
||||
name + "_REGION"
|
||||
}
|
||||
}
|
||||
|
||||
fn get_flash_region_name(name: &str) -> String {
|
||||
name.replace("BANK_", "BANK").replace("REGION_", "REGION")
|
||||
fn get_flash_region_type_name(name: &str) -> String {
|
||||
get_flash_region_name(name)
|
||||
.replace("BANK", "Bank")
|
||||
.replace("REGION", "Region")
|
||||
.replace("_", "")
|
||||
}
|
||||
|
@ -3,9 +3,7 @@ use embassy_hal_common::{into_ref, PeripheralRef};
|
||||
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
||||
use embassy_sync::mutex::{Mutex, MutexGuard};
|
||||
|
||||
use super::{family, Error, FlashRegion};
|
||||
pub use crate::_generated::flash_regions::*;
|
||||
pub use crate::pac::{FLASH_BASE, FLASH_SIZE, WRITE_SIZE};
|
||||
use super::{family, Error, FlashLayout, FlashRegion, FLASH_BASE, FLASH_SIZE, WRITE_SIZE};
|
||||
use crate::Peripheral;
|
||||
|
||||
pub struct Flash<'d> {
|
||||
|
@ -11,7 +11,82 @@ const MEDIUM_SECTOR_SIZE: u32 = 64 * 1024;
|
||||
const LARGE_SECTOR_SIZE: u32 = 128 * 1024;
|
||||
const SECOND_BANK_SECTOR_OFFSET: u8 = 12;
|
||||
|
||||
#[cfg(any(stm32f427, stm32f429, stm32f437, stm32f439, stm32f469, stm32f479))]
|
||||
mod alt_regions {
|
||||
use embassy_hal_common::PeripheralRef;
|
||||
use stm32_metapac::FLASH_SIZE;
|
||||
|
||||
use crate::_generated::flash_regions::{BANK1_REGION1, BANK1_REGION2, BANK1_REGION3};
|
||||
use crate::flash::{Bank1Region1, Bank1Region2, Flash, FlashRegion};
|
||||
use crate::peripherals::FLASH;
|
||||
|
||||
pub const ALT_BANK1_REGION3: FlashRegion = FlashRegion {
|
||||
size: 3 * BANK1_REGION3.erase_size,
|
||||
..BANK1_REGION3
|
||||
};
|
||||
pub const ALT_BANK2_REGION1: FlashRegion = FlashRegion {
|
||||
base: BANK1_REGION1.base + FLASH_SIZE as u32 / 2,
|
||||
..BANK1_REGION1
|
||||
};
|
||||
pub const ALT_BANK2_REGION2: FlashRegion = FlashRegion {
|
||||
base: BANK1_REGION2.base + FLASH_SIZE as u32 / 2,
|
||||
..BANK1_REGION2
|
||||
};
|
||||
pub const ALT_BANK2_REGION3: FlashRegion = FlashRegion {
|
||||
base: BANK1_REGION3.base + FLASH_SIZE as u32 / 2,
|
||||
size: 3 * BANK1_REGION3.erase_size,
|
||||
..BANK1_REGION3
|
||||
};
|
||||
|
||||
pub type AltBank1Region1 = Bank1Region1;
|
||||
pub type AltBank1Region2 = Bank1Region2;
|
||||
pub struct AltBank1Region3(&'static FlashRegion);
|
||||
pub struct AltBank2Region1(&'static FlashRegion);
|
||||
pub struct AltBank2Region2(&'static FlashRegion);
|
||||
pub struct AltBank2Region3(&'static FlashRegion);
|
||||
|
||||
pub struct AltFlashLayout<'d> {
|
||||
_inner: PeripheralRef<'d, FLASH>,
|
||||
pub bank1_region1: AltBank1Region1,
|
||||
pub bank1_region2: AltBank1Region2,
|
||||
pub bank1_region3: AltBank1Region3,
|
||||
pub bank2_region1: AltBank2Region1,
|
||||
pub bank2_region2: AltBank2Region2,
|
||||
pub bank2_region3: AltBank2Region3,
|
||||
}
|
||||
|
||||
impl<'d> Flash<'d> {
|
||||
pub fn into_alt_regions(self) -> AltFlashLayout<'d> {
|
||||
unsafe { crate::pac::FLASH.optcr().modify(|r| r.set_db1m(true)) };
|
||||
AltFlashLayout {
|
||||
_inner: self.release(),
|
||||
bank1_region1: Bank1Region1(&BANK1_REGION1),
|
||||
bank1_region2: Bank1Region2(&BANK1_REGION2),
|
||||
bank1_region3: AltBank1Region3(&ALT_BANK1_REGION3),
|
||||
bank2_region1: AltBank2Region1(&ALT_BANK2_REGION1),
|
||||
bank2_region2: AltBank2Region2(&ALT_BANK2_REGION2),
|
||||
bank2_region3: AltBank2Region3(&ALT_BANK2_REGION3),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for AltFlashLayout<'_> {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
super::lock();
|
||||
crate::pac::FLASH.optcr().modify(|r| r.set_db1m(false))
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(stm32f427, stm32f429, stm32f437, stm32f439, stm32f469, stm32f479))]
|
||||
pub use alt_regions::AltFlashLayout;
|
||||
|
||||
fn is_dual_bank() -> bool {
|
||||
// let asd: super::Bank1Region1;
|
||||
// let sad = &super::BANK_1_REGION_1;
|
||||
|
||||
match FLASH_SIZE / 1024 {
|
||||
// 1 MB devices depend on configuration
|
||||
1024 => {
|
||||
|
@ -1,5 +1,35 @@
|
||||
use embedded_storage::nor_flash::{NorFlashError, NorFlashErrorKind};
|
||||
|
||||
#[cfg(flash)]
|
||||
mod common;
|
||||
|
||||
#[cfg(flash)]
|
||||
pub use common::*;
|
||||
|
||||
pub use crate::_generated::flash_regions::*;
|
||||
pub use crate::pac::{FLASH_BASE, FLASH_SIZE, WRITE_SIZE};
|
||||
|
||||
pub struct FlashRegion {
|
||||
pub base: u32,
|
||||
pub size: u32,
|
||||
pub erase_size: u32,
|
||||
pub write_size: u32,
|
||||
pub erase_value: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
pub struct FlashSector {
|
||||
pub index: u8,
|
||||
pub start: u32,
|
||||
pub size: u32,
|
||||
}
|
||||
|
||||
impl Drop for FlashLayout<'_> {
|
||||
fn drop(&mut self) {
|
||||
unsafe { family::lock() };
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(any(flash_l0, flash_l1, flash_l4, flash_wl, flash_wb), path = "l.rs")]
|
||||
#[cfg_attr(flash_f3, path = "f3.rs")]
|
||||
#[cfg_attr(flash_f4, path = "f4.rs")]
|
||||
@ -39,32 +69,8 @@ mod family {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(flash)]
|
||||
mod common;
|
||||
|
||||
#[cfg(flash)]
|
||||
pub use common::*;
|
||||
|
||||
pub struct FlashRegion {
|
||||
pub base: u32,
|
||||
pub size: u32,
|
||||
pub erase_size: u32,
|
||||
pub write_size: u32,
|
||||
pub erase_value: u8,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
pub struct FlashSector {
|
||||
pub index: u8,
|
||||
pub start: u32,
|
||||
pub size: u32,
|
||||
}
|
||||
|
||||
impl Drop for FlashLayout<'_> {
|
||||
fn drop(&mut self) {
|
||||
unsafe { family::lock() };
|
||||
}
|
||||
}
|
||||
#[allow(unused_imports)]
|
||||
pub use family::*;
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
|
Loading…
Reference in New Issue
Block a user