mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-12-19 16:31:27 +01:00
Since turning from old build flow. New Altera SoCFPGA requires converting handsoff conversion via the python script. This is from official provided, and now sync to U-Boot with better location at tools/cv_xxxx. Meantime, requirement.txt is also provided to further explain the libraries require for these scripts. Signed-off-by: Brian Sune <briansune@gmail.com> Reviewed-by: Tien Fong Chee <tien.fong.chee@altera.com>
115 lines
3.6 KiB
Python
Executable File
115 lines
3.6 KiB
Python
Executable File
# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
|
"""
|
|
Data models for XML files required for generating a preloader.
|
|
|
|
These classes encapsulate the complexities of XML DOM in order to
|
|
make retrieving data from XML files easier and more reliable.
|
|
By shielding data model deserialization from data consumers,
|
|
it'd be easier to switch to other formats such as JSON if required.
|
|
|
|
There are some assumptions about how these XML files are structured
|
|
such as the hierarchy of elements and ordering of attributes, these
|
|
are relatively safe assumptions for as long as the XML files are
|
|
always generated by HPS megawizard (isw.tcl) and are not hand-edited.
|
|
|
|
Copyright (C) 2022 Intel Corporation <www.intel.com>
|
|
|
|
Author: Lee, Kah Jing <kah.jing.lee@intel.com>
|
|
"""
|
|
import xml.dom.minidom
|
|
|
|
def getSingletonElementByTagName(parent, tagName):
|
|
"""
|
|
Find tag by name and ensure that there is exactly one match
|
|
"""
|
|
nodes = parent.getElementsByTagName(tagName)
|
|
|
|
if len(nodes) == 0:
|
|
raise Exception("Can't find element: " + tagName)
|
|
elif len(nodes) > 1:
|
|
raise Exception("Unexpected multiple matches for singleton element: " + tagName)
|
|
else:
|
|
return nodes[0]
|
|
|
|
class hps(object):
|
|
"""
|
|
Data model for hps.xml
|
|
"""
|
|
@staticmethod
|
|
def create(file):
|
|
""" hps model """
|
|
return hps(file)
|
|
|
|
def __init__(self, file):
|
|
""" hps model initialization """
|
|
self.dom = xml.dom.minidom.parse(file)
|
|
|
|
try:
|
|
# Look for <hps> node
|
|
self.hpsNode = getSingletonElementByTagName(self.dom, "hps")
|
|
# Look for <hps><system> node
|
|
self.hpsSystemNode = getSingletonElementByTagName(self.hpsNode, "system")
|
|
except Exception:
|
|
raise Exception("Can't initialize from file: " + file)
|
|
|
|
def getSystemConfig(self, param):
|
|
""" parse system configuration tag """
|
|
hpsSystemConfigNode = None
|
|
|
|
# Look for <hps><system><config ...> nodes
|
|
for node in self.hpsSystemNode.getElementsByTagName("config"):
|
|
# assume name is the first attribute as in <config name="..." ...>
|
|
nameAttrNode = node.attributes.item(0)
|
|
if nameAttrNode.nodeName == "name" and nameAttrNode.nodeValue == param:
|
|
# assume value is the second attribute as in <config name="..." value="...">
|
|
valueAttrNode = node.attributes.item(1)
|
|
if valueAttrNode.nodeName == "value":
|
|
hpsSystemConfigNode = valueAttrNode
|
|
break
|
|
|
|
if hpsSystemConfigNode == None:
|
|
raise ValueError("Can't find <hps><system><config> node: " + param)
|
|
|
|
return hpsSystemConfigNode.nodeValue
|
|
|
|
class emif(object):
|
|
"""
|
|
Data model for emif.xml.
|
|
"""
|
|
@staticmethod
|
|
def create(file):
|
|
""" emif model """
|
|
return emif(file)
|
|
|
|
def __init__(self, file):
|
|
""" emif model initialization """
|
|
self.dom = xml.dom.minidom.parse(file)
|
|
|
|
try:
|
|
# Look for <emif> node
|
|
self.emifNode = getSingletonElementByTagName(self.dom, "emif")
|
|
# Look for <emif><pll> node
|
|
self.emifPllNode = getSingletonElementByTagName(self.emifNode, "pll")
|
|
except Exception:
|
|
raise Exception("Can't initialize from file: " + file)
|
|
|
|
def getPllDefine(self, param):
|
|
""" parse pll define tag """
|
|
emifPllDefineNode = None
|
|
|
|
# Look for <emif><pll><define ...> nodes
|
|
for node in self.emifPllNode.getElementsByTagName("define"):
|
|
nameAttrNode = node.attributes.item(0)
|
|
# assume name is the first attribute as in <define name="..." ...>
|
|
if nameAttrNode.nodeName == "name" and nameAttrNode.nodeValue == param:
|
|
# assume value is the second attribute as in <config name="..." value="...">
|
|
valueAttrNode = node.attributes.item(1)
|
|
if valueAttrNode.nodeName == "value":
|
|
emifPllDefineNode = valueAttrNode
|
|
break
|
|
|
|
if emifPllDefineNode == None:
|
|
raise Exception("Can't find EMIF PLL define node: " + param)
|
|
|
|
return emifPllDefineNode.nodeValue
|