This python module is usable for manipulation with Device Tree Data and primary was created for i.MX Smart-Boot Tool
Some parts in this module have been inspired from: https://github.com/superna9999/pyfdt project.
- Python - Python 3.x interpreter
- Click - Python package for creating beautiful command line interface.
$ pip install fdt
To install the latest version from master branch execute in shell following command:
$ pip install -U https://github.com/molejar/pyFDT/archive/master.zip
In case of development, install it from cloned sources:
$ git clone https://github.com/molejar/pyFDT.git
$ cd pyFDT
$ pip install -U -e .
NOTE: You may run into a permissions issues running these commands. Here are a few options how to fix it:
- Run with
sudo
to installfdt
and dependencies globally - Specify the
--user
option to install locally into your home directory (export "~/.local/bin" into PATH variable if haven't). - Run the command in a virtualenv local to a specific project working set.
The API of fdt module is intuitive and implementing all general requirements for manipulation with FDT Nodes, Properties and dts/dtb files.
import fdt
#-----------------------------------------------
# convert *.dtb to *.dts
# ----------------------------------------------
with open("example.dtb", "rb") as f:
dtb_data = f.read()
dt1 = fdt.parse_dtb(dtb_data)
with open("example.dts", "w") as f:
f.write(dt1.to_dts())
#-----------------------------------------------
# convert *.dts to *.dtb
# ----------------------------------------------
with open("example.dts", "r") as f:
dts_text = f.read()
dt2 = fdt.parse_dts(dts_text)
with open("example.dtb", "wb") as f:
f.write(dt2.to_dtb(version=17))
#-----------------------------------------------
# Add Property and Node into dt2
# ----------------------------------------------
node = fdt.Node('test_node')
node.append(fdt.Property('basic_property'))
node.append(fdt.PropStrings('string_property', 'value1', 'value2'))
node.append(fdt.PropWords('words_property', 0x1000, 0x80000000, wsize=32))
node.append(fdt.PropBytes('bytes_property', data=[0, 200, 12]))
dt2.add_item(node)
#-----------------------------------------------
# merge dt2 into dt1
# ----------------------------------------------
dt1.merge(dt2)
with open("merged.dtb", "wb") as f:
f.write(dt1.to_dtb(version=17))
#-----------------------------------------------
# diff two fdt objects
# ----------------------------------------------
out = fdt.diff(dt1, dt2)
print(out[0]) # same in dt1 and dt2
print(out[1]) # specific for dt1
print(out[2]) # specific for dt2
The python device tree converter pydtc is a tool for conversion *.dts to *.dtb and vice versa. Is distributed together with fdt module. This tool can be in some cases used as replacement of device tree compiler.
$ pydtc -?
Usage: pydtc [OPTIONS] COMMAND [ARGS]...
Device Tree Converter (DTC) is a tool for converting device tree binary
blob (*.dtb) to readable text file (*.dts) and reverse
Options:
-v, --version Show the version and exit.
-?, --help Show this message and exit.
Commands:
diff Compare two *.dtb or *.dts files
merge Merge two and more *.dtb or *.dts files
todtb Convert *.dts to *.dtb
todts Convert *.dtb to *.dts
Convert Device Tree in binary blob *.dtb to readable text file *.dts
INFILE - Single DTB file as *.dtb
- -t, --tabsize - Tabulator Size
- -o, --outfile - Output path/file name (*.dts)
- -?, --help - Show help message and exit
$ pydtc todts test.dtb
DTS saved as: test.dts
Convert Device Tree in readable text file *.dts to binary blob *.dtb
INFILE - Single DTS file as *.dts
- -v, --version - DTB Version
- -l, --lcversion - DTB Last Compatible Version
- -c, --cpuid - Boot CPU ID
- -a, --align - Make the blob align to the
- -p, --padding - Add padding to the blob of long
- -s, --size - Make the blob at least long
- -o, --outfile - Output path/file name (*.dtb)
- -?, --help - Show help message and exit
$ pydtc todtb -v 17 test.dts
DTB saved as: test.dtb
Merge two and more *.dtb or *.dts files into one *.dts file
OUTFILE - The output file name with *.dts extension
INFILES - Two or more input files with *.dtb or *.dts extension
- -t, --tabsize - Tabulator Size
- -t, --intype - Input file type: 'auto', 'dts', 'dtb' (default: auto)
- -?, --help - Show help message and exit
$ pydtc merge out.dts test1.dtb test2.dtb
Merge output saved as: out.dts
Compare two dtb/dts files and generate 3 dts files (same in 1 and 2, specific for 1, specific for 2)
FILE1 - Input file 1
FILE2 - Input file 2
- -t, --intype - Input file type: 'auto', 'dts', 'dtb' (default: auto)
- -o, --outdir - Output directory/path (default: diff_out)
- -?, --help - Show help message and exit
$ pydtc diff test1.dtb test2.dtb
Diff output saved into: diff_out