diff --git a/stm32-data-gen/src/chips.rs b/stm32-data-gen/src/chips.rs index a438524..c93f353 100644 --- a/stm32-data-gen/src/chips.rs +++ b/stm32-data-gen/src/chips.rs @@ -987,12 +987,19 @@ fn process_chip( let ram_total = chip.ram * 1024; let mut memory_regions = Vec::new(); let mut found = HashSet::<&str>::new(); - for each in ["FLASH", "FLASH_BANK1", "FLASH_BANK2", "D1_AXIFLASH", "D1_AXIICP"] { - if let Some(_address) = h.defines.get("all").unwrap().0.get(&format!("{each}_BASE")) { + for each in [ + "FLASH_BANK1", + "FLASH_BANK2", + "FLASH", + "FLASH_OTP", + "D1_AXIFLASH", + "D1_AXIICP", + ] { + if let Some(address) = h.defines.get("all").unwrap().0.get(&format!("{each}_BASE")) { let key = match each { - "FLASH" => "BANK_1", - "FLASH_BANK1" => "BANK_1", - "FLASH_BANK2" => "BANK_2", + "FLASH" => "BANK1", + "FLASH_BANK1" => "BANK1", + "FLASH_BANK2" => "BANK2", each => each, }; @@ -1001,27 +1008,46 @@ fn process_chip( } found.insert(key); - for region in memories.determine_flash_regions(chip_name) { - let size = if key == "BANK_1" || key == "BANK_2" { - let size = region.bytes; - std::cmp::min(size, flash_total) + if key == "FLASH_OTP" { + if let Some(region) = memories + .determine_flash_regions(chip_name) + .iter() + .find(|x| x.bank == memory::FlashBank::Otp) + { + memory_regions.push(stm32_data_serde::chip::Memory { + name: region.name.clone(), + kind: stm32_data_serde::chip::memory::Kind::Otp, + address: u32::try_from(*address).unwrap(), + size: region.bytes, + settings: Some(region.settings.clone()), + }) + } + } else { + let bank = if key == "BANK2" { + memory::FlashBank::Bank2 } else { - 0 + memory::FlashBank::Bank1 }; - let kind = match region.bank { - memory::FlashBank::Bank1 => stm32_data_serde::chip::memory::Kind::Flash, - memory::FlashBank::Bank2 => stm32_data_serde::chip::memory::Kind::Flash, - memory::FlashBank::Otp => stm32_data_serde::chip::memory::Kind::Otp, - }; + for region in memories + .determine_flash_regions(chip_name) + .iter() + .filter(|x| x.bank == bank) + { + let size = if key == "BANK1" || key == "BANK2" { + std::cmp::min(region.bytes, flash_total) + } else { + 0 + }; - memory_regions.push(stm32_data_serde::chip::Memory { - name: region.name.clone(), - kind, - address: region.address, - size, - settings: Some(region.settings.clone()), - }) + memory_regions.push(stm32_data_serde::chip::Memory { + name: format!("{}_{}", key, region.name), + kind: stm32_data_serde::chip::memory::Kind::Flash, + address: u32::try_from(*address).unwrap(), + size, + settings: Some(region.settings.clone()), + }) + } } } }