178 lines
5 KiB
Python
178 lines
5 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
__author__ = 'Fabien Poussin'
|
|
__version__ = '0.1'
|
|
|
|
from os.path import expanduser, sep, dirname, abspath
|
|
from argparse import ArgumentParser
|
|
import re
|
|
|
|
parser = ArgumentParser(description='Update ChibiOS halconf and mcuconf from STM32CubeMX project files.')
|
|
parser.add_argument('cube', type=str, help='STM32CubeMX project file')
|
|
parser.add_argument('cfg', type=str, help='Chibios config files folder')
|
|
|
|
# Always enable
|
|
ALWAYS = ('PAL', 'EXTI')
|
|
|
|
# In case IPs don't match hal names, or if you want to override (ie: use SERIAL instead of UART driver)
|
|
HAL_TRANSLATE = (
|
|
('USB', 'USB_OTG_FS'),
|
|
('USB', 'USB_OTG_HS'),
|
|
('SDC', 'SDMMC'),
|
|
('TRNG', 'RNG'),
|
|
('WSPI', 'QUADSPI'),
|
|
('WDG', 'IWDG'),
|
|
('UART', 'USART')
|
|
)
|
|
|
|
DRIVER_TRANSLATE = (
|
|
('SDC', 'SDMMC'),
|
|
('SERIAL', r'U(S)?ART'),
|
|
('UART', r'U(S)?ART'),
|
|
('USB', 'OTG'),
|
|
('PWM', 'TIM'),
|
|
('ICU', 'TIM'),
|
|
('GPT', 'TIM'),
|
|
('WDG', 'IWDG'),
|
|
('WSPI', 'QUADSPI'),
|
|
('RNG', 'RNG')
|
|
)
|
|
|
|
RCC_TRANSLATE = (
|
|
('HPRE', 'HCLK'),
|
|
('PPRE1', 'APB1CLKDivider'),
|
|
('PPRE2', 'APB2CLKDivider'),
|
|
('SW', 'SYSCLKSource'),
|
|
('SDMMC1SEL', 'SDMMCClockSelection'),
|
|
('PLLM_VALUE', 'PLLM'),
|
|
('PLLN_VALUE', 'PLLN'),
|
|
('PLLQ_VALUE', 'PLLQ'),
|
|
('PLLSAIN_VALUE', 'PLLSAIN'),
|
|
('PLLSAIR_VALUE', 'PLLSAIR'),
|
|
('MCO1SEL', 'RCC_MCO1Source'),
|
|
('MCO2SEL', 'RCC_MCO2Source'),
|
|
('PLLI2SN_VALUE', 'PLLI2SN'),
|
|
)
|
|
|
|
def translate_hal(ip):
|
|
for h in HAL_TRANSLATE:
|
|
if re.search(h[1], ip, re.M):
|
|
return h[0]
|
|
return ip
|
|
|
|
def translate_driver(ip):
|
|
for d in DRIVER_TRANSLATE:
|
|
if re.search(d[0], ip, re.M):
|
|
return d[1]
|
|
return ip
|
|
|
|
def set_boolean_define(line, match, name, value):
|
|
if name in line and re.search(match, line, re.M):
|
|
if value == True:
|
|
line = line.replace('FALSE', 'TRUE')
|
|
else:
|
|
line = line.replace('TRUE', 'FALSE')
|
|
print(line.strip())
|
|
return line
|
|
|
|
def get_hal_devices(source):
|
|
out = []
|
|
for line in source:
|
|
if '#define HAL_USE_' in line:
|
|
l = line.split(' ')
|
|
dev = ('_').join(l[1].split('_')[2:])
|
|
if dev not in out:
|
|
out.append(dev)
|
|
return out
|
|
|
|
def get_enabled_drivers(source, hal_devices):
|
|
out = {}
|
|
for line in source:
|
|
if line.startswith('Mcu.IP'):
|
|
ip_only = re.search(r"^Mcu.IP\d+=((I2C|[A-Z]+_?)+)(\d)?", line) # Extract ip name separated from periph number
|
|
if ip_only:
|
|
dev = translate_hal(ip_only.group(1)) # periph name
|
|
dev_num = ip_only.group(3) # periph number
|
|
if dev in hal_devices:
|
|
if dev not in out.keys():
|
|
out[dev] = []
|
|
if dev_num:
|
|
out[dev].append(dev_num)
|
|
return out
|
|
|
|
def get_rcc(source):
|
|
out = {}
|
|
|
|
return out
|
|
|
|
def update_hal(source, drivers):
|
|
match = '#define HAL_USE_'
|
|
for i in range(len(source)):
|
|
line = source[i]
|
|
if line.startswith(match):
|
|
if "TRUE" in line:
|
|
source[i] = line.replace('TRUE', 'FALSE')
|
|
|
|
for d in drivers:
|
|
source[i] = set_boolean_define(source[i], match, d, True)
|
|
|
|
return source
|
|
|
|
def update_drivers(source, drivers):
|
|
for i in range(len(source)):
|
|
line = source[i]
|
|
if '_USE_' in line:
|
|
if 'TRUE' in line:
|
|
source[i] = line.replace('TRUE', 'FALSE')
|
|
|
|
for driver, instances in drivers.items():
|
|
if instances:
|
|
for inst in instances:
|
|
periph = translate_driver(driver)
|
|
match = 'STM32_{0}_USE_{1}{2}'.format(driver, periph, inst)
|
|
source[i] = set_boolean_define(source[i], match, driver, True)
|
|
else:
|
|
periph = translate_driver(driver)
|
|
match = 'STM32_{0}_USE_{1}'.format(driver, periph)
|
|
source[i] = set_boolean_define(source[i], match, driver, True)
|
|
|
|
return source
|
|
|
|
def update_rcc(source, rcc):
|
|
# TODO
|
|
return source
|
|
|
|
if __name__ == '__main__':
|
|
args = parser.parse_args()
|
|
cur_path = dirname(abspath(__file__))
|
|
|
|
halconf_path = args.cfg + '/halconf.h'
|
|
mcuconf_path = args.cfg + '/mcuconf.h'
|
|
|
|
with open(args.cube, 'r') as f:
|
|
project = f.readlines()
|
|
|
|
with open(halconf_path, 'r') as f:
|
|
halconf = f.readlines()
|
|
|
|
with open(mcuconf_path, 'r') as f:
|
|
mcuconf = f.readlines()
|
|
|
|
hal_devices = get_hal_devices(halconf)
|
|
enabled_drivers = get_enabled_drivers(project, hal_devices)
|
|
rcc = get_rcc(project)
|
|
|
|
for a in ALWAYS:
|
|
enabled_drivers[a] = []
|
|
|
|
# Update and save halconf
|
|
halconf = update_hal(halconf, enabled_drivers)
|
|
with open(halconf_path, 'w') as f:
|
|
f.write("".join(halconf))
|
|
|
|
# Update and save mcuconf drivers
|
|
mcuconf = update_drivers(mcuconf, enabled_drivers)
|
|
mcuconf = update_rcc(mcuconf, rcc)
|
|
with open(mcuconf_path, 'w') as f:
|
|
f.write("".join(mcuconf))
|