Adjust parse.py to emit peri-specific pin information.
This commit is contained in:
parent
73bc1bed55
commit
2ae079edfe
79
parse.py
79
parse.py
@ -259,6 +259,13 @@ def match_peri(peri):
|
|||||||
return block
|
return block
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def find_af(gpio_af, peri_name, pin_name, signal_name):
|
||||||
|
if gpio_af in af:
|
||||||
|
if pin_name in af[gpio_af]:
|
||||||
|
if peri_name + '_' + signal_name in af[gpio_af][pin_name]:
|
||||||
|
return af[gpio_af][pin_name][peri_name + '_' + signal_name]
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def parse_headers():
|
def parse_headers():
|
||||||
os.makedirs('sources/headers_parsed', exist_ok=True)
|
os.makedirs('sources/headers_parsed', exist_ok=True)
|
||||||
@ -361,6 +368,7 @@ def parse_chips():
|
|||||||
# Some packages have some peripehrals removed because the package had to
|
# Some packages have some peripehrals removed because the package had to
|
||||||
# remove GPIOs useful for that peripheral. So we merge all peripherals from all packages.
|
# remove GPIOs useful for that peripheral. So we merge all peripherals from all packages.
|
||||||
peris = chips[chip_name]['peripherals']
|
peris = chips[chip_name]['peripherals']
|
||||||
|
pins = chips[chip_name]['pins']
|
||||||
for ip in r['IP']:
|
for ip in r['IP']:
|
||||||
pname = ip['@InstanceName']
|
pname = ip['@InstanceName']
|
||||||
pkind = ip['@Name']+':'+ip['@Version']
|
pkind = ip['@Name']+':'+ip['@Version']
|
||||||
@ -371,36 +379,46 @@ def parse_chips():
|
|||||||
if pname in FAKE_PERIPHERALS:
|
if pname in FAKE_PERIPHERALS:
|
||||||
continue
|
continue
|
||||||
peris[pname] = pkind
|
peris[pname] = pkind
|
||||||
|
pins[pname] = []
|
||||||
|
|
||||||
pins = chips[chip_name]['pins']
|
|
||||||
for pin in r['Pin']:
|
for pin in r['Pin']:
|
||||||
pname = pin['@Name']
|
pin_name = pin['@Name']
|
||||||
#print("##", pname);
|
pin_name = pin_name.split(' ', 1)[0]
|
||||||
signals = []
|
pin_name = pin_name.split('-', 1)[0]
|
||||||
if 'Signal' in pin:
|
if 'Signal' in pin:
|
||||||
if type(pin['Signal']) is list:
|
signals = []
|
||||||
for signal in pin['Signal']:
|
if not type(pin['Signal']) is list:
|
||||||
#print("** ", signal)
|
signals.append( pin['Signal'] )
|
||||||
signal_name = signal['@Name']
|
|
||||||
#print(signal_name)
|
|
||||||
signals.append(signal_name)
|
|
||||||
else:
|
else:
|
||||||
#print("** ", pin['Signal']['@Name'])
|
signals = pin['Signal']
|
||||||
signal_name = pin['Signal']['@Name']
|
|
||||||
signals.append(signal_name)
|
|
||||||
pins[pname] = signals
|
|
||||||
|
|
||||||
|
for signal in signals:
|
||||||
|
signal_name = signal['@Name']
|
||||||
|
parts = signal_name.split('_', 1)
|
||||||
|
if len(parts) == 1:
|
||||||
|
continue
|
||||||
|
peri_name = parts[0]
|
||||||
|
signal_name = parts[1]
|
||||||
|
if signal_name.startswith("EXTI"):
|
||||||
|
continue
|
||||||
|
if not peri_name in pins:
|
||||||
|
pins[peri_name] = []
|
||||||
|
entry = OrderedDict({
|
||||||
|
'pin': pin_name,
|
||||||
|
'signal': signal_name,
|
||||||
|
})
|
||||||
|
af_num = find_af(gpio_af, peri_name, pin_name, signal_name)
|
||||||
|
if af_num is not None:
|
||||||
|
entry['af'] = af_num
|
||||||
|
|
||||||
|
pins[peri_name].append( entry )
|
||||||
|
|
||||||
|
|
||||||
for chip_name, chip in chips.items():
|
for chip_name, chip in chips.items():
|
||||||
|
print(f'* processing chip {chip_name}')
|
||||||
rcc = chip['rcc']
|
rcc = chip['rcc']
|
||||||
del chip['rcc']
|
del chip['rcc']
|
||||||
|
|
||||||
# shuffle pin assignments
|
|
||||||
pins = chip['pins']
|
|
||||||
del chip['pins']
|
|
||||||
|
|
||||||
h = find_header(chip_name)
|
h = find_header(chip_name)
|
||||||
if h is None:
|
if h is None:
|
||||||
raise Exception("missing header for {}".format(chip_name))
|
raise Exception("missing header for {}".format(chip_name))
|
||||||
@ -427,12 +445,18 @@ def parse_chips():
|
|||||||
if block := match_peri(chip_name+':'+pname+':'+pkind):
|
if block := match_peri(chip_name+':'+pname+':'+pkind):
|
||||||
p['block'] = block
|
p['block'] = block
|
||||||
|
|
||||||
if block is not None and block.startswith("dac_"):
|
#if block is not None and block.startswith("dac_"):
|
||||||
for pin in pins:
|
#peri_pins = []
|
||||||
if pname + "_OUT1" in pins[pin]:
|
#dac_out_pins = find_signal_pins(chip, pname + "_OUT([0-9]+)")
|
||||||
p['dac_out1'] = pin
|
#for (out_pin, m) in dac_out_pins:
|
||||||
if pname + "_OUT2" in pins[pin]:
|
#peri_pins.append( OrderedDict({
|
||||||
p['dac_out2'] = pin
|
#"pin": out_pin,
|
||||||
|
#"function": "Ch" + m[1],
|
||||||
|
#}) )
|
||||||
|
|
||||||
|
if pname in chip['pins']:
|
||||||
|
if len(chip['pins'][pname]) > 0:
|
||||||
|
p['pins'] = chip['pins'][pname]
|
||||||
|
|
||||||
peris[pname] = p
|
peris[pname] = p
|
||||||
|
|
||||||
@ -505,10 +529,15 @@ def parse_chips():
|
|||||||
peris['CRS'] = crs_peri
|
peris['CRS'] = crs_peri
|
||||||
chip['peripherals'] = peris
|
chip['peripherals'] = peris
|
||||||
|
|
||||||
|
# remove all pins from the root of the chip before emitting.
|
||||||
|
del chip['pins']
|
||||||
|
|
||||||
with open('data/chips/'+chip_name+'.yaml', 'w') as f:
|
with open('data/chips/'+chip_name+'.yaml', 'w') as f:
|
||||||
f.write(yaml.dump(chip))
|
f.write(yaml.dump(chip))
|
||||||
|
|
||||||
|
|
||||||
|
af = {}
|
||||||
|
|
||||||
def parse_gpio_af():
|
def parse_gpio_af():
|
||||||
os.makedirs('data/gpio_af', exist_ok=True)
|
os.makedirs('data/gpio_af', exist_ok=True)
|
||||||
for f in glob('sources/cubedb/mcu/IP/GPIO-*_gpio_v1_0_Modes.xml'):
|
for f in glob('sources/cubedb/mcu/IP/GPIO-*_gpio_v1_0_Modes.xml'):
|
||||||
@ -551,10 +580,10 @@ def parse_gpio_af():
|
|||||||
with open('data/gpio_af/'+ff+'.yaml', 'w') as f:
|
with open('data/gpio_af/'+ff+'.yaml', 'w') as f:
|
||||||
f.write(yaml.dump(pins))
|
f.write(yaml.dump(pins))
|
||||||
|
|
||||||
|
af[ff] = pins
|
||||||
|
|
||||||
clocks = {}
|
clocks = {}
|
||||||
|
|
||||||
|
|
||||||
def parse_clocks():
|
def parse_clocks():
|
||||||
for f in glob('sources/cubedb/mcu/IP/RCC-*rcc_v1_0_Modes.xml'):
|
for f in glob('sources/cubedb/mcu/IP/RCC-*rcc_v1_0_Modes.xml'):
|
||||||
ff = removeprefix(f, 'sources/cubedb/mcu/IP/RCC-')
|
ff = removeprefix(f, 'sources/cubedb/mcu/IP/RCC-')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user