.. _devicetree-scope-purpose: Scope and purpose ***************** A *devicetree* is primarily a hierarchical data structure that describes hardware. The `Devicetree specification`_ defines its source and binary representations. .. _Devicetree specification: https://www.devicetree.org/ Zephyr uses devicetree to describe: - the hardware available on its :ref:`boards` - that hardware's initial configuration As such, devicetree is both a hardware description language and a configuration language for Zephyr. See :ref:`dt_vs_kconfig` for some comparisons between devicetree and Zephyr's other main configuration language, Kconfig. There are two types of devicetree input files: *devicetree sources* and *devicetree bindings*. The sources contain the devicetree itself. The bindings describe its contents, including data types. The :ref:`build system ` uses devicetree sources and bindings to produce a generated C header. The generated header's contents are abstracted by the ``devicetree.h`` API, which you can use to get information from your devicetree. Here is a simplified view of the process: .. figure:: ../../../../../../../zephyr/doc/build/dts/zephyr_dt_build_flow.png :figclass: align-center Devicetree build flow All Zephyr and application source code files can include and use ``devicetree.h``. This includes :ref:`device drivers `, :ref:`applications `, :ref:`tests `, the kernel, etc. The API itself is based on C macros. The macro names all start with ``DT_``. In general, if you see a macro that starts with ``DT_`` in a Zephyr source file, it's probably a ``devicetree.h`` macro. The generated C header contains macros that start with ``DT_`` as well; you might see those in compiler error messages. You always can tell a generated- from a non-generated macro: generated macros have some lowercased letters, while the ``devicetree.h`` macro names have all capital letters.