182 lines
7.7 KiB
Python
Executable File
182 lines
7.7 KiB
Python
Executable File
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 <stdint.h>', 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)
|