Blame view

tools/dtoc/fdt_util.py 2.93 KB
d41ce506b   Eric Lee   Initial Release, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  #!/usr/bin/python
  #
  # Copyright (C) 2016 Google, Inc
  # Written by Simon Glass <sjg@chromium.org>
  #
  # SPDX-License-Identifier:      GPL-2.0+
  #
  
  import os
  import struct
  import sys
  import tempfile
  
  import command
  import tools
  
  def fdt32_to_cpu(val):
      """Convert a device tree cell to an integer
  
      Args:
          Value to convert (4-character string representing the cell value)
  
      Return:
          A native-endian integer value
      """
      if sys.version_info > (3, 0):
          if isinstance(val, bytes):
              val = val.decode('utf-8')
          val = val.encode('raw_unicode_escape')
      return struct.unpack('>I', val)[0]
  
  def fdt_cells_to_cpu(val, cells):
      """Convert one or two cells to a long integer
  
      Args:
          Value to convert (array of one or more 4-character strings)
  
      Return:
          A native-endian long value
      """
      if not cells:
          return 0
      out = long(fdt32_to_cpu(val[0]))
      if cells == 2:
          out = out << 32 | fdt32_to_cpu(val[1])
      return out
  
  def EnsureCompiled(fname):
      """Compile an fdt .dts source file into a .dtb binary blob if needed.
  
      Args:
          fname: Filename (if .dts it will be compiled). It not it will be
              left alone
  
      Returns:
          Filename of resulting .dtb file
      """
      _, ext = os.path.splitext(fname)
      if ext != '.dts':
          return fname
  
      dts_input = tools.GetOutputFilename('source.dts')
      dtb_output = tools.GetOutputFilename('source.dtb')
  
      search_paths = [os.path.join(os.getcwd(), 'include')]
      root, _ = os.path.splitext(fname)
      args = ['-E', '-P', '-x', 'assembler-with-cpp', '-D__ASSEMBLY__']
      args += ['-Ulinux']
      for path in search_paths:
          args.extend(['-I', path])
      args += ['-o', dts_input, fname]
      command.Run('cc', *args)
  
      # If we don't have a directory, put it in the tools tempdir
      search_list = []
      for path in search_paths:
          search_list.extend(['-i', path])
      args = ['-I', 'dts', '-o', dtb_output, '-O', 'dtb',
              '-W', 'no-unit_address_vs_reg']
      args.extend(search_list)
      args.append(dts_input)
      dtc = os.environ.get('DTC') or 'dtc'
      command.Run(dtc, *args)
      return dtb_output
  
  def GetInt(node, propname, default=None):
      prop = node.props.get(propname)
      if not prop:
          return default
      value = fdt32_to_cpu(prop.value)
      if type(value) == type(list):
          raise ValueError("Node '%s' property '%' has list value: expecting"
                           "a single integer" % (node.name, propname))
      return value
  
  def GetString(node, propname, default=None):
      prop = node.props.get(propname)
      if not prop:
          return default
      value = prop.value
      if type(value) == type(list):
          raise ValueError("Node '%s' property '%' has list value: expecting"
                           "a single string" % (node.name, propname))
      return value
  
  def GetBool(node, propname, default=False):
      if propname in node.props:
          return True
      return default