Parse in the dma HAL headers for the actual request numbers.

Then apply them to fix up where possible because the XML is crap.
This commit is contained in:
Bob McWhirter 2021-07-16 13:12:29 -04:00
parent 134d22af37
commit 02dd4e13f2
2 changed files with 94 additions and 6 deletions

View File

@ -135,6 +135,10 @@ fieldset/CR:
bit_offset: 19 bit_offset: 19
bit_size: 1 bit_size: 1
enum: CT enum: CT
- name: TRBUFF
description: Enable bufferable transfers
bit_offset: 20
bit_size: 1
- name: PBURST - name: PBURST
description: Peripheral burst transfer configuration description: Peripheral burst transfer configuration
bit_offset: 21 bit_offset: 21

View File

@ -440,6 +440,94 @@ def parse_headers():
headers_parsed[ff] = res headers_parsed[ff] = res
dma_request_headers_parsed = {}
def adjust_dma_requests(chip_name, pname, requests):
adjusted = {}
if (dma_request_header := find_dma_request_header(chip_name)) is not None:
for (request, original) in requests.items():
define_name = 'DMA_REQUEST_' + pname
if pname != request:
define_name += '_' + request
define = dma_request_header['defines']['all'].get(define_name)
if define is None:
if request == 'RD':
define_name = 'DMA_REQUEST_' + pname + '_READ'
if request == 'WR':
define_name = 'DMA_REQUEST_' + pname + '_WRITE'
define = dma_request_header['defines']['all'].get(define_name)
if define == 0:
# check the _ll maybe
if (dmamux_request_header := find_dmamux_request_header(chip_name)) is not None:
define_name = 'LL_DMAMUX_REQ_' + pname
if pname != request:
define_name += '_' + request
define = dmamux_request_header['defines']['all'].get(define_name)
if define is None:
if request == 'RD':
define_name = 'LL_DMAMUX_REQ_' + pname + '_READ'
if request == 'WR':
define_name = 'LL_DMAMUX_REQ_' + pname + '_WRITE'
define = dmamux_request_header['defines']['all'].get(define_name)
if define is not None:
adjusted[request] = define
else:
adjusted[request] = original
return adjusted
else:
return requests
def find_dma_request_header(chip_name):
target = chip_name.lower()
for (name, headers) in dma_request_headers_parsed.items():
if target.startswith(name):
return headers
return None
def find_dmamux_request_header(chip_name):
target = chip_name.lower()
for (name, headers) in dma_request_headers_parsed.items():
if name.endswith("_ll") and target.startswith(removesuffix(name, '_ll')):
return headers
return None
def parse_dma_request_headers():
os.makedirs('sources/dma_headers_parsed', exist_ok=True)
print("loading dma request headers...")
for f in glob('./sources/git/*/Drivers/*/Inc/*_hal_dma.h'):
last_slash = f.rfind('/')
ff = f[last_slash + 1:]
ff = removesuffix(ff, "xx_hal_dma.h")
try:
with open('sources/dma_headers_parsed/{}.json'.format(ff), 'r') as j:
res = json.load(j)
except:
res = parse_header(f)
with open('sources/dma_headers_parsed/{}.json'.format(ff), 'w') as j:
json.dump(res, j)
dma_request_headers_parsed[ff] = res
for f in glob('./sources/git/*/Drivers/*/Inc/*_ll_dma.h'):
last_slash = f.rfind('/')
ff = f[last_slash + 1:]
ff = removesuffix(ff, "xx_ll_dma.h")
try:
with open('sources/dma_headers_parsed/{}.json'.format(ff), 'r') as j:
res = json.load(j)
except:
res = parse_header(f)
with open('sources/dma_headers_parsed/{}.json'.format(ff), 'w') as j:
json.dump(res, j)
dma_request_headers_parsed[ff + '_ll'] = res
def chip_name_from_package_name(x): def chip_name_from_package_name(x):
name_map = [ name_map = [
@ -673,7 +761,7 @@ def parse_chips():
if 'channels' in dma_channels[chip_dma]['peripherals'][pname]: if 'channels' in dma_channels[chip_dma]['peripherals'][pname]:
p['dma_channels'] = dma_channels[chip_dma]['peripherals'][pname]['channels'] p['dma_channels'] = dma_channels[chip_dma]['peripherals'][pname]['channels']
if 'requests' in dma_channels[chip_dma]['peripherals'][pname]: if 'requests' in dma_channels[chip_dma]['peripherals'][pname]:
p['dma_requests'] = dma_channels[chip_dma]['peripherals'][pname]['requests'] p['dma_requests'] = adjust_dma_requests(chip_name, pname, dma_channels[chip_dma]['peripherals'][pname]['requests'])
peris[pname] = p peris[pname] = p
@ -876,11 +964,6 @@ def parse_dma():
peri_dma['requests'] = {} peri_dma['requests'] = {}
if event not in peri_dma['requests']: if event not in peri_dma['requests']:
peri_dma['requests'][event] = request_num peri_dma['requests'][event] = request_num
#event_dma = peri_dma['requests'][event]
# event_dma.append( OrderedDict( {
# 'channel': 'DMAMUX',
# 'request': request_num
# } ))
request_num += 1 request_num += 1
for n in dma_peri_name.split(","): for n in dma_peri_name.split(","):
n = n.strip() n = n.strip()
@ -1010,6 +1093,7 @@ def match_peri_clock(rcc_block, peri_name):
return match_peri_clock(rcc_block, removesuffix(peri_name, "1")) return match_peri_clock(rcc_block, removesuffix(peri_name, "1"))
return None return None
parse_dma_request_headers()
parse_rcc_regs() parse_rcc_regs()
parse_documentations() parse_documentations()
parse_dma() parse_dma()