xref: /rk3399_rockchip-uboot/tools/dtoc/fdt_util.py (revision ec564b47dad46e57347cef7b3f7f5bb51a329302)
1*ec564b47SSimon Glass#!/usr/bin/python
2*ec564b47SSimon Glass#
3*ec564b47SSimon Glass# Copyright (C) 2016 Google, Inc
4*ec564b47SSimon Glass# Written by Simon Glass <sjg@chromium.org>
5*ec564b47SSimon Glass#
6*ec564b47SSimon Glass# SPDX-License-Identifier:      GPL-2.0+
7*ec564b47SSimon Glass#
8*ec564b47SSimon Glass
9*ec564b47SSimon Glassimport struct
10*ec564b47SSimon Glass
11*ec564b47SSimon Glass# A list of types we support
12*ec564b47SSimon Glass(TYPE_BYTE, TYPE_INT, TYPE_STRING, TYPE_BOOL) = range(4)
13*ec564b47SSimon Glass
14*ec564b47SSimon Glassdef BytesToValue(bytes):
15*ec564b47SSimon Glass    """Converts a string of bytes into a type and value
16*ec564b47SSimon Glass
17*ec564b47SSimon Glass    Args:
18*ec564b47SSimon Glass        A string containing bytes
19*ec564b47SSimon Glass
20*ec564b47SSimon Glass    Return:
21*ec564b47SSimon Glass        A tuple:
22*ec564b47SSimon Glass            Type of data
23*ec564b47SSimon Glass            Data, either a single element or a list of elements. Each element
24*ec564b47SSimon Glass            is one of:
25*ec564b47SSimon Glass                TYPE_STRING: string value from the property
26*ec564b47SSimon Glass                TYPE_INT: a byte-swapped integer stored as a 4-byte string
27*ec564b47SSimon Glass                TYPE_BYTE: a byte stored as a single-byte string
28*ec564b47SSimon Glass    """
29*ec564b47SSimon Glass    size = len(bytes)
30*ec564b47SSimon Glass    strings = bytes.split('\0')
31*ec564b47SSimon Glass    is_string = True
32*ec564b47SSimon Glass    count = len(strings) - 1
33*ec564b47SSimon Glass    if count > 0 and not strings[-1]:
34*ec564b47SSimon Glass        for string in strings[:-1]:
35*ec564b47SSimon Glass            if not string:
36*ec564b47SSimon Glass                is_string = False
37*ec564b47SSimon Glass                break
38*ec564b47SSimon Glass            for ch in string:
39*ec564b47SSimon Glass                if ch < ' ' or ch > '~':
40*ec564b47SSimon Glass                    is_string = False
41*ec564b47SSimon Glass                    break
42*ec564b47SSimon Glass    else:
43*ec564b47SSimon Glass        is_string = False
44*ec564b47SSimon Glass    if is_string:
45*ec564b47SSimon Glass        if count == 1:
46*ec564b47SSimon Glass            return TYPE_STRING, strings[0]
47*ec564b47SSimon Glass        else:
48*ec564b47SSimon Glass            return TYPE_STRING, strings[:-1]
49*ec564b47SSimon Glass    if size % 4:
50*ec564b47SSimon Glass        if size == 1:
51*ec564b47SSimon Glass            return TYPE_BYTE, bytes[0]
52*ec564b47SSimon Glass        else:
53*ec564b47SSimon Glass            return TYPE_BYTE, list(bytes)
54*ec564b47SSimon Glass    val = []
55*ec564b47SSimon Glass    for i in range(0, size, 4):
56*ec564b47SSimon Glass        val.append(bytes[i:i + 4])
57*ec564b47SSimon Glass    if size == 4:
58*ec564b47SSimon Glass        return TYPE_INT, val[0]
59*ec564b47SSimon Glass    else:
60*ec564b47SSimon Glass        return TYPE_INT, val
61*ec564b47SSimon Glass
62*ec564b47SSimon Glassdef GetEmpty(type):
63*ec564b47SSimon Glass    """Get an empty / zero value of the given type
64*ec564b47SSimon Glass
65*ec564b47SSimon Glass    Returns:
66*ec564b47SSimon Glass        A single value of the given type
67*ec564b47SSimon Glass    """
68*ec564b47SSimon Glass    if type == TYPE_BYTE:
69*ec564b47SSimon Glass        return chr(0)
70*ec564b47SSimon Glass    elif type == TYPE_INT:
71*ec564b47SSimon Glass        return struct.pack('<I', 0);
72*ec564b47SSimon Glass    elif type == TYPE_STRING:
73*ec564b47SSimon Glass        return ''
74*ec564b47SSimon Glass    else:
75*ec564b47SSimon Glass        return True
76*ec564b47SSimon Glass
77*ec564b47SSimon Glassdef fdt32_to_cpu(val):
78*ec564b47SSimon Glass    """Convert a device tree cell to an integer
79*ec564b47SSimon Glass
80*ec564b47SSimon Glass    Args:
81*ec564b47SSimon Glass        Value to convert (4-character string representing the cell value)
82*ec564b47SSimon Glass
83*ec564b47SSimon Glass    Return:
84*ec564b47SSimon Glass        A native-endian integer value
85*ec564b47SSimon Glass    """
86*ec564b47SSimon Glass    return struct.unpack(">I", val)[0]
87