How to compare (typically in-kernel) device tree source files with dtx_diff
.
Given a kernel source tree at, say, ~/k/git/
, prepare for comparison with:
$ cd ~/k/git $ PATH=~/k/git/scripts/dtc:$PATH $ export ARCH=arm
Note that setting PATH
as above will add access to all of the executables (scripts and possible binary executables) under the kernel's scripts/dtc/
directory, which includes not only the dtx_diff
script but, if you've compiled the kernel scripts, the dtc
device tree compiler program that will exist under there as well.
I mention this so you know that if you already had a /usr/bin/dtc
executable installed via some sort of dtc
package, the one in that scripts directory will take precedence, unless you add that directory at the end of PATH
instead of at the beginning. In any event, you must have a dtc
command somewhere for the dtx_diff
script.
If you're located at the top of the relevant kernel source tree, and you want to compare two device tree source files already there, say, under arch/arm/boot/dts/
(let's say, imx6q-sabresd.dts
and imx6qp-sabresd.dts
), you can do this (note the use of shell expansion to save on typing):
$ dtx_diff arch/arm/boot/dts/imx6q{,p}-sabresd.dts --- arch/arm/boot/dts/imx6q-sabresd.dts +++ arch/arm/boot/dts/imx6qp-sabresd.dts @@ -3,8 +3,8 @@ / { #address-cells = <0x1>; #size-cells = <0x1>; - compatible = "fsl,imx6q-sabresd", "fsl,imx6q"; - model = "Freescale i.MX6 Quad SABRE Smart Device Board"; + compatible = "fsl,imx6qp-sabresd", "fsl,imx6qp"; + model = "Freescale i.MX6 Quad Plus SABRE Smart Device Board"; aliases { can0 = "/soc/aips-bus@02000000/flexcan@02090000"; @@ -44,14 +44,14 @@ brightness-levels = <0x0 0x4 0x8 0x10 0x20 0x40 0x80 0xff>; compatible = "pwm-backlight"; default-brightness-level = <0x7>; - phandle = <0x7a>; - pwms = <0x78 0x0 0x4c4b40>; + phandle = <0x82>; + pwms = <0x80 0x0 0x4c4b40>; status = "okay"; }; .. etc etc ...
In the above example, you were located in the root directory of the relevant kernel source tree, which is the default for the dtx_diff
script, where it knows how to process device tree source file includes. If, however, you're in the actual underlying dts
directory (or somewhere else in the kernel source tree), you can't just run the script as is since it won't know the kernel source tree to use to process include
directives:
$ cd arch/arm/boot/dts $ dtx_diff imx6q{,p}-sabresd.dts ... snip ... In file included from imx6qp.dtsi:43:0, from imx6qp-sabresd.dts:45: imx6q.dtsi:11:50: error: no include path in which to search for dt-bindings/interrupt-controller/irq.h #include <dt-bindings/interrupt-controller/irq.h> ... snip ... ./arch/arm/ does not exist Is $ARCH='arm' correct? Possible fix: use '-s' option ./arch/arm/ does not exist Is $ARCH='arm' correct? Possible fix: use '-s' option Possible fix: use '-S' option Possible fix: use '-S' option $
Instead, you need to use one of these two variations, depending on whether you're in a Git repository, or just a regular source tree:
$ dtx_diff -s ~/k/git imx6q{,p}-sabresd.dts (specify source tree with ''-s'') $ dtx_diff -S imx6q{,p}-sabresd.dts (''-S'' means this is a Git repo)
In short, as long as you're still inside the relevant kernel source tree, comparisons will work – you just need to make sure the dtx_diff
script is told where the top of the kernel source tree is.
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.