Merge remote-tracking branch 'origin/third-party-review' Change-Id: I0fa71e476cca6ba1cc12a14ae064f71c522cd825
This python module is usable for manipulation with Device Tree Data and primary was created for imxsb tool
Some parts in this module have been inspired from: https://github.com/superna9999/pyfdt project.
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:
sudo to install fdt and dependencies globally--user option to install locally into your home directory (export “~/.local/bin” into PATH variable if haven't).fdt module has intuitive and self describing API, what is presented in following example. Many of general requirements for manipulation with FDT Nodes, Properties and dts/dtb files are already implemented.
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 new Node into dt2 # ---------------------------------------------- # create node instance node = fdt.Node('test_node1') # add properties node.append(fdt.Property('basic_property')) node.append(fdt.PropStrings('string_property', 'value1', 'value2')) node.append(fdt.PropWords('words_property', 0x80000000)) node.append(fdt.PropBytes('bytes_property', 0x00, 0x01, 0x02)) # PropBytes constructor take also complex data object as bytes() or bytearray() node.append(fdt.PropBytes('bytes_property2', data=b"\x00\x01\x02")) # add created node into root path of dt2 dt2.add_item(node) # use set_property method to update or create new property dt2.set_property('words_property', [0, 1], path='/test_node1') dt2.set_property('bytes_property', b"\x00\x01", path='/test_node1') dt2.set_property('string_property', ['value1', 'value2', 'value3'], path='/test_node1') # use search method for find all string properties and then update it items = dt2.search("", itype=fdt.ItemType.PROP_STRINGS, path="/test_node1") for item in items: item.data = ['value1', 'value2'] #----------------------------------------------- # 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 -h usage: pydtc [-h] [-v] {pack,unpack,merge,diff} ... Flat Device Tree (FDT) tool for manipulation with *.dtb and *.dts files positional arguments: {pack,unpack,merge,diff} pack Pack *.dts into binary blob (*.dtb) unpack Unpack *.dtb into readable format (*.dts) merge Merge more files in *.dtb or *.dts format diff Compare two files in *.dtb or *.dts format optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit
Unpack Device Tree from binary blob *.dtb into readable text file *.dts
dtb_file - Single DTB file with dtb extension
pydtc unpack test.dtb DTS saved as: test.dts
Pack Device Tree from readable text file *.dts into binary blob *.dtb
dts_file - Single DTS file as *.dts
pydtc pack -v 17 test.dts DTB saved as: test.dtb
Merge two and more *.dtb or *.dts files into one *.dts file
out_file - The output file name with *.dts extension
in_files - Two or more input files with *.dtb or *.dts extension
pydtc merge out.dts test1.dtb test2.dtb 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)
in_file1 - Input file 1
in_file2 - Input file 2
pydtc diff test1.dtb test2.dtb Output saved into: diff_out