|
@@ -72,6 +72,60 @@ def tab_to(num_tabs, line):
|
|
|
return line + ' '
|
|
|
return line + '\t' * (num_tabs - len(line) // 8)
|
|
|
|
|
|
+def get_value(ftype, value):
|
|
|
+ """Get a value as a C expression
|
|
|
+
|
|
|
+ For integers this returns a byte-swapped (little-endian) hex string
|
|
|
+ For bytes this returns a hex string, e.g. 0x12
|
|
|
+ For strings this returns a literal string enclosed in quotes
|
|
|
+ For booleans this return 'true'
|
|
|
+
|
|
|
+ Args:
|
|
|
+ type: Data type (fdt_util)
|
|
|
+ value: Data value, as a string of bytes
|
|
|
+ """
|
|
|
+ if ftype == fdt.TYPE_INT:
|
|
|
+ return '%#x' % fdt_util.fdt32_to_cpu(value)
|
|
|
+ elif ftype == fdt.TYPE_BYTE:
|
|
|
+ return '%#x' % ord(value[0])
|
|
|
+ elif ftype == fdt.TYPE_STRING:
|
|
|
+ return '"%s"' % value
|
|
|
+ elif ftype == fdt.TYPE_BOOL:
|
|
|
+ return 'true'
|
|
|
+
|
|
|
+def get_compat_name(node):
|
|
|
+ """Get a node's first compatible string as a C identifier
|
|
|
+
|
|
|
+ Args:
|
|
|
+ node: Node object to check
|
|
|
+ Return:
|
|
|
+ Tuple:
|
|
|
+ C identifier for the first compatible string
|
|
|
+ List of C identifiers for all the other compatible strings
|
|
|
+ (possibly empty)
|
|
|
+ """
|
|
|
+ compat = node.props['compatible'].value
|
|
|
+ aliases = []
|
|
|
+ if isinstance(compat, list):
|
|
|
+ compat, aliases = compat[0], compat[1:]
|
|
|
+ return conv_name_to_c(compat), [conv_name_to_c(a) for a in aliases]
|
|
|
+
|
|
|
+def is_phandle(prop):
|
|
|
+ """Check if a node contains phandles
|
|
|
+
|
|
|
+ We have no reliable way of detecting whether a node uses a phandle
|
|
|
+ or not. As an interim measure, use a list of known property names.
|
|
|
+
|
|
|
+ Args:
|
|
|
+ prop: Prop object to check
|
|
|
+ Return:
|
|
|
+ True if the object value contains phandles, else False
|
|
|
+ """
|
|
|
+ if prop.name in ['clocks']:
|
|
|
+ return True
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
class DtbPlatdata(object):
|
|
|
"""Provide a means to convert device tree binary data to platform data
|
|
|
|
|
@@ -139,43 +193,6 @@ class DtbPlatdata(object):
|
|
|
self._lines = []
|
|
|
return lines
|
|
|
|
|
|
- @staticmethod
|
|
|
- def get_value(ftype, value):
|
|
|
- """Get a value as a C expression
|
|
|
-
|
|
|
- For integers this returns a byte-swapped (little-endian) hex string
|
|
|
- For bytes this returns a hex string, e.g. 0x12
|
|
|
- For strings this returns a literal string enclosed in quotes
|
|
|
- For booleans this return 'true'
|
|
|
-
|
|
|
- Args:
|
|
|
- type: Data type (fdt_util)
|
|
|
- value: Data value, as a string of bytes
|
|
|
- """
|
|
|
- if ftype == fdt.TYPE_INT:
|
|
|
- return '%#x' % fdt_util.fdt32_to_cpu(value)
|
|
|
- elif ftype == fdt.TYPE_BYTE:
|
|
|
- return '%#x' % ord(value[0])
|
|
|
- elif ftype == fdt.TYPE_STRING:
|
|
|
- return '"%s"' % value
|
|
|
- elif ftype == fdt.TYPE_BOOL:
|
|
|
- return 'true'
|
|
|
-
|
|
|
- @staticmethod
|
|
|
- def get_compat_name(node):
|
|
|
- """Get a node's first compatible string as a C identifier
|
|
|
-
|
|
|
- Args:
|
|
|
- node: Node object to check
|
|
|
- Return:
|
|
|
- C identifier for the first compatible string
|
|
|
- """
|
|
|
- compat = node.props['compatible'].value
|
|
|
- aliases = []
|
|
|
- if isinstance(compat, list):
|
|
|
- compat, aliases = compat[0], compat[1:]
|
|
|
- return conv_name_to_c(compat), [conv_name_to_c(a) for a in aliases]
|
|
|
-
|
|
|
def scan_dtb(self):
|
|
|
"""Scan the device tree to obtain a tree of notes and properties
|
|
|
|
|
@@ -219,22 +236,6 @@ class DtbPlatdata(object):
|
|
|
self._valid_nodes = []
|
|
|
return self.scan_node(self._fdt.GetRoot())
|
|
|
|
|
|
- @staticmethod
|
|
|
- def is_phandle(prop):
|
|
|
- """Check if a node contains phandles
|
|
|
-
|
|
|
- We have no reliable way of detecting whether a node uses a phandle
|
|
|
- or not. As an interim measure, use a list of known property names.
|
|
|
-
|
|
|
- Args:
|
|
|
- prop: Prop object to check
|
|
|
- Return:
|
|
|
- True if the object value contains phandles, else False
|
|
|
- """
|
|
|
- if prop.name in ['clocks']:
|
|
|
- return True
|
|
|
- return False
|
|
|
-
|
|
|
def scan_structs(self):
|
|
|
"""Scan the device tree building up the C structures we will use.
|
|
|
|
|
@@ -248,7 +249,7 @@ class DtbPlatdata(object):
|
|
|
"""
|
|
|
structs = {}
|
|
|
for node in self._valid_nodes:
|
|
|
- node_name, _ = self.get_compat_name(node)
|
|
|
+ node_name, _ = get_compat_name(node)
|
|
|
fields = {}
|
|
|
|
|
|
# Get a list of all the valid properties in this node.
|
|
@@ -272,14 +273,14 @@ class DtbPlatdata(object):
|
|
|
|
|
|
upto = 0
|
|
|
for node in self._valid_nodes:
|
|
|
- node_name, _ = self.get_compat_name(node)
|
|
|
+ node_name, _ = get_compat_name(node)
|
|
|
struct = structs[node_name]
|
|
|
for name, prop in node.props.items():
|
|
|
if name not in PROP_IGNORE_LIST and name[0] != '#':
|
|
|
prop.Widen(struct[name])
|
|
|
upto += 1
|
|
|
|
|
|
- struct_name, aliases = self.get_compat_name(node)
|
|
|
+ struct_name, aliases = get_compat_name(node)
|
|
|
for alias in aliases:
|
|
|
self._aliases[alias] = struct_name
|
|
|
|
|
@@ -302,7 +303,7 @@ class DtbPlatdata(object):
|
|
|
if pname in PROP_IGNORE_LIST or pname[0] == '#':
|
|
|
continue
|
|
|
if isinstance(prop.value, list):
|
|
|
- if self.is_phandle(prop):
|
|
|
+ if is_phandle(prop):
|
|
|
# Process the list as pairs of (phandle, id)
|
|
|
value_it = iter(prop.value)
|
|
|
for phandle_cell, _ in zip(value_it, value_it):
|
|
@@ -326,7 +327,7 @@ class DtbPlatdata(object):
|
|
|
self.out('struct %s%s {\n' % (STRUCT_PREFIX, name))
|
|
|
for pname in sorted(structs[name]):
|
|
|
prop = structs[name][pname]
|
|
|
- if self.is_phandle(prop):
|
|
|
+ if is_phandle(prop):
|
|
|
# For phandles, include a reference to the target
|
|
|
self.out('\t%s%s[%d]' % (tab_to(2, 'struct phandle_2_cell'),
|
|
|
conv_name_to_c(prop.name),
|
|
@@ -350,7 +351,7 @@ class DtbPlatdata(object):
|
|
|
Args:
|
|
|
node: node to output
|
|
|
"""
|
|
|
- struct_name, _ = self.get_compat_name(node)
|
|
|
+ struct_name, _ = get_compat_name(node)
|
|
|
var_name = conv_name_to_c(node.name)
|
|
|
self.buf('static struct %s%s %s%s = {\n' %
|
|
|
(STRUCT_PREFIX, struct_name, VAL_PREFIX, var_name))
|
|
@@ -366,7 +367,7 @@ class DtbPlatdata(object):
|
|
|
vals = []
|
|
|
# For phandles, output a reference to the platform data
|
|
|
# of the target node.
|
|
|
- if self.is_phandle(prop):
|
|
|
+ if is_phandle(prop):
|
|
|
# Process the list as pairs of (phandle, id)
|
|
|
value_it = iter(prop.value)
|
|
|
for phandle_cell, id_cell in zip(value_it, value_it):
|
|
@@ -377,11 +378,11 @@ class DtbPlatdata(object):
|
|
|
vals.append('{&%s%s, %d}' % (VAL_PREFIX, name, id_num))
|
|
|
else:
|
|
|
for val in prop.value:
|
|
|
- vals.append(self.get_value(prop.type, val))
|
|
|
+ vals.append(get_value(prop.type, val))
|
|
|
self.buf(', '.join(vals))
|
|
|
self.buf('}')
|
|
|
else:
|
|
|
- self.buf(self.get_value(prop.type, prop.value))
|
|
|
+ self.buf(get_value(prop.type, prop.value))
|
|
|
self.buf(',\n')
|
|
|
self.buf('};\n')
|
|
|
|