tools/gen-device-svd: emit correct Go code for stm32

Groups were not recognized because the parser only looked at the
derivedFrom attribute and not at <groupName> tags for matching
peripherals.
Этот коммит содержится в:
Ayke van Laethem 2018-09-22 01:05:22 +02:00
родитель 9fa08bf51d
коммит d841daa32b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED

Просмотреть файл

@ -41,6 +41,7 @@ def readSVD(path):
device.peripherals = [] device.peripherals = []
peripheralDict = {} peripheralDict = {}
groups = {}
interrupts = OrderedDict() interrupts = OrderedDict()
@ -52,25 +53,29 @@ def readSVD(path):
description = formatText(getText(descriptionTags[0])) description = formatText(getText(descriptionTags[0]))
baseAddress = int(getText(periphEl.getElementsByTagName('baseAddress')[0]), 0) baseAddress = int(getText(periphEl.getElementsByTagName('baseAddress')[0]), 0)
groupNameTags = periphEl.getElementsByTagName('groupName') groupNameTags = periphEl.getElementsByTagName('groupName')
groupName = name groupName = None
if groupNameTags: if groupNameTags:
groupName = getText(groupNameTags[0]) groupName = getText(groupNameTags[0])
if periphEl.hasAttribute('derivedFrom'): if periphEl.hasAttribute('derivedFrom') or groupName in groups:
derivedFromName = periphEl.getAttribute('derivedFrom') if periphEl.hasAttribute('derivedFrom'):
derivedFrom = peripheralDict[derivedFromName] derivedFromName = periphEl.getAttribute('derivedFrom')
derivedFrom = peripheralDict[derivedFromName]
else:
derivedFrom = groups[groupName]
peripheral = { peripheral = {
'name': name, 'name': name,
'groupName': derivedFrom['groupName'], 'groupName': derivedFrom['groupName'],
'description': description if description is not None else derivedFrom['description'], 'description': description or derivedFrom['description'],
'baseAddress': baseAddress, 'baseAddress': baseAddress,
} }
device.peripherals.append(peripheral) device.peripherals.append(peripheral)
peripheralDict[name] = peripheral
continue continue
peripheral = { peripheral = {
'name': name, 'name': name,
'groupName': groupName, 'groupName': groupName or name,
'description': description, 'description': description,
'baseAddress': baseAddress, 'baseAddress': baseAddress,
'registers': [], 'registers': [],
@ -78,6 +83,9 @@ def readSVD(path):
device.peripherals.append(peripheral) device.peripherals.append(peripheral)
peripheralDict[name] = peripheral peripheralDict[name] = peripheral
if groupName and groupName not in groups:
groups[groupName] = peripheral
for interrupt in periphEl.getElementsByTagName('interrupt'): for interrupt in periphEl.getElementsByTagName('interrupt'):
intrName = getText(interrupt.getElementsByTagName('name')[0]) intrName = getText(interrupt.getElementsByTagName('name')[0])
intrIndex = int(getText(interrupt.getElementsByTagName('value')[0])) intrIndex = int(getText(interrupt.getElementsByTagName('value')[0]))
@ -96,7 +104,7 @@ def readSVD(path):
if regsEls: if regsEls:
for el in regsEls[0].childNodes: for el in regsEls[0].childNodes:
if el.nodeName == 'register': if el.nodeName == 'register':
peripheral['registers'].append(parseSVDRegister(groupName, el, baseAddress)) peripheral['registers'].append(parseSVDRegister(groupName or name, el, baseAddress))
elif el.nodeName == 'cluster': elif el.nodeName == 'cluster':
if el.getElementsByTagName('dim'): if el.getElementsByTagName('dim'):
continue # TODO continue # TODO
@ -104,7 +112,7 @@ def readSVD(path):
clusterOffset = int(getText(el.getElementsByTagName('addressOffset')[0]), 0) clusterOffset = int(getText(el.getElementsByTagName('addressOffset')[0]), 0)
for regEl in el.childNodes: for regEl in el.childNodes:
if regEl.nodeName == 'register': if regEl.nodeName == 'register':
peripheral['registers'].append(parseSVDRegister(groupName, regEl, baseAddress + clusterOffset, clusterPrefix)) peripheral['registers'].append(parseSVDRegister(groupName or name, regEl, baseAddress + clusterOffset, clusterPrefix))
else: else:
continue continue