import sys import yaml import re import os import re abspath = os.path.abspath(__file__) dname = os.path.dirname(abspath) os.chdir(dname) data_path = '../stm32-data/data' try: _, chip_name, output_file = sys.argv except: raise Exception("Usage: gen.py STM32F429ZI path/to/generated.rs") # ======= load chip chip_name = chip_name.upper() with open(f'{data_path}/chips/{chip_name}.yaml', 'r') as f: chip = yaml.load(f, Loader=yaml.CSafeLoader) # ======= load GPIO AF with open(f'{data_path}/gpio_af/{chip["gpio_af"]}.yaml', 'r') as f: af = yaml.load(f, Loader=yaml.CSafeLoader) # ======= Generate! with open(output_file, 'w') as f: singletons = [] # USART1, PA5, EXTI8 exti_interrupts = [] # EXTI IRQs, EXTI0, EXTI4_15 etc. pins = set() # set of all present pins. PA4, PA5... # ========= peripherals singletons.extend((f'EXTI{x}' for x in range(16))) num_dmas = 0 for (name, peri) in chip['peripherals'].items(): if 'block' not in peri: continue block = peri['block'] block_mod, block_name_unparsed = block.rsplit('/') block_mod, block_version = block_mod.rsplit('_') block_name = '' for b in block_name_unparsed.split('_'): block_name += b.capitalize() custom_singletons = False if block_mod == 'gpio': custom_singletons = True port = name[4:] port_num = ord(port) - ord('A') for pin_num in range(16): pin = f'P{port}{pin_num}' pins.add(pin) singletons.append(pin) if block_mod == 'dma': custom_singletons = True num_dmas += 1 dma_num = int(name[3:])-1 # substract 1 because we want DMA1=0, DMA2=1 for ch_num in range(8): channel = f'{name}_CH{ch_num}' singletons.append(channel) f.write(f'impl_dma_channel!({channel}, {dma_num}, {ch_num});') if not custom_singletons: singletons.append(name) f.write(f"embassy_extras::peripherals!({','.join(singletons)});")