/pyFDT

Flattened Device Tree Python Module

Primary LanguagePythonApache License 2.0Apache-2.0

Flattened Device Tree Python Module

Build Status Coverage Status PyPI Status Python Version

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.

Dependencies

  • Python - Python 3.x interpreter
  • Click - Python package for creating beautiful command line interface.

Installation

    $ 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:

  1. Run with sudo to install fdt and dependencies globally
  2. Specify the --user option to install locally into your home directory (export "~/.local/bin" into PATH variable if haven't).
  3. Run the command in a virtualenv local to a specific project working set.

Usage

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

[ pydtc ] Tool

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

$ pydtc todts [OPTIONS] INFILE

Convert Device Tree in binary blob *.dtb to readable text file *.dts

INFILE - Single DTB file as *.dtb

options:
  • -t, --tabsize - Tabulator Size
  • -o, --outfile - Output path/file name (*.dts)
  • -?, --help - Show help message and exit
Example:
  $ pydtc todts test.dtb
    
    DTS saved as: test.dts

$ pydtc todtb [OPTIONS] INFILE

Convert Device Tree in readable text file *.dts to binary blob *.dtb

INFILE - Single DTS file as *.dts

options:
  • -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
Example:
  $ pydtc todtb -v 17 test.dts
  
    DTB saved as: test.dtb

$ pydtc merge [OPTIONS] OUTFILE [INFILES]

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

options:
  • -t, --tabsize - Tabulator Size
  • -t, --intype - Input file type: 'auto', 'dts', 'dtb' (default: auto)
  • -?, --help - Show help message and exit
Example:
  $ pydtc merge out.dts test1.dtb test2.dtb
    
    Merge output saved as: out.dts

$ pydtc diff [OPTIONS] FILE1 FILE2

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

options:
  • -t, --intype - Input file type: 'auto', 'dts', 'dtb' (default: auto)
  • -o, --outdir - Output directory/path (default: diff_out)
  • -?, --help - Show help message and exit
Example:
  $ pydtc diff test1.dtb test2.dtb
    
    Diff output saved into: diff_out