You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
5.3 KiB
231 lines
5.3 KiB
9 years ago
|
|
||
|
from cmsis_svd.parser import SVDParser
|
||
|
import json
|
||
|
import re
|
||
|
|
||
|
# ------------------------------------
|
||
|
|
||
|
# ~ $ ls /usr/lib/python3.5/site-packages/cmsis_svd/data/STMicro/
|
||
|
# Contents.txt STM32F091x.svd STM32F105xx.svd STM32F303xE.svd STM32F401x.svd STM32F437x.svd STM32L053x.svd STM32L15xxxA.svd
|
||
|
# License.html STM32F0xx.svd STM32F107xx.svd STM32F303x.svd STM32F40x.svd STM32F439x.svd STM32L062x.svd STM32L1xx.svd
|
||
|
# STM32F030.svd STM32F100xx.svd STM32F20x.svd STM32F30x.svd STM32F411xx.svd STM32F446x.svd STM32L063x.svd STM32L4x6.svd
|
||
|
# STM32F031x.svd STM32F101xx.svd STM32F21x.svd STM32F334x.svd STM32F41x.svd STM32F46_79x.svd STM32L100.svd STM32W108.svd
|
||
|
# STM32F042x.svd STM32F102xx.svd STM32F301x.svd STM32F37x.svd STM32F427x.svd STM32L051x.svd STM32L15xC.svd
|
||
|
# STM32F072x.svd STM32F103xx.svd STM32F302x.svd STM32F401xE.svd STM32F429x.svd STM32L052x.svd STM32L15xxE.svd
|
||
|
|
||
|
|
||
|
svd_name = 'STM32F100xx.svd'
|
||
|
|
||
|
want_ofs = True
|
||
|
want_len = True
|
||
|
|
||
|
# Do not print poripheral field definitions (same as first instance)
|
||
|
no_print_fields = [
|
||
|
'GPIOB',
|
||
|
'GPIOC',
|
||
|
'GPIOD',
|
||
|
'GPIOE',
|
||
|
'GPIOF',
|
||
|
'GPIOG',
|
||
|
'GPIOH',
|
||
|
'USART2',
|
||
|
'USART3',
|
||
|
'USART4',
|
||
|
'USART5',
|
||
|
'SPI2',
|
||
|
'SPI3',
|
||
|
'TIM3',
|
||
|
'DAC2',
|
||
|
'SPI2',
|
||
|
'SPI3',
|
||
|
'ADC2',
|
||
|
'ADC3',
|
||
|
'ADC4',
|
||
|
'ADC34',
|
||
|
'I2C2',
|
||
|
'I2C3',
|
||
|
]
|
||
|
|
||
|
# Rename peripheral when building field definitions
|
||
|
# Used for multiple instances (build fields only for the first)
|
||
|
periph_rename_for_field = {
|
||
|
'GPIOA': 'GPIO',
|
||
|
'USART1': 'USART',
|
||
|
'DAC1': 'DAC',
|
||
|
'SPI1': 'SPI',
|
||
|
'ADC1': 'ADC',
|
||
|
'ADC12': 'ADCC',
|
||
|
'I2C1': 'I2C'
|
||
|
}
|
||
|
|
||
|
# Same registers as... (points to first instance)
|
||
|
same_regs_as = {
|
||
|
'GPIOB': 'GPIOA',
|
||
|
'GPIOC': 'GPIOA',
|
||
|
'GPIOD': 'GPIOA',
|
||
|
'GPIOE': 'GPIOA',
|
||
|
'GPIOF': 'GPIOA',
|
||
|
'GPIOG': 'GPIOA',
|
||
|
'GPIOH': 'GPIOA',
|
||
|
'USART2': 'USART1',
|
||
|
'USART3': 'USART1',
|
||
|
'USART4': 'USART1',
|
||
|
'USART5': 'USART1',
|
||
|
'DAC2': 'DAC1',
|
||
|
'SPI2': 'SPI1',
|
||
|
'SPI3': 'SPI1',
|
||
|
'ADC2': 'ADC1',
|
||
|
'ADC3': 'ADC1',
|
||
|
'ADC4': 'ADC1',
|
||
|
'I2C2': 'I2C1',
|
||
|
'I2C3': 'I2C1',
|
||
|
'ADC34': 'ADC12',
|
||
|
'ADC2': 'ADC1',
|
||
|
'ADC3': 'ADC1',
|
||
|
'ADC4': 'ADC1',
|
||
|
'TIM3': 'TIM2',
|
||
|
'TIM4': 'TIM2',
|
||
|
}
|
||
|
|
||
|
# Rename peripheral when generating (bad name in SVD)
|
||
|
periph_rename = {
|
||
|
'ADC1_2': 'ADC12',
|
||
|
'ADC3_4': 'ADC34',
|
||
|
'Flash': 'FLASH'
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
# ------------------------------------
|
||
|
|
||
|
base_line = "{0:<30} EQU {1:#x}"
|
||
|
reg_line = "{0:<30} EQU ({1}_BASE + {2:#x})"
|
||
|
field_line = "{0:<30} EQU {1:#010x}"
|
||
|
field_ofs_line = "{0:<30} EQU {1:#d}"
|
||
|
field_len_line = field_ofs_line
|
||
|
|
||
|
def comment_str(x):
|
||
|
if x is None:
|
||
|
return ''
|
||
|
|
||
|
return '; %s' % re.sub(r"[\s\n]+", ' ', x.replace('\n',' '))
|
||
|
|
||
|
def comment(x):
|
||
|
print(comment_str(x))
|
||
|
|
||
|
def banner(x):
|
||
|
comment('==== {:=<55}'.format("%s " % x))
|
||
|
|
||
|
def caption(x):
|
||
|
print()
|
||
|
comment('---- {:-<55}'.format("%s " % x))
|
||
|
|
||
|
def comment(x):
|
||
|
print(comment_str(x))
|
||
|
|
||
|
|
||
|
# ------------------------------------
|
||
|
|
||
|
parser = SVDParser.for_packaged_svd('STMicro', svd_name)
|
||
|
device = parser.get_device()
|
||
|
|
||
|
print()
|
||
|
banner('%s PERIPHERALS' % device.name)
|
||
|
comment('')
|
||
|
comment('CTU Prague, FEL, Department of Measurement')
|
||
|
comment('')
|
||
|
comment('-' * 60)
|
||
|
comment('')
|
||
|
comment('Generated from "%s"' % svd_name)
|
||
|
comment('')
|
||
|
comment('SVD parsing library (c) Paul Osborne, 2015-2016')
|
||
|
comment(' https://github.com/posborne/cmsis-svd')
|
||
|
comment('ASM building script (c) Ondrej Hruska, 2016')
|
||
|
comment('')
|
||
|
comment('=' * 60)
|
||
|
print()
|
||
|
|
||
|
|
||
|
|
||
|
# periph registers
|
||
|
def print_registers(peripheral, pname=None):
|
||
|
if pname is None:
|
||
|
pname = periph_rename.get(peripheral.name, peripheral.name)
|
||
|
|
||
|
for register in peripheral.registers:
|
||
|
print(reg_line.format("%s_%s" % (pname, register.name), pname, register.address_offset), end=' ')
|
||
|
comment(register.description)
|
||
|
|
||
|
|
||
|
# periph fields
|
||
|
def print_fields(peripheral, pname=None):
|
||
|
if pname is None:
|
||
|
pname = periph_rename.get(peripheral.name, peripheral.name)
|
||
|
|
||
|
for register in peripheral.registers:
|
||
|
|
||
|
print()
|
||
|
comment('%s_%s fields:' % (pname, register.name))
|
||
|
print()
|
||
|
|
||
|
for field in register.fields:
|
||
|
mask = ((1 << field.bit_width) - 1) << field.bit_offset
|
||
|
|
||
|
f_pname = periph_rename_for_field.get(pname, pname)
|
||
|
|
||
|
print(field_line.format("%s_%s_%s" % (f_pname, register.name, field.name), mask), end=' ')
|
||
|
comment(field.description)
|
||
|
|
||
|
if want_ofs:
|
||
|
print(field_ofs_line.format("%s_%s_%s_ofs" % (f_pname, register.name, field.name), field.bit_offset))
|
||
|
|
||
|
if want_len:
|
||
|
print(field_len_line.format("%s_%s_%s_len" % (f_pname, register.name, field.name), field.bit_width))
|
||
|
|
||
|
print()
|
||
|
|
||
|
|
||
|
# Print the list
|
||
|
|
||
|
periph_dict = {}
|
||
|
|
||
|
for peripheral in device.peripherals:
|
||
|
|
||
|
periph_name = periph_rename.get(peripheral.name, peripheral.name)
|
||
|
|
||
|
# add to a dict for referencing by name
|
||
|
periph_dict[periph_name] = peripheral
|
||
|
|
||
|
# -----
|
||
|
caption(periph_name)
|
||
|
comment('Desc: %s' % peripheral.description)
|
||
|
|
||
|
print()
|
||
|
comment('%s base address:' % periph_name)
|
||
|
print(base_line.format("%s_BASE" % periph_name, peripheral.base_address))
|
||
|
|
||
|
|
||
|
print()
|
||
|
comment('%s registers:' % periph_name)
|
||
|
print()
|
||
|
|
||
|
# Registers
|
||
|
if periph_name in same_regs_as:
|
||
|
print_registers(periph_dict[same_regs_as[periph_name]], pname=periph_name)
|
||
|
else:
|
||
|
print_registers(peripheral)
|
||
|
|
||
|
|
||
|
if periph_name in no_print_fields:
|
||
|
comment('Fields the same as in the first instance.')
|
||
|
continue
|
||
|
|
||
|
# Fields
|
||
|
if periph_name in same_regs_as:
|
||
|
print_fields(periph_dict[same_regs_as[periph_name]], pname=periph_name)
|
||
|
else:
|
||
|
print_fields(peripheral)
|
||
|
|
||
|
print(' END\n')
|