from cmsis_svd.parser import SVDParser # parser = SVDParser.for_packaged_svd('STMicro', 'STM32F103xx.svd') # parser for local SVD file parser = SVDParser.for_xml_file('./svd/stm32u575.svd') done: set = set() for peripheral in parser.get_device().peripherals: prep_struct = 'typedef struct {\n' # if peripheral name end with number, remove number if peripheral.name[-1].isdigit() or peripheral.name.startswith('GPIO'): peripheral.name = peripheral.name[:-1] if peripheral.name in done: continue done.add(peripheral.name) import os os.makedirs(f'includes/u575xx', exist_ok=True) with open(f'includes/u575xx/reg_{peripheral.name.lower()}_gen.h', 'w') as f: print(f'#include ', end='\n\n', file=f) peripheral.registers.sort(key=lambda x: x.address_offset) # sort the registers by address_offset reg_offset = 0 reg_resv_count = 0 for register in peripheral.registers: register_name = register.name print('typedef struct {', end='\n', file=f) register.fields.sort(key=lambda x: x.bit_offset) # sort the fields by bit_offset start = 0 resv_count = 0 for field in register.fields: if field.bit_offset != start: print(' uint32_t ', f'reserve{resv_count}', end=f'{" " * (10 - len(f"reserve{resv_count}"))}', file=f) print(':', field.bit_offset - start, end=f';{" " * (3 - len(str(register.size - start)))}', file=f) print(f'// {start} {" " * (3 - len(str(start)))} Reserve', end='\n', file=f) resv_count += 1 start = field.bit_offset + field.bit_width print(' uint32_t ', field.name.lower(), end=f'{" " * (10 - len(field.name))}', file=f) print(':', field.bit_width, end=f';{" " * (3 - len(str(field.bit_width)))}', file=f) print('//', field.bit_offset, end='\t', file=f) if field.description is None: field.description = '' field.description = field.description.replace('\n', ' ') field.description = ' '.join(field.description.split()) print('', field.description, end='\n', file=f) if start != register.size: print(' uint32_t ', f'reserve{resv_count}', end=f'{" " * (10 - len(f"reserve{resv_count}"))}', file=f) print(':', register.size - start, end=f';{" " * (3 - len(str(register.size - start)))}', file=f) print(f'// {start} {" " * (3 - len(str(start)))} Reserve', end='\n', file=f) if register_name.startswith(peripheral.name): register_name = register_name[len(peripheral.name) + 1:] print(f'}} reg_{peripheral.name.lower()}_{register_name.lower()}_t;', end='\n\n', file=f) if register.address_offset != reg_offset: # add reserve base on offset number = (register.address_offset - reg_offset) // 4 prep_struct += f' volatile uint32_t reserve{reg_resv_count}[{number}];\n' reg_resv_count += 1 prep_struct += f' volatile reg_{peripheral.name.lower()}_{register_name.lower()}_t {register_name.lower()};\n' reg_offset = register.address_offset + 4 prep_struct += f'}} reg_{peripheral.name.lower()}_t;' print(prep_struct, end='\n\n', file=f) # ## modification for gpdma (reg_gpmda_gen.h) # 1. remove from line 216(define for ch1) to end # 2. remove all 'c0' if the character before 'c0' is ' ' or '_' liens = [] with open(f'includes/u575xx/reg_gpdma_gen.h', 'r') as f: lines = f.readlines() # find reg_gpdma_c0llr_t end = 0 for i, line in enumerate(lines): if line.startswith('} reg_gpdma_c0llr_t;'): end = i break with open(f'includes/u575xx/reg_gpdma_gen.h', 'w') as f: f.writelines(lines[:end + 1]) with open(f'includes/u575xx/reg_gpdma_gen.h', 'r') as f: data = f.read() # remove all c0 if previous is ' ' or '_' struct_text = """ typedef struct { volatile reg_gpdma_lbar_t lbar; volatile uint32_t reserve1[2]; volatile reg_gpdma_fcr_t fcr; volatile reg_gpdma_sr_t sr; volatile reg_gpdma_cr_t cr; volatile uint32_t reserve2[10]; volatile reg_gpdma_tr1_t tr1; volatile reg_gpdma_tr2_t tr2; volatile reg_gpdma_br1_t br1; volatile reg_gpdma_sar_t sar; volatile reg_gpdma_dar_t dar; volatile uint32_t reserve3[10]; volatile reg_gpdma_llr_t llr; } reg_gpdma_ch_t; typedef struct { volatile reg_gpdma_seccfgr_t seccfgr; volatile reg_gpdma_privcfgr_t privcfgr; volatile reg_gpdma_rcfglockr_t rcfglockr; volatile reg_gpdma_misr_t misr; volatile reg_gpdma_smisr_t smisr; } reg_gpdma_t; """ data = data.replace(' c0', ' ') data = data.replace('_c0', '_') with open(f'includes/u575xx/reg_gpdma_gen.h', 'w') as f: f.write(data) f.write(struct_text) # if peripheral.name == 'USART': # # merge enable and disable register # print(''' # typedef union { # reg_usart_cr1_enabled_t enabled; # reg_usart_cr1_disabled_t disabled; # } reg_usart_cr1_t; # # typedef union { # reg_usart_isr_enabled_t isr_enabled; # reg_usart_isr_disabled_t isr_disabled; # } reg_usart_isr_t; # ''', end='\n', file=f) # # print(f'typedef struct {{', end='\n') # print(f'typedef struct {{', end='\n', file=f) # offset = 0 # resv_count = 0 # for register in peripheral.registers: # register_name = register.name # if peripheral.name.lower() == 'adc1': # register_name = register.name[4:] # # if register.address_offset != offset: # # add reserve base on offset # number = (register.address_offset - offset) // 4 # # print(f'register.address_offset: {register.address_offset}, offset: {offset}, number: {number}', file=f) # if number == 1: # print(f' uint32_t resv{resv_count};', end='\n') # print(f' uint32_t resv{resv_count};', end='\n', file=f) # else: # print(f' uint32_t resv{resv_count}[{number}];', end='\n') # print(f' uint32_t resv{resv_count}[{number}];', end='\n', file=f) # resv_count += 1 # offset = register.address_offset + 4 # if peripheral.name == 'USART' and ( # register_name.lower() == 'cr1_enabled' or register_name.lower() == 'cr1_disabled') or ( # register_name.lower() == 'isr_enabled' or register_name.lower() == 'isr_disabled'): # if register_name.lower() == 'cr1_disabled' or register_name.lower() == 'isr_disabled': # continue # if register_name.lower() == 'cr1_enabled': # print(f' reg_usart_cr1_t cr1;', end='\n') # print(f' reg_usart_cr1_t cr1;', end='\n', file=f) # if register_name.lower() == 'isr_enabled': # print(f' reg_usart_isr_t isr;', end='\n') # print(f' reg_usart_isr_t isr;', end='\n', file=f) # continue # print(f' reg_{peripheral.name.lower()}_{register_name.lower()}_t {register_name.lower()};', end='\n') # print(f' reg_{peripheral.name.lower()}_{register_name.lower()}_t {register_name.lower()};', end='\n', # file=f) # print(f'}} reg_{peripheral.name.lower()}_t;', end='\n\n') # print(f'}} reg_{peripheral.name.lower()}_t;', end='\n\n', file=f)