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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# SPDX-License-Identifier: GPL-2.0+
# Copyright 2022 Google LLC
#
"""Bintool implementation for fdtgrep
fdtgrepprovides a way to grep devicetree-binary files to extract or remove
certain elements.
Usage: fdtgrep - extract portions from device tree
Usage:
fdtgrep <options> <dt file>|-
Output formats are:
dts - device tree soure text
dtb - device tree blob (sets -Hmt automatically)
bin - device tree fragment (may not be a valid .dtb)
Options: -[haAc:b:C:defg:G:HIlLmn:N:o:O:p:P:rRsStTvhV]
-a, --show-address Display address
-A, --colour Show all nodes/tags, colour those that match
-b, --include-node-with-prop <arg> Include contains containing property
-c, --include-compat <arg> Compatible nodes to include in grep
-C, --exclude-compat <arg> Compatible nodes to exclude in grep
-d, --diff Diff: Mark matching nodes with +, others with -
-e, --enter-node Enter direct subnode names of matching nodes
-f, --show-offset Display offset
-g, --include-match <arg> Node/property/compatible string to include in grep
-G, --exclude-match <arg> Node/property/compatible string to exclude in grep
-H, --show-header Output a header
-I, --show-version Put "/dts-v1/;" on first line of dts output
-l, --list-regions Output a region list
-L, --list-strings List strings in string table
-m, --include-mem Include mem_rsvmap section in binary output
-n, --include-node <arg> Node to include in grep
-N, --exclude-node <arg> Node to exclude in grep
-p, --include-prop <arg> Property to include in grep
-P, --exclude-prop <arg> Property to exclude in grep
-r, --remove-strings Remove unused strings from string table
-R, --include-root Include root node and all properties
-s, --show-subnodes Show all subnodes matching nodes
-S, --skip-supernodes Don't include supernodes of matching nodes
-t, --show-stringtab Include string table in binary output
-T, --show-aliases Include matching aliases in output
-o, --out <arg> -o <output file>
-O, --out-format <arg> -O <output format>
-v, --invert-match Invert the sense of matching (select non-matching lines)
-h, --help Print this help and exit
-V, --version Print version and exit
"""
import tempfile
from u_boot_pylib import tools
from binman import bintool
class Bintoolfdtgrep(bintool.Bintool):
"""Handles the 'fdtgrep' tool
This bintool supports running `fdtgrep` with parameters suitable for
producing SPL devicetrees from the main one.
"""
def __init__(self, name):
super().__init__(name, 'Grep devicetree files')
def create_for_phase(self, infile, phase, outfile, remove_props):
"""Create the FDT for a particular phase
Args:
infile (str): Input filename containing the full FDT contents (with
all nodes and properties)
phase (str): Phase to generate for ('tpl', 'vpl', 'spl')
outfile (str): Output filename to write the grepped FDT contents to
(with only neceesary nodes and properties)
Returns:
str or bytes: Resulting stdout from the bintool
"""
if phase == 'tpl':
tag = 'bootph-pre-sram'
elif phase == 'vpl':
tag = 'bootph-verify'
elif phase == 'spl':
tag = 'bootph-pre-ram'
else:
raise ValueError(f"Invalid U-Boot phase '{phase}': Use tpl/vpl/spl")
# These args mirror those in cmd_fdtgrep in scripts/Makefile.lib
# First do the first stage
with tempfile.NamedTemporaryFile(prefix='fdtgrep.tmp',
dir=tools.get_output_dir()) as tmp:
args = [
infile,
'-o', tmp.name,
'-b', 'bootph-all',
'-b', tag,
'-u',
'-RT',
'-n', '/chosen',
'-n', '/config',
'-O', 'dtb',
]
self.run_cmd(*args)
args = [
tmp.name,
'-o', outfile,
'-r',
'-O', 'dtb',
'-P', 'bootph-all',
'-P', 'bootph-pre-ram',
'-P', 'bootph-pre-sram',
'-P', 'bootph-verify',
]
for prop_name in remove_props:
args += ['-P', prop_name]
return self.run_cmd(*args)
def fetch(self, method):
"""Fetch handler for fdtgrep
This installs fdtgrep using the apt utility, which assumes that it is
packaged in u-boot tools, which it is not.
Args:
method (FETCH_...): Method to use
Returns:
True if the file was fetched and now installed, None if a method
other than FETCH_BIN was requested
Raises:
Valuerror: Fetching could not be completed
"""
if method != bintool.FETCH_BIN:
return None
return self.apt_install('u-boot-tools')
|