User Tools

Site Tools


linux_device_trees

This is an old revision of the document!


Overview

Stuff related to device trees and the Linux kernel, using examples from the current Linux kernel.

To do:

  • overlays

Internal wiki pages

Proper device tree design

One board, one .dts file

Every distinct board merits its own .dts file, as in:

  • am335x-boneblack.dts
  • am335x-boneblack-wireless.dts
  • am335x-boneblue.dts
  • am335x-bone.dts
  • am335x-bonegreen.dts
  • am335x-bonegreen-wireless.dts

Proper use of .dtsi files

There is no reason to make local copies of kernel-supplied .dtsi files and alter them; such files should be included as is, and all alterations should be made in the .dts file or a more general board-related .dtsi file supplied by that developer. Any alterations that involve actual removal of included content should be done via one of the two directives:

  • /delete-property/
  • /delete-node/

This functionality was introduced into the Linux kernel file scripts/dtc/dtc-lexer.l file in Sept of 2012:

commit cd296721a9645f9f28800a072490fa15458d1fb7
Author: Stephen Warren <swarren@nvidia.com>
Date:   Fri Sep 28 21:25:59 2012 +0000

    dtc: import latest upstream dtc
    
    This updates scripts/dtc to commit 317a5d9 "dtc: zero out new label
    objects" from git://git.jdl.com/software/dtc.git.
    
    This adds features such as:
    * /bits/ syntax for cell data.
    * Math expressions within cell data.
    * The ability to delete properties or nodes.
    * Support for #line directives in the input file, which allows the use of
      cpp on *.dts.
    * -i command-line option (/include/ path)
    * -W/-E command-line options for error/warning control.
    * Removal of spew to STDOUT containing the filename being compiled.
    * Many additions to the libfdt API.
    
    Signed-off-by: Stephen Warren <swarren@nvidia.com>
    Acked-by: Jon Loeliger <jdl@jdl.com>
    Signed-off-by: Rob Herring <rob.herring@calxeda.com>

Examples can be seen here.

Examples of /delete-node/

imx6dl-tx6s-8034.dts

#include "imx6dl.dtsi"
#include "imx6qdl-tx6.dtsi"

/ {
        model = "Ka-Ro electronics TX6S-8034 Module";
        compatible = "karo,imx6dl-tx6dl", "fsl,imx6dl";

        aliases {
                display = &display;
                ipu1 = &ipu1;
        };

        cpus {
                /delete-node/ cpu@1;
        };

imx6q-utilite-pro.dts

#include <dt-bindings/input/input.h>
#include "imx6q-cm-fx6.dts"

/ {
        model = "CompuLab Utilite Pro";
        compatible = "compulab,utilite-pro", "compulab,cm-fx6", "fsl,imx6q";
        
 ...

};

/*
 * A single IPU is not able to drive both display interfaces available on the
 * Utilite Pro at high resolution due to its bandwidth limitation. Since the
 * tfp410 encoder is wired up to IPU1, sever the link between IPU1 and the
 * SoC-internal Designware HDMI encoder forcing the latter to be connected to
 * IPU2 instead of IPU1.
 */
/delete-node/&ipu1_di0_hdmi;
/delete-node/&hdmi_mux_0;
/delete-node/&ipu1_di1_hdmi;
/delete-node/&hdmi_mux_1;

Examples of /delete-property/

imx6qp.dtsi

#include "imx6q.dtsi"

/ {
        soc {
        
        ...
        
};

&fec {
        /delete-property/interrupts-extended;
        interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>,
                     <0 119 IRQ_TYPE_LEVEL_HIGH>;
};

imx6ul-tx6ul-mainboard.dts

#include "imx6ul.dtsi"
#include "imx6ul-tx6ul.dtsi"

/ {
        model = "Ka-Ro electronics TXUL-0010 Module on TXUL Mainboard";
        compatible = "karo,imx6ul-tx6ul", "fsl,imx6ul";

        aliases {
                lcdif_24bit_pins_a = &pinctrl_disp0_3;
                mmc0 = &usdhc1;
                /delete-property/ mmc1;
                serial2 = &uart3;
                serial4 = &uart5;
        };
        /delete-node/ sound;
};

...

&usdhc1 {
        pinctrl-0 = <&pinctrl_usdhc1>;
        non-removable;
        /delete-property/ cd-gpios;
        cap-sdio-irq;
};

&uart1 {
        pinctrl-0 = <&pinctrl_uart1>;
        /delete-property/ uart-has-rtscts;
};

&uart2 {
        pinctrl-0 = <&pinctrl_uart2>;
        /delete-property/ uart-has-rtscts;
        status = "okay";
};

Comparing .dts files with dtx_diff

Comparing two device tree files out of tree -- apparent bug

What doesn't seem to work is comparing two device tree files that are outside the confines of a kernel source tree, even if you identify the kernel source tree. Below, I copy the same two files to /tmp and try to do the comparison there, referring back to the same kernel source tree:

$ cp imx6q{,p}-sabresd.dts /tmp
$ cd /tmp
$ dtx_diff -s ~/k/git imx6q{,p}-sabresd.dts
imx6qp-sabresd.dts:45:10: fatal error: imx6qp.dtsi: No such file or directory
 #include "imx6qp.dtsi"
          ^~~~~~~~~~~~~
imx6q-sabresd.dts:15:10: fatal error: imx6q.dtsi: No such file or directory
 #include "imx6q.dtsi"
          ^~~~~~~~~~~~
compilation terminated.
compilation terminated.
Error: imx6qp-sabresd.dts:43.9-10 Error: imx6q-sabresd.dts:13.9-10 syntax errorsyntax error

FATAL ERROR: FATAL ERROR: Unable to parse input tree
Unable to parse input tree

Possible hints to resolve the above error:

  (hints might not fix the problem)
Possible hints to resolve the above error:
  (hints might not fix the problem)


  No hints available.
  No hints available.
$

I have no idea why this fails – obviously, even when telling dtx_diff where the kernel source tree is, the include search path is not being set correctly. I've already reported this as an apparent bug to the device tree mailing list.

linux_device_trees.1542471260.txt.gz · Last modified: 2018/11/17 16:14 by rpjday