Be fancier on parsing peripheral IRQs.
This commit is contained in:
parent
38c403f205
commit
2618ec3a94
77
parse.py
77
parse.py
@ -681,7 +681,8 @@ def parse_chips():
|
||||
if chip_nvic in chip_interrupts:
|
||||
if pname in chip_interrupts[chip_nvic]:
|
||||
# filter by available, because some are conditioned on <Die>
|
||||
p['interrupts'] = [ v for v in chip_interrupts[chip_nvic][pname] if v in interrupts ]
|
||||
#p['interrupts'] = [ v for v in chip_interrupts[chip_nvic][pname] if v in interrupts ]
|
||||
p['interrupts'] = filter_interrupts( chip_interrupts[chip_nvic][pname], interrupts)
|
||||
|
||||
peris[pname] = p
|
||||
|
||||
@ -1074,22 +1075,88 @@ def parse_interrupts():
|
||||
ff = removesuffix(ff, '_Modes.xml')
|
||||
chip_irqs = {}
|
||||
r = xmltodict.parse(open(f, 'rb'))
|
||||
print(f)
|
||||
irqs = next(filter(lambda x: x['@Name'] == 'IRQn', r['IP']['RefParameter']))
|
||||
for irq in irqs['PossibleValue']:
|
||||
value = irq['@Value']
|
||||
parts = value.split(':')
|
||||
irq_name = removesuffix(parts[0], "_IRQn")
|
||||
peri_names = parts[2].split(',')
|
||||
split = split_interrupts(peri_names, irq_name)
|
||||
if len(peri_names) == 1 and peri_names[0] == '':
|
||||
continue
|
||||
print(f'{peri_names} -> {irq_name}')
|
||||
for p in peri_names:
|
||||
if p not in chip_irqs:
|
||||
chip_irqs[p] = []
|
||||
chip_irqs[p].append( irq_name )
|
||||
chip_irqs[p] = {}
|
||||
merge_peri_irq_signals(chip_irqs[p], split[p])
|
||||
chip_interrupts[ff] = chip_irqs
|
||||
|
||||
def merge_peri_irq_signals(peri_irqs, additional):
|
||||
for key, value in additional.items():
|
||||
if key not in peri_irqs:
|
||||
peri_irqs[key] = []
|
||||
peri_irqs[key].append(value)
|
||||
|
||||
|
||||
def split_interrupts(peri_names, irq_name):
|
||||
split = {}
|
||||
for p in peri_names:
|
||||
split[p] = remap_interrupt_signals(p, irq_name)
|
||||
|
||||
return split
|
||||
|
||||
irq_signals_map = {
|
||||
'I2C': [ 'ER', 'EV'],
|
||||
'TIM': [ 'BRK', 'UP', 'TRG', 'COM'],
|
||||
'HRTIM': ['Master', 'TIMA', 'TIMB', 'TIMC', 'TIMD', 'TIME', 'TIMF' ]
|
||||
}
|
||||
|
||||
def remap_interrupt_signals(peri_name, irq_name):
|
||||
if peri_name == irq_name:
|
||||
return expand_all_irq_signals(peri_name, irq_name)
|
||||
if peri_name in irq_name:
|
||||
signals = {}
|
||||
start = irq_name.index(peri_name)
|
||||
regexp = re.compile('(_[^_]+)');
|
||||
if match := regexp.findall(irq_name, start):
|
||||
for m in match:
|
||||
signal = removeprefix(m, '_').strip()
|
||||
if is_valid_irq_signal(peri_name, signal):
|
||||
signals[signal] = irq_name
|
||||
else:
|
||||
signals = expand_all_irq_signals(peri_name, irq_name)
|
||||
return signals
|
||||
else:
|
||||
return { 'GLOBAL': irq_name }
|
||||
|
||||
def is_valid_irq_signal(peri_name, signal):
|
||||
for prefix, signals in irq_signals_map.items():
|
||||
if peri_name.startswith(prefix):
|
||||
return signal in signals
|
||||
return False
|
||||
|
||||
def expand_all_irq_signals(peri_name, irq_name):
|
||||
expanded = {}
|
||||
for prefix, signals in irq_signals_map.items():
|
||||
if peri_name.startswith(prefix):
|
||||
for s in irq_signals_map[prefix]:
|
||||
expanded[s] = irq_name
|
||||
return expanded
|
||||
|
||||
return {'GLOBAL': irq_name }
|
||||
|
||||
def filter_interrupts(peri_irqs, all_irqs):
|
||||
filtered = {}
|
||||
|
||||
for signal, irqs in peri_irqs.items():
|
||||
for irq in all_irqs:
|
||||
if irq in irqs:
|
||||
filtered[signal] = irq
|
||||
break
|
||||
|
||||
return filtered
|
||||
|
||||
|
||||
|
||||
parse_interrupts()
|
||||
parse_rcc_regs()
|
||||
parse_documentations()
|
||||
|
Loading…
x
Reference in New Issue
Block a user