Add H5[23].
This commit is contained in:
parent
37ec0ab67d
commit
722f70a701
@ -807,8 +807,6 @@ static NOPELIST: &[&str] = &[
|
|||||||
// Not supported, not planned unless someone wants to do it.
|
// Not supported, not planned unless someone wants to do it.
|
||||||
"STM32MP",
|
"STM32MP",
|
||||||
// not supported yet, planned. Pull requests welcome!
|
// not supported yet, planned. Pull requests welcome!
|
||||||
"STM32H52",
|
|
||||||
"STM32H53",
|
|
||||||
"STM32H7R",
|
"STM32H7R",
|
||||||
"STM32H7S",
|
"STM32H7S",
|
||||||
"STM32U5F",
|
"STM32U5F",
|
||||||
|
@ -5,6 +5,7 @@ use log::*;
|
|||||||
use crate::chips::ChipGroup;
|
use crate::chips::ChipGroup;
|
||||||
use crate::normalize_peris::normalize_peri_name;
|
use crate::normalize_peris::normalize_peri_name;
|
||||||
use crate::regex;
|
use crate::regex;
|
||||||
|
use crate::util::RegexMap;
|
||||||
|
|
||||||
mod xml {
|
mod xml {
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
@ -104,12 +105,17 @@ impl ChipInterrupts {
|
|||||||
core.interrupts.sort_unstable_by_key(|x| x.number);
|
core.interrupts.sort_unstable_by_key(|x| x.number);
|
||||||
|
|
||||||
// =================== Populate peripheral interrupts
|
// =================== Populate peripheral interrupts
|
||||||
let want_nvic_name = pick_nvic(chip_name, &core.name);
|
let core_name = &core.name;
|
||||||
|
let want_nvic_name = pick_nvic(chip_name, core_name);
|
||||||
let chip_nvic = group
|
let chip_nvic = group
|
||||||
.ips
|
.ips
|
||||||
.values()
|
.values()
|
||||||
.find(|x| x.name == want_nvic_name)
|
.find(|x| x.name == want_nvic_name)
|
||||||
.ok_or_else(|| format!("couldn't find nvic. chip_name={chip_name} want_nvic_name={want_nvic_name}"))
|
.ok_or_else(|| {
|
||||||
|
format!(
|
||||||
|
"couldn't find nvic. chip_name={chip_name} core_name={core_name} want_nvic_name={want_nvic_name}"
|
||||||
|
)
|
||||||
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let nvic_strings = self
|
let nvic_strings = self
|
||||||
.irqs
|
.irqs
|
||||||
@ -503,33 +509,18 @@ fn valid_signals(peri: &str) -> Vec<String> {
|
|||||||
vec!["GLOBAL".to_string()]
|
vec!["GLOBAL".to_string()]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pick_nvic(chip_name: &str, core_name: &str) -> String {
|
static PICK_NVIC: RegexMap<&str> = RegexMap::new(&[
|
||||||
// Most chips have a single NVIC, named "NVIC"
|
|
||||||
let mut res = "NVIC";
|
|
||||||
|
|
||||||
// Exception 1: Multicore: NVIC1 is the first core, NVIC2 is the second. We have to pick the right one.
|
// Exception 1: Multicore: NVIC1 is the first core, NVIC2 is the second. We have to pick the right one.
|
||||||
if ["H745", "H747", "H755", "H757", "WL54", "WL55"].contains(&&chip_name[5..9]) {
|
("STM32H7(45|47|55|57).*:cm7", "NVIC1"),
|
||||||
if core_name == "cm7" {
|
("STM32H7(45|47|55|57).*:cm4", "NVIC2"),
|
||||||
res = "NVIC1";
|
("STM32WL5.*:cm4", "NVIC1"),
|
||||||
} else {
|
("STM32WL5.*:cm0p", "NVIC2"),
|
||||||
res = "NVIC2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if &chip_name[5..8] == "WL5" {
|
|
||||||
if core_name == "cm4" {
|
|
||||||
res = "NVIC1";
|
|
||||||
} else {
|
|
||||||
res = "NVIC2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exception 2: TrustZone: NVIC1 is Secure mode, NVIC2 is NonSecure mode. For now, we pick the NonSecure one.
|
// Exception 2: TrustZone: NVIC1 is Secure mode, NVIC2 is NonSecure mode. For now, we pick the NonSecure one.
|
||||||
if ["L5", "U5"].contains(&&chip_name[5..7]) {
|
("STM32(L5|U5|H5[2367]|WBA).*", "NVIC2"),
|
||||||
res = "NVIC2"
|
// catch-all: Most chips have a single NVIC, named "NVIC"
|
||||||
}
|
(".*", "NVIC"),
|
||||||
if ["H56", "H57", "WBA"].contains(&&chip_name[5..8]) {
|
]);
|
||||||
res = "NVIC2"
|
|
||||||
}
|
|
||||||
|
|
||||||
res.to_string()
|
fn pick_nvic(chip_name: &str, core_name: &str) -> String {
|
||||||
|
PICK_NVIC.must_get(&format!("{chip_name}:{core_name}")).to_string()
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ mod memory;
|
|||||||
mod normalize_peris;
|
mod normalize_peris;
|
||||||
mod rcc;
|
mod rcc;
|
||||||
mod registers;
|
mod registers;
|
||||||
|
mod util;
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! regex {
|
macro_rules! regex {
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
use regex::Regex;
|
|
||||||
use stm32_data_serde::chip::memory::{self, Settings};
|
use stm32_data_serde::chip::memory::{self, Settings};
|
||||||
use stm32_data_serde::chip::Memory;
|
use stm32_data_serde::chip::Memory;
|
||||||
|
|
||||||
|
use crate::util::RegexMap;
|
||||||
|
|
||||||
struct Mem {
|
struct Mem {
|
||||||
name: &'static str,
|
name: &'static str,
|
||||||
address: u32,
|
address: u32,
|
||||||
@ -139,10 +140,12 @@ static MEMS: RegexMap<&[Mem]> = RegexMap::new(&[
|
|||||||
("STM32G47..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 96, SRAM2 0x20014000 0)),
|
("STM32G47..B", mem!(BANK_1 0x08000000 128, SRAM 0x20000000 96, SRAM2 0x20014000 0)),
|
||||||
("STM32G47..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 96, SRAM2 0x20014000 0)),
|
("STM32G47..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 96, SRAM2 0x20014000 0)),
|
||||||
("STM32G49..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 32, SRAM2 0x20014000 0)),
|
("STM32G49..C", mem!(BANK_1 0x08000000 256, SRAM 0x20000000 32, SRAM2 0x20014000 0)),
|
||||||
// H5. TODO: check
|
// H5.
|
||||||
("STM32H5...B", mem!(BANK_1 0x08000000 64, BANK_2 0x08010000 64, SRAM 0x20000000 32, SRAM2 0x20004000 0)),
|
("STM32H5...B", mem!(BANK_1 0x08000000 64, BANK_2 0x08010000 64, SRAM1 0x20000000 16, SRAM2 0x20004000 16)),
|
||||||
("STM32H5...G", mem!(BANK_1 0x08000000 1024, SRAM 0x20000000 256, SRAM2 0x20040000 0)),
|
("STM32H5...C", mem!(BANK_1 0x08000000 128, BANK_2 0x08020000 128, SRAM1 0x20000000 128, SRAM2 0x20020000 80, SRAM3 0x20034000 64)),
|
||||||
("STM32H5...I", mem!(BANK_1 0x08000000 1024, BANK_2 0x08100000 1024, SRAM 0x20000000 256, SRAM2 0x20040000 0)),
|
("STM32H5...E", mem!(BANK_1 0x08000000 256, BANK_2 0x08040000 256, SRAM1 0x20000000 128, SRAM2 0x20020000 80, SRAM3 0x20034000 64)),
|
||||||
|
("STM32H5...G", mem!(BANK_1 0x08000000 512, BANK_2 0x08080000 512, SRAM1 0x20000000 256, SRAM2 0x20040000 64, SRAM3 0x20050000 320)),
|
||||||
|
("STM32H5...I", mem!(BANK_1 0x08000000 1024, BANK_2 0x08100000 1024, SRAM1 0x20000000 256, SRAM2 0x20040000 64, SRAM3 0x20050000 320)),
|
||||||
// H7. TODO: check
|
// H7. TODO: check
|
||||||
("STM32H7...E", mem!(BANK_1 0x08000000 512, SRAM 0x24000000 128)),
|
("STM32H7...E", mem!(BANK_1 0x08000000 512, SRAM 0x24000000 128)),
|
||||||
("STM32H7[23]..G", mem!(BANK_1 0x08000000 1024, SRAM 0x24000000 128)),
|
("STM32H7[23]..G", mem!(BANK_1 0x08000000 1024, SRAM 0x24000000 128)),
|
||||||
@ -277,28 +280,9 @@ static FLASH_INFO: RegexMap<FlashInfo> = RegexMap::new(&[
|
|||||||
("STM32.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
("STM32.*", FlashInfo{ erase_value: 0xFF, write_size: 8, erase_size: &[( 2*1024, 0)] }),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
struct RegexMap<T: 'static> {
|
|
||||||
map: &'static [(&'static str, T)],
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: 'static> RegexMap<T> {
|
|
||||||
const fn new(map: &'static [(&'static str, T)]) -> Self {
|
|
||||||
Self { map }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get(&self, key: &str) -> Option<&T> {
|
|
||||||
for (k, v) in self.map {
|
|
||||||
if Regex::new(&format!("^{k}$")).unwrap().is_match(key) {
|
|
||||||
return Some(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get(chip: &str) -> Vec<Memory> {
|
pub fn get(chip: &str) -> Vec<Memory> {
|
||||||
let mems = *MEMS.get(chip).unwrap();
|
let mems = *MEMS.must_get(chip);
|
||||||
let flash = FLASH_INFO.get(chip).unwrap();
|
let flash = FLASH_INFO.must_get(chip);
|
||||||
|
|
||||||
let mut res = Vec::new();
|
let mut res = Vec::new();
|
||||||
|
|
||||||
|
28
stm32-data-gen/src/util.rs
Normal file
28
stm32-data-gen/src/util.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
use regex::Regex;
|
||||||
|
|
||||||
|
pub struct RegexMap<T: 'static> {
|
||||||
|
map: &'static [(&'static str, T)],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: 'static> RegexMap<T> {
|
||||||
|
pub const fn new(map: &'static [(&'static str, T)]) -> Self {
|
||||||
|
Self { map }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&self, key: &str) -> Option<&T> {
|
||||||
|
for (k, v) in self.map {
|
||||||
|
if Regex::new(&format!("^{k}$")).unwrap().is_match(key) {
|
||||||
|
return Some(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
pub fn must_get(&self, key: &str) -> &T {
|
||||||
|
let Some(res) = self.get(key) else {
|
||||||
|
panic!("no regexmap for key '{key}'")
|
||||||
|
};
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user