Fix parsing of H7ab BDMA1/BDMA2

This commit is contained in:
Dario Nieuwenhuis 2022-02-24 05:55:16 +01:00
parent 324e5bee8d
commit 8a935d22e5

View File

@ -258,7 +258,7 @@ perimap = [
('.*:IPCC:v1_0', ('ipcc', 'v1', 'IPCC')),
('.*:DMAMUX.*', ('dmamux', 'v1', 'DMAMUX')),
('.*:BDMA:.*', ('bdma', 'v1', 'DMA')),
('.*:BDMA\d?:.*', ('bdma', 'v1', 'DMA')),
('STM32H7.*:DMA2D:DMA2D:dma2d1_v1_0', ('dma2d', 'v2', 'DMA2D')),
('.*:DMA2D:dma2d1_v1_0', ('dma2d', 'v1', 'DMA2D')),
('STM32L4[PQRS].*:DMA.*', ('bdma', 'v1', 'DMA')), # L4+
@ -584,14 +584,6 @@ def parse_chips():
if chip_nvic is None:
chip_nvic = next(filter(lambda x: x['@Name'] == 'NVIC2', chip['ips'].values()), None)
chip_dma = next(filter(lambda x: x['@Name'] == 'DMA', chip['ips'].values()), None)
if chip_dma is not None:
chip_dma = chip_dma['@Version']
chip_bdma = next(filter(lambda x: x['@Name'] == 'BDMA', chip['ips'].values()), None)
if chip_bdma is not None:
chip_bdma = chip_bdma['@Version']
rcc_kind = next(filter(lambda x: x['@Name'] == 'RCC', chip['ips'].values()))['@Version']
assert rcc_kind is not None
rcc_block = match_peri(f'{chip_name}:RCC:{rcc_kind}')
@ -661,6 +653,9 @@ def parse_chips():
if pname not in peri_kinds and (addr := get_peri_addr(defines, pname)):
peri_kinds[pname] = 'unknown'
if 'BDMA1' in peri_kinds and 'BDMA' in peri_kinds:
del peri_kinds['BDMA']
# get possible used GPIOs for each peripheral from the chip xml
# it's not the full info we would want (stuff like AFIO info which comes from GPIO xml),
# but we actually need to use it because of F1 line
@ -736,12 +731,19 @@ def parse_chips():
have_peris = set((p['name'] for p in peris))
core['peripherals'] = peris
# Collect DMA versions in the chip
chip_dmas = []
for want_kind in ('DMA', 'BDMA', 'BDMA1', 'BDMA2'):
for ip in chip['ips'].values():
pkind = ip['@Name']
version = ip['@Version']
if pkind == want_kind and version in dma_channels and version not in chip_dmas:
chip_dmas.append(version)
# Process DMA channels
chs = []
if x := dma_channels.get(chip_dma):
chs.extend(x['channels'])
if x := dma_channels.get(chip_bdma):
chs.extend(x['channels'])
for dma in chip_dmas:
chs.extend(dma_channels[dma]['channels'])
# The dma_channels[xx] is generic for multiple chips. The current chip may have less DMAs,
# so we have to filter it.
@ -751,14 +753,17 @@ def parse_chips():
have_chs = set((ch['name'] for ch in chs))
# Process peripheral - DMA channel associations
if chip_dma is not None:
for p in peris:
if peri_chs := dma_channels[chip_dma]['peripherals'].get(p['name']):
p['dma_channels'] = [
for p in peris:
chs = []
for dma in chip_dmas:
if peri_chs := dma_channels[dma]['peripherals'].get(p['name']):
chs.extend([
ch
for ch in peri_chs
if 'channel' not in ch or ch['channel'] in have_chs
]
])
if chs:
p['dma_channels'] = chs
# Now that we've processed everything common to the entire group,
# process each chip in the group.
@ -990,7 +995,7 @@ dma_channels = {}
def parse_dma():
for f in glob('sources/cubedb/mcu/IP/*DMA-*Modes.xml'):
for f in glob('sources/cubedb/mcu/IP/DMA*Modes.xml') + glob('sources/cubedb/mcu/IP/BDMA*Modes.xml'):
f = f.replace(os.path.sep, '/')
is_explicitly_bdma = False
ff = removeprefix(f, 'sources/cubedb/mcu/IP/')
@ -1000,7 +1005,10 @@ def parse_dma():
is_explicitly_bdma = True
ff = removeprefix(ff, 'DMA-')
ff = removeprefix(ff, 'BDMA-')
ff = removeprefix(ff, 'BDMA1-')
ff = removeprefix(ff, 'BDMA2-')
ff = removesuffix(ff, '_Modes.xml')
print(ff)
r = xmltodict.parse(open(f, 'rb'), force_list={'Mode', 'RefMode'})
@ -1022,29 +1030,31 @@ def parse_dma():
dmamux_file = 'L4PQ'
if ff.startswith('STM32L4S'):
dmamux_file = 'L4RS'
dmamux = 'DMAMUX1'
if is_explicitly_bdma:
dmamux = 'DMAMUX2'
for mf in sorted(glob('data/dmamux/{}_*.yaml'.format(dmamux_file))):
mf = mf.replace(os.path.sep, '/')
with open(mf, 'r') as yaml_file:
y = yaml.load(yaml_file)
mf = removesuffix(mf, '.yaml')
dmamux = mf[mf.index('_') + 1:] # DMAMUX1 or DMAMUX2
req_dmamux = mf[mf.index('_') + 1:] # DMAMUX1 or DMAMUX2
for (request_name, request_num) in y.items():
parts = request_name.split('_')
target_peri_name = parts[0]
if len(parts) < 2:
request = target_peri_name
else:
request = parts[1]
chip_dma['peripherals'].setdefault(target_peri_name, []).append({
'signal': request,
"dmamux": dmamux,
"request": request_num,
})
dmamux = 'DMAMUX1'
if is_explicitly_bdma:
dmamux = 'DMAMUX2'
if req_dmamux == dmamux:
for (request_name, request_num) in y.items():
parts = request_name.split('_')
target_peri_name = parts[0]
if len(parts) < 2:
request = target_peri_name
else:
request = parts[1]
chip_dma['peripherals'].setdefault(target_peri_name, []).append({
'signal': request,
"dmamux": req_dmamux,
"request": request_num,
})
dmamux_channel = 0
for n in dma_peri_name.split(","):
@ -1079,6 +1089,8 @@ def parse_dma():
request_num = next(filter(lambda x: x['@Name'] in ('Channel', 'Request'), block['Parameter']), None)
if request_num is not None:
request_num = request_num['PossibleValue']
if request_num.startswith('BDMA1_REQUEST_'):
continue
request_num = removeprefix(request_num, "DMA_CHANNEL_")
request_num = removeprefix(request_num, "DMA_REQUEST_")
requests[name] = int(request_num)
@ -1127,6 +1139,9 @@ def parse_dma():
if ch['dma'] == dma_peri_name:
ch['channel'] -= 1
with open('tmp/dmas/' + ff + '.json', 'w') as f:
json.dump(chip_dma, f, indent=4)
dma_channels[ff] = chip_dma