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.
Этот коммит содержится в:
родитель
9fa08bf51d
коммит
d841daa32b
1 изменённых файлов: 16 добавлений и 8 удалений
|
@ -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
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче