71 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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
 | |
|             for ch_num in range(8):
 | |
|                 channel = f'{name}_CH{ch_num}'
 | |
|                 singletons.append(channel)
 | |
| 
 | |
|         if not custom_singletons:
 | |
|             singletons.append(name)
 | |
| 
 | |
|     f.write(f"embassy_extras::peripherals!({','.join(singletons)});")
 |