This repository has been archived on 2024-05-28. You can view files and clone it, but cannot push or open issues or pull requests.
stm32u5_cargo/stm32u5/svd_proc.py
2023-11-14 16:25:09 -05:00

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)