85 lines
3.2 KiB
ReStructuredText
85 lines
3.2 KiB
ReStructuredText
.. _devicetree:
|
|
|
|
Devicetree support
|
|
==================
|
|
|
|
Flattened Device Tree (FDT) is a data structure for describing the hardware on
|
|
a system. On an increasing number of boards both barebox and the Linux Kernel can
|
|
probe their devices directly from devicetrees. barebox needs the devicetree compiled
|
|
into the binary. The Kernel usually does not have a devicetree compiled in, instead
|
|
the Kernel expects to be passed a devicetree from the bootloader.
|
|
|
|
From a bootloader's point of view, using devicetrees has the advantage that the
|
|
same devicetree is used to probe both the Kernel and the Bootloader; this
|
|
drastically reduces porting effort since the devicetree has to be written only
|
|
once (and with luck somebody has already written a devicetree for the Kernel).
|
|
Probing barebox from devicetree is highly recommended for new projects.
|
|
|
|
.. _internal_devicetree:
|
|
|
|
The internal devicetree
|
|
-----------------------
|
|
|
|
The devicetree barebox has been probed from plays a special role. It is referred to
|
|
as the :ref:`internal_devicetree`. The barebox devicetree commands work on this
|
|
devicetree. The devicetree source (DTS) files are kept in sync with the Kernel DTS
|
|
files. As the FDT files are meant to be backward compatible, it should always be possible
|
|
to start a Kernel with the barebox internal devicetree. However, since the barebox
|
|
devicetree may not be complete or contain bugs it is always possible to start the
|
|
Kernel with another devicetree than barebox has been started with.
|
|
If a device has been probed from the devicetree then using the :ref:`command_devinfo`
|
|
command on it will show the corresponding devicetree node:
|
|
|
|
.. code-block:: sh
|
|
|
|
barebox@Phytec pcm970:/ devinfo 10002000.wdog
|
|
Resources:
|
|
num: 0
|
|
name: /soc/aipi@10000000/wdog@10002000
|
|
start: 0x10002000
|
|
size: 0x00001000
|
|
Driver: imx-watchdog
|
|
Bus: platform
|
|
Device node: /soc/aipi@10000000/wdog@10002000
|
|
wdog@10002000 {
|
|
compatible = "fsl,imx27-wdt", "fsl,imx21-wdt";
|
|
reg = <0x10002000 0x1000>;
|
|
interrupts = <0x1b>;
|
|
clocks = <0x1 0x4a>;
|
|
};
|
|
|
|
Devicetree commands
|
|
-------------------
|
|
|
|
barebox has commands to show and manipulate devicetrees. These commands always
|
|
work on the internal devicetree. It is possible to add/remove nodes using the
|
|
:ref:`command_of_node` command and to add/change/remove properties using the
|
|
:ref:`command_of_property` command. To dump devicetrees on the console use the
|
|
:ref:`command_of_dump` command.
|
|
|
|
.. code-block:: sh
|
|
|
|
# dump the whole devicetree
|
|
of_dump
|
|
|
|
# dump node of_dump /soc/nand@d8000000/
|
|
of_dump /soc/nand@d8000000/
|
|
|
|
# create a new node
|
|
of_node -c /chosen/mynode
|
|
|
|
# add a property to it
|
|
of_property -s /chosen/mynode/ myproperty myvalue
|
|
|
|
It is important to know that these commands always work on the internal
|
|
devicetree. If you modify the internal devicetree to influence the behaviour of
|
|
a Kernel booted later, make sure that you start the kernel with the internal
|
|
devicetree (i.e. don't pass a devicetree to the :ref:`command_bootm` command). If you
|
|
wish to use another devicetree than the internal devicetree for starting the Kernel,
|
|
you can exchange the internal devicetree during runtime:
|
|
|
|
.. code-block:: sh
|
|
|
|
oftree -f
|
|
oftree -l /new/dtb
|