mirror of
https://xff.cz/git/u-boot/
synced 2025-09-02 09:12:08 +02:00
dtoc: Move BytesToValue() and GetEmpty() into PropBase
These functions are currently in a separate fdt_util file. Since they are only used from PropBase and subclasses, it makes sense for them to be in the PropBase class. Move these functions into fdt.py along with the list of types. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -16,6 +16,7 @@ import sys
|
|||||||
our_path = os.path.dirname(os.path.realpath(__file__))
|
our_path = os.path.dirname(os.path.realpath(__file__))
|
||||||
sys.path.append(os.path.join(our_path, '../patman'))
|
sys.path.append(os.path.join(our_path, '../patman'))
|
||||||
|
|
||||||
|
import fdt
|
||||||
import fdt_select
|
import fdt_select
|
||||||
import fdt_util
|
import fdt_util
|
||||||
|
|
||||||
@@ -33,10 +34,10 @@ PROP_IGNORE_LIST = [
|
|||||||
|
|
||||||
# C type declarations for the tyues we support
|
# C type declarations for the tyues we support
|
||||||
TYPE_NAMES = {
|
TYPE_NAMES = {
|
||||||
fdt_util.TYPE_INT: 'fdt32_t',
|
fdt.TYPE_INT: 'fdt32_t',
|
||||||
fdt_util.TYPE_BYTE: 'unsigned char',
|
fdt.TYPE_BYTE: 'unsigned char',
|
||||||
fdt_util.TYPE_STRING: 'const char *',
|
fdt.TYPE_STRING: 'const char *',
|
||||||
fdt_util.TYPE_BOOL: 'bool',
|
fdt.TYPE_BOOL: 'bool',
|
||||||
};
|
};
|
||||||
|
|
||||||
STRUCT_PREFIX = 'dtd_'
|
STRUCT_PREFIX = 'dtd_'
|
||||||
@@ -138,13 +139,13 @@ class DtbPlatdata:
|
|||||||
type: Data type (fdt_util)
|
type: Data type (fdt_util)
|
||||||
value: Data value, as a string of bytes
|
value: Data value, as a string of bytes
|
||||||
"""
|
"""
|
||||||
if type == fdt_util.TYPE_INT:
|
if type == fdt.TYPE_INT:
|
||||||
return '%#x' % fdt_util.fdt32_to_cpu(value)
|
return '%#x' % fdt_util.fdt32_to_cpu(value)
|
||||||
elif type == fdt_util.TYPE_BYTE:
|
elif type == fdt.TYPE_BYTE:
|
||||||
return '%#x' % ord(value[0])
|
return '%#x' % ord(value[0])
|
||||||
elif type == fdt_util.TYPE_STRING:
|
elif type == fdt.TYPE_STRING:
|
||||||
return '"%s"' % value
|
return '"%s"' % value
|
||||||
elif type == fdt_util.TYPE_BOOL:
|
elif type == fdt.TYPE_BOOL:
|
||||||
return 'true'
|
return 'true'
|
||||||
|
|
||||||
def GetCompatName(self, node):
|
def GetCompatName(self, node):
|
||||||
|
@@ -17,6 +17,9 @@ import fdt_util
|
|||||||
# implementation is in the FdtFallback and FdtNormal subclasses. See
|
# implementation is in the FdtFallback and FdtNormal subclasses. See
|
||||||
# fdt_select.py for how to create an Fdt object.
|
# fdt_select.py for how to create an Fdt object.
|
||||||
|
|
||||||
|
# A list of types we support
|
||||||
|
(TYPE_BYTE, TYPE_INT, TYPE_STRING, TYPE_BOOL) = range(4)
|
||||||
|
|
||||||
def CheckErr(errnum, msg):
|
def CheckErr(errnum, msg):
|
||||||
if errnum:
|
if errnum:
|
||||||
raise ValueError('Error %d: %s: %s' %
|
raise ValueError('Error %d: %s: %s' %
|
||||||
@@ -37,6 +40,69 @@ class PropBase:
|
|||||||
self.name = name
|
self.name = name
|
||||||
self.value = None
|
self.value = None
|
||||||
|
|
||||||
|
def BytesToValue(self, bytes):
|
||||||
|
"""Converts a string of bytes into a type and value
|
||||||
|
|
||||||
|
Args:
|
||||||
|
A string containing bytes
|
||||||
|
|
||||||
|
Return:
|
||||||
|
A tuple:
|
||||||
|
Type of data
|
||||||
|
Data, either a single element or a list of elements. Each element
|
||||||
|
is one of:
|
||||||
|
TYPE_STRING: string value from the property
|
||||||
|
TYPE_INT: a byte-swapped integer stored as a 4-byte string
|
||||||
|
TYPE_BYTE: a byte stored as a single-byte string
|
||||||
|
"""
|
||||||
|
size = len(bytes)
|
||||||
|
strings = bytes.split('\0')
|
||||||
|
is_string = True
|
||||||
|
count = len(strings) - 1
|
||||||
|
if count > 0 and not strings[-1]:
|
||||||
|
for string in strings[:-1]:
|
||||||
|
if not string:
|
||||||
|
is_string = False
|
||||||
|
break
|
||||||
|
for ch in string:
|
||||||
|
if ch < ' ' or ch > '~':
|
||||||
|
is_string = False
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
is_string = False
|
||||||
|
if is_string:
|
||||||
|
if count == 1:
|
||||||
|
return TYPE_STRING, strings[0]
|
||||||
|
else:
|
||||||
|
return TYPE_STRING, strings[:-1]
|
||||||
|
if size % 4:
|
||||||
|
if size == 1:
|
||||||
|
return TYPE_BYTE, bytes[0]
|
||||||
|
else:
|
||||||
|
return TYPE_BYTE, list(bytes)
|
||||||
|
val = []
|
||||||
|
for i in range(0, size, 4):
|
||||||
|
val.append(bytes[i:i + 4])
|
||||||
|
if size == 4:
|
||||||
|
return TYPE_INT, val[0]
|
||||||
|
else:
|
||||||
|
return TYPE_INT, val
|
||||||
|
|
||||||
|
def GetEmpty(self, type):
|
||||||
|
"""Get an empty / zero value of the given type
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A single value of the given type
|
||||||
|
"""
|
||||||
|
if type == TYPE_BYTE:
|
||||||
|
return chr(0)
|
||||||
|
elif type == TYPE_INT:
|
||||||
|
return struct.pack('<I', 0);
|
||||||
|
elif type == TYPE_STRING:
|
||||||
|
return ''
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
class NodeBase:
|
class NodeBase:
|
||||||
"""A device tree node
|
"""A device tree node
|
||||||
|
|
||||||
|
@@ -31,11 +31,11 @@ class Prop(PropBase):
|
|||||||
def __init__(self, node, name, byte_list_str):
|
def __init__(self, node, name, byte_list_str):
|
||||||
PropBase.__init__(self, node, 0, name)
|
PropBase.__init__(self, node, 0, name)
|
||||||
if not byte_list_str.strip():
|
if not byte_list_str.strip():
|
||||||
self.type = fdt_util.TYPE_BOOL
|
self.type = fdt.TYPE_BOOL
|
||||||
return
|
return
|
||||||
self.bytes = [chr(int(byte, 16))
|
self.bytes = [chr(int(byte, 16))
|
||||||
for byte in byte_list_str.strip().split(' ')]
|
for byte in byte_list_str.strip().split(' ')]
|
||||||
self.type, self.value = fdt_util.BytesToValue(''.join(self.bytes))
|
self.type, self.value = self.BytesToValue(''.join(self.bytes))
|
||||||
|
|
||||||
def GetPhandle(self):
|
def GetPhandle(self):
|
||||||
"""Get a (single) phandle value from a property
|
"""Get a (single) phandle value from a property
|
||||||
|
@@ -33,10 +33,10 @@ class Prop(PropBase):
|
|||||||
PropBase.__init__(self, node, offset, name)
|
PropBase.__init__(self, node, offset, name)
|
||||||
self.bytes = bytes
|
self.bytes = bytes
|
||||||
if not bytes:
|
if not bytes:
|
||||||
self.type = fdt_util.TYPE_BOOL
|
self.type = fdt.TYPE_BOOL
|
||||||
self.value = True
|
self.value = True
|
||||||
return
|
return
|
||||||
self.type, self.value = fdt_util.BytesToValue(bytes)
|
self.type, self.value = self.BytesToValue(bytes)
|
||||||
|
|
||||||
def GetPhandle(self):
|
def GetPhandle(self):
|
||||||
"""Get a (single) phandle value from a property
|
"""Get a (single) phandle value from a property
|
||||||
@@ -75,7 +75,7 @@ class Prop(PropBase):
|
|||||||
self.value = [self.value]
|
self.value = [self.value]
|
||||||
|
|
||||||
if type(self.value) == list and len(newprop.value) > len(self.value):
|
if type(self.value) == list and len(newprop.value) > len(self.value):
|
||||||
val = fdt_util.GetEmpty(self.type)
|
val = self.GetEmpty(self.type)
|
||||||
while len(self.value) < len(newprop.value):
|
while len(self.value) < len(newprop.value):
|
||||||
self.value.append(val)
|
self.value.append(val)
|
||||||
|
|
||||||
|
@@ -8,72 +8,6 @@
|
|||||||
|
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
# A list of types we support
|
|
||||||
(TYPE_BYTE, TYPE_INT, TYPE_STRING, TYPE_BOOL) = range(4)
|
|
||||||
|
|
||||||
def BytesToValue(bytes):
|
|
||||||
"""Converts a string of bytes into a type and value
|
|
||||||
|
|
||||||
Args:
|
|
||||||
A string containing bytes
|
|
||||||
|
|
||||||
Return:
|
|
||||||
A tuple:
|
|
||||||
Type of data
|
|
||||||
Data, either a single element or a list of elements. Each element
|
|
||||||
is one of:
|
|
||||||
TYPE_STRING: string value from the property
|
|
||||||
TYPE_INT: a byte-swapped integer stored as a 4-byte string
|
|
||||||
TYPE_BYTE: a byte stored as a single-byte string
|
|
||||||
"""
|
|
||||||
size = len(bytes)
|
|
||||||
strings = bytes.split('\0')
|
|
||||||
is_string = True
|
|
||||||
count = len(strings) - 1
|
|
||||||
if count > 0 and not strings[-1]:
|
|
||||||
for string in strings[:-1]:
|
|
||||||
if not string:
|
|
||||||
is_string = False
|
|
||||||
break
|
|
||||||
for ch in string:
|
|
||||||
if ch < ' ' or ch > '~':
|
|
||||||
is_string = False
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
is_string = False
|
|
||||||
if is_string:
|
|
||||||
if count == 1:
|
|
||||||
return TYPE_STRING, strings[0]
|
|
||||||
else:
|
|
||||||
return TYPE_STRING, strings[:-1]
|
|
||||||
if size % 4:
|
|
||||||
if size == 1:
|
|
||||||
return TYPE_BYTE, bytes[0]
|
|
||||||
else:
|
|
||||||
return TYPE_BYTE, list(bytes)
|
|
||||||
val = []
|
|
||||||
for i in range(0, size, 4):
|
|
||||||
val.append(bytes[i:i + 4])
|
|
||||||
if size == 4:
|
|
||||||
return TYPE_INT, val[0]
|
|
||||||
else:
|
|
||||||
return TYPE_INT, val
|
|
||||||
|
|
||||||
def GetEmpty(type):
|
|
||||||
"""Get an empty / zero value of the given type
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
A single value of the given type
|
|
||||||
"""
|
|
||||||
if type == TYPE_BYTE:
|
|
||||||
return chr(0)
|
|
||||||
elif type == TYPE_INT:
|
|
||||||
return struct.pack('<I', 0);
|
|
||||||
elif type == TYPE_STRING:
|
|
||||||
return ''
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
def fdt32_to_cpu(val):
|
def fdt32_to_cpu(val):
|
||||||
"""Convert a device tree cell to an integer
|
"""Convert a device tree cell to an integer
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user