2020-10-08 03:39:32 +08:00
|
|
|
.. _devicetree_api:
|
|
|
|
|
|
|
|
Devicetree API
|
|
|
|
##############
|
|
|
|
|
|
|
|
This is a reference page for the ``<devicetree.h>`` API. The API is macro
|
|
|
|
based. Use of these macros has no impact on scheduling. They can be used from
|
|
|
|
any calling context and at file scope.
|
|
|
|
|
|
|
|
Some of these require a special macro named ``DT_DRV_COMPAT`` to be defined
|
|
|
|
before they can be used; these are discussed individually below. These macros
|
|
|
|
are generally meant for use within :ref:`device drivers <device_model_api>`,
|
|
|
|
though they can be used outside of drivers with appropriate care.
|
|
|
|
|
|
|
|
.. _devicetree-generic-apis:
|
|
|
|
|
|
|
|
Generic APIs
|
|
|
|
************
|
|
|
|
|
|
|
|
The APIs in this section can be used anywhere and do not require
|
|
|
|
``DT_DRV_COMPAT`` to be defined.
|
|
|
|
|
2020-12-12 05:51:36 +08:00
|
|
|
Node identifiers and helpers
|
|
|
|
============================
|
2020-10-08 03:39:32 +08:00
|
|
|
|
|
|
|
A *node identifier* is a way to refer to a devicetree node at C preprocessor
|
|
|
|
time. While node identifiers are not C values, you can use them to access
|
|
|
|
devicetree data in C rvalue form using, for example, the
|
|
|
|
:ref:`devicetree-property-access` API.
|
|
|
|
|
|
|
|
The root node ``/`` has node identifier ``DT_ROOT``. You can create node
|
|
|
|
identifiers for other devicetree nodes using :c:func:`DT_PATH`,
|
|
|
|
:c:func:`DT_NODELABEL`, :c:func:`DT_ALIAS`, and :c:func:`DT_INST`.
|
|
|
|
|
|
|
|
There are also :c:func:`DT_PARENT` and :c:func:`DT_CHILD` macros which can be
|
|
|
|
used to create node identifiers for a given node's parent node or a particular
|
|
|
|
child node, respectively.
|
|
|
|
|
2020-12-12 05:51:36 +08:00
|
|
|
The following macros create or operate on node identifiers.
|
|
|
|
|
2020-10-08 03:39:32 +08:00
|
|
|
.. doxygengroup:: devicetree-generic-id
|
|
|
|
|
|
|
|
.. _devicetree-property-access:
|
|
|
|
|
|
|
|
Property access
|
|
|
|
===============
|
|
|
|
|
|
|
|
The following general-purpose macros can be used to access node properties.
|
|
|
|
There are special-purpose APIs for accessing the :ref:`devicetree-reg-property`
|
|
|
|
and :ref:`devicetree-interrupts-property`.
|
|
|
|
|
|
|
|
Property values can be read using these macros even if the node is disabled,
|
|
|
|
as long as it has a matching binding.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-generic-prop
|
|
|
|
|
|
|
|
.. _devicetree-reg-property:
|
|
|
|
|
|
|
|
``reg`` property
|
|
|
|
================
|
|
|
|
|
|
|
|
Use these APIs instead of :ref:`devicetree-property-access` to access the
|
|
|
|
``reg`` property. Because this property's semantics are defined by the
|
|
|
|
devicetree specification, these macros can be used even for nodes without
|
|
|
|
matching bindings.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-reg-prop
|
|
|
|
|
|
|
|
.. _devicetree-interrupts-property:
|
|
|
|
|
|
|
|
``interrupts`` property
|
|
|
|
=======================
|
|
|
|
|
|
|
|
Use these APIs instead of :ref:`devicetree-property-access` to access the
|
|
|
|
``interrupts`` property.
|
|
|
|
|
|
|
|
Because this property's semantics are defined by the devicetree specification,
|
|
|
|
some of these macros can be used even for nodes without matching bindings. This
|
|
|
|
does not apply to macros which take cell names as arguments.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-interrupts-prop
|
|
|
|
|
|
|
|
For-each macros
|
|
|
|
===============
|
|
|
|
|
|
|
|
There is currently only one "generic" for-each macro,
|
|
|
|
:c:func:`DT_FOREACH_CHILD`, which allows iterating over the children of a
|
|
|
|
devicetree node.
|
|
|
|
|
|
|
|
There are special-purpose for-each macros, like
|
|
|
|
:c:func:`DT_INST_FOREACH_STATUS_OKAY`, but these require ``DT_DRV_COMPAT`` to
|
|
|
|
be defined before use.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-generic-foreach
|
|
|
|
|
|
|
|
Existence checks
|
|
|
|
================
|
|
|
|
|
|
|
|
This section documents miscellaneous macros that can be used to test if a node
|
|
|
|
exists, how many nodes of a certain type exist, whether a node has certain
|
|
|
|
properties, etc. Some macros used for special purposes (such as
|
|
|
|
:c:func:`DT_IRQ_HAS_IDX` and all macros which require ``DT_DRV_COMPAT``) are
|
|
|
|
documented elsewhere on this page.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-generic-exist
|
|
|
|
|
|
|
|
.. _devicetree-dep-ord:
|
|
|
|
|
|
|
|
Inter-node dependencies
|
|
|
|
=======================
|
|
|
|
|
|
|
|
The ``devicetree.h`` API has some support for tracking dependencies between
|
|
|
|
nodes. Dependency tracking relies on a binary "depends on" relation between
|
|
|
|
devicetree nodes, which is defined as the `transitive closure
|
|
|
|
<https://en.wikipedia.org/wiki/Transitive_closure>`_ of the following "directly
|
|
|
|
depends on" relation:
|
|
|
|
|
|
|
|
- every non-root node directly depends on its parent node
|
|
|
|
- a node directly depends on any nodes its properties refer to by phandle
|
|
|
|
- a node directly depends on its ``interrupt-parent`` if it has an
|
|
|
|
``interrupts`` property
|
|
|
|
|
|
|
|
A *dependency ordering* of a devicetree is a list of its nodes, where each node
|
|
|
|
``n`` appears earlier in the list than any nodes that depend on ``n``. A node's
|
|
|
|
*dependency ordinal* is then its zero-based index in that list. Thus, for two
|
|
|
|
distinct devicetree nodes ``n1`` and ``n2`` with dependency ordinals ``d1`` and
|
|
|
|
``d2``, we have:
|
|
|
|
|
|
|
|
- ``d1 != d2``
|
|
|
|
- if ``n1`` depends on ``n2``, then ``d1 > d2``
|
|
|
|
- ``d1 > d2`` does **not** necessarily imply that ``n1`` depends on ``n2``
|
|
|
|
|
|
|
|
The Zephyr build system chooses a dependency ordering of the final devicetree
|
|
|
|
and assigns a dependency ordinal to each node. Dependency related information
|
|
|
|
can be accessed using the following macros. The exact dependency ordering
|
|
|
|
chosen is an implementation detail, but cyclic dependencies are detected and
|
|
|
|
cause errors, so it's safe to assume there are none when using these macros.
|
|
|
|
|
|
|
|
There are instance number-based conveniences as well; see
|
|
|
|
:c:func:`DT_INST_DEP_ORD` and subsequent documentation.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-dep-ord
|
|
|
|
|
|
|
|
Bus helpers
|
|
|
|
===========
|
|
|
|
|
|
|
|
Zephyr's devicetree bindings language supports a ``bus:`` key which allows
|
|
|
|
bindings to declare that nodes with a given compatible describe system buses.
|
|
|
|
In this case, child nodes are considered to be on a bus of the given type, and
|
|
|
|
the following APIs may be used.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-generic-bus
|
|
|
|
|
|
|
|
.. _devicetree-inst-apis:
|
|
|
|
|
|
|
|
Instance-based APIs
|
|
|
|
*******************
|
|
|
|
|
|
|
|
These are recommended for use within device drivers. To use them, define
|
|
|
|
``DT_DRV_COMPAT`` to the lowercase-and-underscores compatible the device driver
|
|
|
|
implements support for. Here is an example devicetree fragment:
|
|
|
|
|
2021-03-17 18:21:21 +08:00
|
|
|
.. code-block:: devicetree
|
2020-10-08 03:39:32 +08:00
|
|
|
|
|
|
|
serial@40001000 {
|
|
|
|
compatible = "vnd,serial";
|
|
|
|
status = "okay";
|
|
|
|
current-speed = <115200>;
|
|
|
|
};
|
|
|
|
|
|
|
|
Example usage, assuming serial@40001000 is the only enabled node
|
|
|
|
with compatible "vnd,serial":
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
#define DT_DRV_COMPAT vnd_serial
|
|
|
|
DT_DRV_INST(0) // node identifier for serial@40001000
|
|
|
|
DT_INST_PROP(0, current_speed) // 115200
|
|
|
|
|
|
|
|
.. warning::
|
|
|
|
|
|
|
|
Be careful making assumptions about instance numbers. See :c:func:`DT_INST`
|
|
|
|
for the API guarantees.
|
|
|
|
|
|
|
|
As shown above, the ``DT_INST_*`` APIs are conveniences for addressing nodes by
|
|
|
|
instance number. They are almost all defined in terms of one of the
|
|
|
|
:ref:`devicetree-generic-apis`. The equivalent generic API can be found by
|
|
|
|
removing ``INST_`` from the macro name. For example, ``DT_INST_PROP(inst,
|
|
|
|
prop)`` is equivalent to ``DT_PROP(DT_DRV_INST(inst), prop)``. Similarly,
|
|
|
|
``DT_INST_REG_ADDR(inst)`` is equivalent to ``DT_REG_ADDR(DT_DRV_INST(inst))``,
|
|
|
|
and so on. There are some exceptions: :c:func:`DT_ANY_INST_ON_BUS_STATUS_OKAY`
|
|
|
|
and :c:func:`DT_INST_FOREACH_STATUS_OKAY` are special-purpose helpers without
|
|
|
|
straightforward generic equivalents.
|
|
|
|
|
|
|
|
Since ``DT_DRV_INST()`` requires ``DT_DRV_COMPAT`` to be defined, it's an error
|
|
|
|
to use any of these without that macro defined.
|
|
|
|
|
|
|
|
Note that there are also helpers available for
|
|
|
|
specific hardware; these are documented in :ref:`devicetree-hw-api`.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-inst
|
|
|
|
|
|
|
|
.. _devicetree-hw-api:
|
|
|
|
|
|
|
|
Hardware specific APIs
|
|
|
|
**********************
|
|
|
|
|
|
|
|
The following APIs can also be used by including ``<devicetree.h>``;
|
|
|
|
no additional include is needed.
|
|
|
|
|
|
|
|
Clocks
|
|
|
|
======
|
|
|
|
|
|
|
|
These conveniences may be used for nodes which describe clock sources, and
|
|
|
|
properties related to them.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-clocks
|
|
|
|
|
|
|
|
DMA
|
|
|
|
===
|
|
|
|
|
|
|
|
These conveniences may be used for nodes which describe direct memory access
|
|
|
|
controllers or channels, and properties related to them.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-dmas
|
|
|
|
|
|
|
|
.. _devicetree-flash-api:
|
|
|
|
|
|
|
|
Fixed flash partitions
|
|
|
|
======================
|
|
|
|
|
|
|
|
These conveniences may be used for the special-purpose ``fixed-partitions``
|
|
|
|
compatible used to encode information about flash memory partitions in the
|
|
|
|
device tree. See :zephyr_file:`dts/bindings/mtd/partition.yaml` for this
|
|
|
|
compatible's binding.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-fixed-partition
|
|
|
|
|
|
|
|
.. _devicetree-gpio-api:
|
|
|
|
|
|
|
|
GPIO
|
|
|
|
====
|
|
|
|
|
|
|
|
These conveniences may be used for nodes which describe GPIO controllers/pins,
|
|
|
|
and properties related to them.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-gpio
|
|
|
|
|
|
|
|
IO channels
|
|
|
|
===========
|
|
|
|
|
|
|
|
These are commonly used by device drivers which need to use IO
|
|
|
|
channels (e.g. ADC or DAC channels) for conversion.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-io-channels
|
|
|
|
|
2021-10-02 01:36:21 +08:00
|
|
|
.. _devicetree-pinctrl-api:
|
|
|
|
|
2021-08-12 07:06:40 +08:00
|
|
|
Pinctrl (pin control)
|
|
|
|
=====================
|
|
|
|
|
|
|
|
These are used to access pin control properties by name or index.
|
|
|
|
|
|
|
|
Devicetree nodes may have properties which specify pin control (sometimes known
|
|
|
|
as pin mux) settings. These are expressed using ``pinctrl-<index>`` properties
|
|
|
|
within the node, where the ``<index>`` values are contiguous integers starting
|
|
|
|
from 0. These may also be named using the ``pinctrl-names`` property.
|
|
|
|
|
|
|
|
Here is an example:
|
|
|
|
|
|
|
|
.. code-block:: DTS
|
|
|
|
|
|
|
|
node {
|
|
|
|
...
|
|
|
|
pinctrl-0 = <&foo &bar ...>;
|
|
|
|
pinctrl-1 = <&baz ...>;
|
|
|
|
pinctrl-names = "default", "sleep";
|
|
|
|
};
|
|
|
|
|
|
|
|
Above, ``pinctrl-0`` has name ``"default"``, and ``pinctrl-1`` has name
|
|
|
|
``"sleep"``. The ``pinctrl-<index>`` property values contain phandles. The
|
|
|
|
``&foo``, ``&bar``, etc. phandles within the properties point to nodes whose
|
|
|
|
contents vary by platform, and which describe a pin configuration for the node.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-pinctrl
|
|
|
|
|
2020-10-08 03:39:32 +08:00
|
|
|
PWM
|
|
|
|
===
|
|
|
|
|
|
|
|
These conveniences may be used for nodes which describe PWM controllers and
|
|
|
|
properties related to them.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-pwms
|
|
|
|
|
|
|
|
SPI
|
|
|
|
===
|
|
|
|
|
|
|
|
These conveniences may be used for nodes which describe either SPI controllers
|
|
|
|
or devices, depending on the case.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-spi
|
|
|
|
|
|
|
|
.. _devicetree-chosen-nodes:
|
|
|
|
|
|
|
|
Chosen nodes
|
|
|
|
************
|
|
|
|
|
|
|
|
The special ``/chosen`` node contains properties whose values describe
|
|
|
|
system-wide settings. The :c:func:`DT_CHOSEN()` macro can be used to get a node
|
|
|
|
identifier for a chosen node.
|
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-generic-chosen
|
|
|
|
:project: Zephyr
|
|
|
|
|
|
|
|
There are also conveniences for commonly used zephyr-specific properties of the
|
2021-03-18 05:48:09 +08:00
|
|
|
``/chosen`` node.
|
2020-10-08 03:39:32 +08:00
|
|
|
|
|
|
|
.. doxygengroup:: devicetree-zephyr
|
|
|
|
:project: Zephyr
|
|
|
|
|
|
|
|
The following table documents some commonly used Zephyr-specific chosen nodes.
|
|
|
|
|
2021-03-18 05:48:09 +08:00
|
|
|
Sometimes, a chosen node's label property will be used to set the default value
|
|
|
|
of a Kconfig option which in turn configures a hardware-specific device. This
|
|
|
|
is usually for backwards compatibility in cases when the Kconfig option
|
|
|
|
predates devicetree support in Zephyr. In other cases, there is no Kconfig
|
|
|
|
option, and the devicetree node is used directly in the source code to select a
|
|
|
|
device.
|
2020-10-08 03:39:32 +08:00
|
|
|
|
|
|
|
.. Documentation maintainers: please keep this sorted by property name
|
|
|
|
|
|
|
|
.. list-table:: Zephyr-specific chosen properties
|
|
|
|
:header-rows: 1
|
|
|
|
|
|
|
|
* - Property
|
|
|
|
- Purpose
|
|
|
|
* - zephyr,bt-c2h-uart
|
2021-03-18 05:48:09 +08:00
|
|
|
- Selects the UART used for host communication in the
|
|
|
|
:ref:`bluetooth-hci-uart-sample`
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,bt-mon-uart
|
2021-08-25 01:34:48 +08:00
|
|
|
- Sets UART device used for the Bluetooth monitor logging
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,bt-uart
|
2021-08-25 01:34:48 +08:00
|
|
|
- Sets UART device used by Bluetooth
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,can-primary
|
|
|
|
- Sets the primary CAN controller
|
|
|
|
* - zephyr,ccm
|
|
|
|
- Core-Coupled Memory node on some STM32 SoCs
|
|
|
|
* - zephyr,code-partition
|
|
|
|
- Flash partition that the Zephyr image's text section should be linked
|
|
|
|
into
|
|
|
|
* - zephyr,console
|
2021-07-22 22:14:22 +08:00
|
|
|
- Sets UART device used by console driver
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,dtcm
|
|
|
|
- Data Tightly Coupled Memory node on some Arm SoCs
|
|
|
|
* - zephyr,entropy
|
|
|
|
- A device which can be used as a system-wide entropy source
|
|
|
|
* - zephyr,flash
|
|
|
|
- A node whose ``reg`` is sometimes used to set the defaults for
|
2021-06-28 22:24:59 +08:00
|
|
|
:kconfig:`CONFIG_FLASH_BASE_ADDRESS` and :kconfig:`CONFIG_FLASH_SIZE`
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,flash-controller
|
|
|
|
- The node corresponding to the flash controller device for
|
|
|
|
the ``zephyr,flash`` node
|
|
|
|
* - zephyr,ipc
|
|
|
|
- Used by the OpenAMP subsystem to specify the inter-process communication
|
|
|
|
(IPC) device
|
|
|
|
* - zephyr,ipc_shm
|
|
|
|
- A node whose ``reg`` is used by the OpenAMP subsystem to determine the
|
|
|
|
base address and size of the shared memory (SHM) usable for
|
|
|
|
interprocess-communication (IPC)
|
2021-01-06 22:52:28 +08:00
|
|
|
* - zephyr,itcm
|
|
|
|
- Instruction Tightly Coupled Memory node on some Arm SoCs
|
2021-07-22 20:31:54 +08:00
|
|
|
* - zephyr,ot-uart
|
|
|
|
- Used by the OpenThread to specify UART device for Spinel protocol
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,shell-uart
|
2021-08-24 20:24:30 +08:00
|
|
|
- Sets UART device used by serial shell backend
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,sram
|
|
|
|
- A node whose ``reg`` sets the base address and size of SRAM memory
|
|
|
|
available to the Zephyr image, used during linking
|
|
|
|
* - zephyr,uart-mcumgr
|
|
|
|
- UART used for :ref:`device_mgmt`
|
|
|
|
* - zephyr,uart-pipe
|
2021-06-28 22:24:59 +08:00
|
|
|
- Sets default :kconfig:`CONFIG_UART_PIPE_ON_DEV_NAME`
|
2020-10-08 03:39:32 +08:00
|
|
|
* - zephyr,usb-device
|
|
|
|
- USB device node. If defined and has a ``vbus-gpios`` property, these
|
|
|
|
will be used by the USB subsystem to enable/disable VBUS
|