Check for non-existing interrupts earlier.

This commit is contained in:
Dario Nieuwenhuis 2023-11-17 23:55:55 +01:00
parent 221d24f6f8
commit f0866ffbc4

View File

@ -115,6 +115,8 @@ impl ChipInterrupts {
let mut chip_signals = HashMap::<_, Vec<_>>::new(); let mut chip_signals = HashMap::<_, Vec<_>>::new();
let exists_irq: HashSet<String> = core.interrupts.iter().map(|i| i.name.clone()).collect();
for nvic_string in nvic_strings { for nvic_string in nvic_strings {
trace!(" irq={nvic_string:?}"); trace!(" irq={nvic_string:?}");
let parts = { let parts = {
@ -133,7 +135,23 @@ impl ChipInterrupts {
} }
// More typos // More typos
let name = name.replace("USAR11", "USART11"); let mut name = name.replace("USAR11", "USART11");
// Skip interrupts that don't exist.
// This is needed because NVIC files are shared between many chips.
static EQUIVALENT_IRQS: &[(&str, &[&str])] = &[
("HASH_RNG", &["RNG"]),
("USB_HP_CAN_TX", &["CAN_TX"]),
("USB_LP_CAN_RX0", &["CAN_RX0"]),
];
if !exists_irq.contains(&name) {
let &(_, eq_irqs) = EQUIVALENT_IRQS
.iter()
.find(|(irq, _)| irq == &name)
.unwrap_or(&("", &[]));
let Some(new_name) = eq_irqs.iter().find(|i| exists_irq.contains(**i)) else { continue };
name = new_name.to_string();
}
// Flags. // Flags.
// Y // Y
@ -327,35 +345,7 @@ impl ChipInterrupts {
for p in &mut core.peripherals { for p in &mut core.peripherals {
if let Some(peri_irqs) = chip_signals.get(&p.name) { if let Some(peri_irqs) = chip_signals.get(&p.name) {
use stm32_data_serde::chip::core::peripheral::Interrupt; let mut irqs: Vec<_> = peri_irqs.clone();
//filter by available, because some are conditioned on <Die>
static EQUIVALENT_IRQS: &[(&str, &[&str])] = &[
("HASH_RNG", &["RNG"]),
("USB_HP_CAN_TX", &["CAN_TX"]),
("USB_LP_CAN_RX0", &["CAN_RX0"]),
];
let mut irqs: Vec<_> = peri_irqs
.iter()
.filter_map(|i| {
if header_irqs.contains_key(&i.interrupt) {
return Some(i.clone());
}
if let Some((_, eq_irqs)) = EQUIVALENT_IRQS.iter().find(|(irq, _)| irq == &i.interrupt) {
for eq_irq in *eq_irqs {
if header_irqs.contains_key(*eq_irq) {
return Some(Interrupt {
signal: i.signal.clone(),
interrupt: eq_irq.to_string(),
});
}
}
}
None
})
.collect();
irqs.sort_by_key(|x| (x.signal.clone(), x.interrupt.clone())); irqs.sort_by_key(|x| (x.signal.clone(), x.interrupt.clone()));
irqs.dedup_by_key(|x| (x.signal.clone(), x.interrupt.clone())); irqs.dedup_by_key(|x| (x.signal.clone(), x.interrupt.clone()));