|  | .. _devicetree-in-out-files: | 
|  |  | 
|  | Input and output files | 
|  | ###################### | 
|  |  | 
|  | This section describes the input and output files shown in the figure in | 
|  | :ref:`devicetree-scope-purpose` in more detail. | 
|  |  | 
|  | .. figure:: zephyr_dt_inputs_outputs.svg | 
|  | :figclass: align-center | 
|  |  | 
|  | Devicetree input (green) and output (yellow) files | 
|  |  | 
|  | .. _dt-input-files: | 
|  |  | 
|  | Input files | 
|  | *********** | 
|  |  | 
|  | There are four types of devicetree input files: | 
|  |  | 
|  | - sources (``.dts``) | 
|  | - includes (``.dtsi``) | 
|  | - overlays (``.overlay``) | 
|  | - bindings (``.yaml``) | 
|  |  | 
|  | The devicetree files inside the :file:`zephyr` directory look like this: | 
|  |  | 
|  | .. code-block:: none | 
|  |  | 
|  | boards/<ARCH>/<BOARD>/<BOARD>.dts | 
|  | dts/common/skeleton.dtsi | 
|  | dts/<ARCH>/.../<SOC>.dtsi | 
|  | dts/bindings/.../binding.yaml | 
|  |  | 
|  | Generally speaking, every supported board has a :file:`BOARD.dts` file | 
|  | describing its hardware. For example, the ``reel_board`` has | 
|  | :zephyr_file:`boards/arm/reel_board/reel_board.dts`. | 
|  |  | 
|  | :file:`BOARD.dts` includes one or more ``.dtsi`` files. These ``.dtsi`` files | 
|  | describe the CPU or system-on-chip Zephyr runs on, perhaps by including other | 
|  | ``.dtsi`` files. They can also describe other common hardware features shared by | 
|  | multiple boards. In addition to these includes, :file:`BOARD.dts` also describes | 
|  | the board's specific hardware. | 
|  |  | 
|  | The :file:`dts/common` directory contains :file:`skeleton.dtsi`, a minimal | 
|  | include file for defining a complete devicetree. Architecture-specific | 
|  | subdirectories (:file:`dts/<ARCH>`) contain ``.dtsi`` files for CPUs or SoCs | 
|  | which extend :file:`skeleton.dtsi`. | 
|  |  | 
|  | The C preprocessor is run on all devicetree files to expand macro references, | 
|  | and includes are generally done with ``#include <filename>`` directives, even | 
|  | though DTS has a ``/include/ "<filename>"`` syntax. | 
|  |  | 
|  | :file:`BOARD.dts` can be extended or modified using *overlays*. Overlays are | 
|  | also DTS files; the :file:`.overlay` extension is just a convention which makes | 
|  | their purpose clear. Overlays adapt the base devicetree for different purposes: | 
|  |  | 
|  | - Zephyr applications can use overlays to enable a peripheral that is disabled | 
|  | by default, select a sensor on the board for an application specific purpose, | 
|  | etc. Along with :ref:`kconfig`, this makes it possible to reconfigure the | 
|  | kernel and device drivers without modifying source code. | 
|  |  | 
|  | - Overlays are also used when defining :ref:`shields`. | 
|  |  | 
|  | The build system automatically picks up :file:`.overlay` files stored in | 
|  | certain locations. It is also possible to explicitly list the overlays to | 
|  | include, via the :makevar:`DTC_OVERLAY_FILE` CMake variable. See | 
|  | :ref:`set-devicetree-overlays` for details. | 
|  |  | 
|  | The build system combines :file:`BOARD.dts` and any :file:`.overlay` files by | 
|  | concatenating them, with the overlays put last. This relies on DTS syntax which | 
|  | allows merging overlapping definitions of nodes in the devicetree. See | 
|  | :ref:`dt_k6x_example` for an example of how this works (in the context of | 
|  | ``.dtsi`` files, but the principle is the same for overlays). Putting the | 
|  | contents of the :file:`.overlay` files last allows them to override | 
|  | :file:`BOARD.dts`. | 
|  |  | 
|  | :ref:`dt-bindings` (which are YAML files) are essentially glue. They describe | 
|  | the contents of devicetree sources, includes, and overlays in a way that allows | 
|  | the build system to generate C macros usable by device drivers and | 
|  | applications. The :file:`dts/bindings` directory contains bindings. | 
|  |  | 
|  | .. _dt-scripts: | 
|  |  | 
|  | Scripts and tools | 
|  | ***************** | 
|  |  | 
|  | The following libraries and scripts, located in :zephyr_file:`scripts/dts/`, | 
|  | create output files from input files. Their sources have extensive | 
|  | documentation. | 
|  |  | 
|  | :zephyr_file:`dtlib.py <scripts/dts/python-devicetree/src/devicetree/dtlib.py>` | 
|  | A low-level DTS parsing library. | 
|  |  | 
|  | :zephyr_file:`edtlib.py <scripts/dts/python-devicetree/src/devicetree/edtlib.py>` | 
|  | A library layered on top of dtlib that uses bindings to interpret | 
|  | properties and give a higher-level view of the devicetree. Uses dtlib to do | 
|  | the DTS parsing. | 
|  |  | 
|  | :zephyr_file:`gen_defines.py <scripts/dts/python-devicetree/src/devicetree/edtlib.py>` | 
|  | A script that uses edtlib to generate C preprocessor macros from the | 
|  | devicetree and bindings. | 
|  |  | 
|  | In addition to these, the standard ``dtc`` (devicetree compiler) tool is run on | 
|  | the final devicetree if it is installed on your system. This is just to catch | 
|  | errors or warnings. The output is unused. Boards may need to pass ``dtc`` | 
|  | additional flags, e.g. for warning suppression. Board directories can contain a | 
|  | file named :file:`pre_dt_board.cmake` which configures these extra flags, like | 
|  | this: | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | list(APPEND EXTRA_DTC_FLAGS "-Wno-simple_bus_reg") | 
|  |  | 
|  | .. _dt-outputs: | 
|  |  | 
|  | Output files | 
|  | ************ | 
|  |  | 
|  | These are created in your application's build directory. | 
|  |  | 
|  | .. warning:: | 
|  |  | 
|  | Don't include the header files directly. :ref:`dt-from-c` explains | 
|  | what to do instead. | 
|  |  | 
|  | :file:`<build>/zephyr/zephyr.dts.pre` | 
|  | The preprocessed DTS source. This is an intermediate output file, which is | 
|  | input to :file:`gen_defines.py` and used to create :file:`zephyr.dts` and | 
|  | :file:`devicetree_generated.h`. | 
|  |  | 
|  | :file:`<build>/zephyr/include/generated/devicetree_generated.h` | 
|  | The generated macros and additional comments describing the devicetree. | 
|  | Included by ``devicetree.h``. | 
|  |  | 
|  | :file:`<build>/zephyr/zephyr.dts` | 
|  | The final merged devicetree. This file is output by :file:`gen_defines.py`. | 
|  | It is useful for debugging any issues. If the devicetree compiler ``dtc`` is | 
|  | installed, it is also run on this file, to catch any additional warnings or | 
|  | errors. |