Check for non-existing interrupts earlier.
This commit is contained in:
parent
221d24f6f8
commit
f0866ffbc4
@ -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()));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user