devtree gotchas

Back to work.

I'm still in the process of introducing new entries to the device
tree for my target board.  I already have the constants I should
add. I could obviously add them by copying and pasting them right
into the file, and see if they work.  I'd rather understand what
I'm doing, so I decided to invest some time on it.

The difficult part is that the devtree specification does not say
much on the textual format, focusing instead on the semantics.  The
kernel documentation, on the other hand, focuses on how the devtree
is handled, also glossing over details of the text specification.
For example, I know that there can be only one root, in the device
tree.  But why am I dealing with a few files, and each defines /
again?

Intuitively, they end up being merged, right?  And that's exactly
what happens, in fact.

The answer comes from compiling them and dumping the result, which
would be very easy in normal situations.  Yocto is however on the
way, with lots of hidden complexity, and a hellish tree of build
directories.

I've starting using ranger(1) in order to find things in such
hierarchy.  I'm not sure I want to continue: it is hany in some
ways, but an obstacle in others.  Maybe I can use the trick of
defining shell variables as bookmarks.

Gotchas:


1) The dtc(1) utility can be used to dump it, so the result can be
compared with the source, to overcome the lack of information from
the documentation.

.	dtc -I dtb -O dts $dtsc_file > dump


2) device tree specifications are merged, so basically:

Let system-top.dts.pp be
.	/ {
.	 chosen {
.	  bootargs = "earlycon clk_ignore_unused";
.	 };
.	};
.	/include/ "hello.dtsi"

And let hello.dtsi be
.	/* system-user.dtsi */
.	/{
.	 chosen {
.	   stdout-path = "serial0:115200n8";
.	 };
.	};

The result is
.	/ {
.	 chosen {
.	  bootargs = "earlycon clk_ignore_unused";
.	  stdout-path = "serial0:115200n8";
.	 };
.	};