1.. _dt-bindings-file-syntax:
2
3Devicetree bindings syntax
4##########################
5
6This page documents the syntax of Zephyr's bindings format. Zephyr bindings
7files are YAML files. A :ref:`simple example <dt-bindings-simple-example>` was
8given in the introduction page.
9
10.. contents:: Contents
11   :local:
12   :depth: 3
13
14Top level keys
15**************
16
17The top level of a bindings file maps keys to values. The top-level keys look
18like this:
19
20.. code-block:: yaml
21
22   # A high level description of the device the binding applies to:
23   description: |
24      This is the Vendomatic company's foo-device.
25
26      Descriptions which span multiple lines (like this) are OK,
27      and are encouraged for complex bindings.
28
29      See https://yaml-multiline.info/ for formatting help.
30
31   # You can include definitions from other bindings using this syntax:
32   include: other.yaml
33
34   # Used to match nodes to this binding:
35   compatible: "manufacturer,foo-device"
36
37   properties:
38     # Requirements for and descriptions of the properties that this
39     # binding's nodes need to satisfy go here.
40
41   child-binding:
42     # You can constrain the children of the nodes matching this binding
43     # using this key.
44
45   # If the node describes bus hardware, like an SPI bus controller
46   # on an SoC, use 'bus:' to say which one, like this:
47   bus: spi
48
49   # If the node instead appears as a device on a bus, like an external
50   # SPI memory chip, use 'on-bus:' to say what type of bus, like this.
51   # Like 'compatible', this key also influences the way nodes match
52   # bindings.
53   on-bus: spi
54
55   foo-cells:
56     # "Specifier" cell names for the 'foo' domain go here; example 'foo'
57     # values are 'gpio', 'pwm', and 'dma'. See below for more information.
58
59These keys are explained in the following sections.
60
61.. _dt-bindings-description:
62
63Description
64***********
65
66A free-form description of node hardware goes here. You can put links to
67datasheets or example nodes or properties as well.
68
69.. _dt-bindings-compatible:
70
71Compatible
72**********
73
74This key is used to match nodes to this binding as described in
75:ref:`dt-binding-compat`. It should look like this in a binding file:
76
77.. code-block:: YAML
78
79   # Note the comma-separated vendor prefix and device name
80   compatible: "manufacturer,device"
81
82This devicetree node would match the above binding:
83
84.. code-block:: devicetree
85
86   device {
87   	compatible = "manufacturer,device";
88   };
89
90Assuming no binding has ``compatible: "manufacturer,device-v2"``, it would also
91match this node:
92
93.. code-block:: devicetree
94
95    device-2 {
96        compatible = "manufacturer,device-v2", "manufacturer,device";
97    };
98
99Each node's ``compatible`` property is tried in order. The first matching
100binding is used. The :ref:`on-bus: <dt-bindings-on-bus>` key can be used to
101refine the search.
102
103If more than one binding for a compatible is found, an error is raised.
104
105The ``manufacturer`` prefix identifies the device vendor. See
106:zephyr_file:`dts/bindings/vendor-prefixes.txt` for a list of accepted vendor
107prefixes. The ``device`` part is usually from the datasheet.
108
109Some bindings apply to a generic class of devices which do not have a specific
110vendor. In these cases, there is no vendor prefix. One example is the
111:dtcompatible:`gpio-leds` compatible which is commonly used to describe board
112LEDs connected to GPIOs.
113
114.. _dt-bindings-properties:
115
116Properties
117**********
118
119The ``properties:`` key describes properties that nodes which match the binding
120contain. For example, a binding for a UART peripheral might look something like
121this:
122
123.. code-block:: YAML
124
125   compatible: "manufacturer,serial"
126
127   properties:
128     reg:
129       type: array
130       description: UART peripheral MMIO register space
131       required: true
132     current-speed:
133       type: int
134       description: current baud rate
135       required: true
136
137In this example, a node with compatible ``"manufacturer,serial"`` must contain
138a node named ``current-speed``. The property's value must be a single integer.
139Similarly, the node must contain a ``reg`` property.
140
141The build system uses bindings to generate C macros for devicetree properties
142that appear in DTS files. You can read more about how to get property values in
143source code from these macros in :ref:`dt-from-c`. Generally speaking, the
144build system only generates macros for properties listed in the ``properties:``
145key for the matching binding. Properties not mentioned in the binding are
146generally ignored by the build system.
147
148The one exception is that the build system will always generate macros for
149standard properties, like :ref:`reg <dt-important-props>`, whose meaning is
150defined by the devicetree specification. This happens regardless of whether the
151node has a matching binding or not.
152
153Property entry syntax
154=====================
155
156Property entries in ``properties:`` are written in this syntax:
157
158.. code-block:: none
159
160   <property name>:
161     required: <true | false>
162     type: <string | int | boolean | array | uint8-array | string-array |
163            phandle | phandles | phandle-array | path | compound>
164     deprecated: <true | false>
165     default: <default>
166     description: <description of the property>
167     enum:
168       - <item1>
169       - <item2>
170       ...
171       - <itemN>
172     const: <string | int | array | uint8-array | string-array>
173     specifier-space: <space-name>
174
175.. _dt-bindings-example-properties:
176
177Example property definitions
178============================
179
180Here are some more examples.
181
182.. code-block:: YAML
183
184   properties:
185       # Describes a property like 'current-speed = <115200>;'. We pretend that
186       # it's obligatory for the example node and set 'required: true'.
187       current-speed:
188           type: int
189           required: true
190           description: Initial baud rate for bar-device
191
192       # Describes an optional property like 'keys = "foo", "bar";'
193       keys:
194           type: string-array
195           description: Keys for bar-device
196
197       # Describes an optional property like 'maximum-speed = "full-speed";'
198       # the enum specifies known values that the string property may take
199       maximum-speed:
200           type: string
201           description: Configures USB controllers to work up to a specific speed.
202           enum:
203              - "low-speed"
204              - "full-speed"
205              - "high-speed"
206              - "super-speed"
207
208       # Describes an optional property like 'resolution = <16>;'
209       # the enum specifies known values that the int property may take
210       resolution:
211         type: int
212         enum:
213          - 8
214          - 16
215          - 24
216          - 32
217
218       # Describes a required property '#address-cells = <1>';  the const
219       # specifies that the value for the property is expected to be the value 1
220       "#address-cells":
221           type: int
222           required: true
223           const: 1
224
225       int-with-default:
226           type: int
227           default: 123
228           description: Value for int register, default is power-up configuration.
229
230       array-with-default:
231           type: array
232           default: [1, 2, 3] # Same as 'array-with-default = <1 2 3>'
233
234       string-with-default:
235           type: string
236           default: "foo"
237
238       string-array-with-default:
239           type: string-array
240           default: ["foo", "bar"] # Same as 'string-array-with-default = "foo", "bar"'
241
242       uint8-array-with-default:
243           type: uint8-array
244           default: [0x12, 0x34] # Same as 'uint8-array-with-default = [12 34]'
245
246required
247========
248
249Adding ``required: true`` to a property definition will fail the build if a
250node matches the binding, but does not contain the property.
251
252The default setting is ``required: false``; that is, properties are optional by
253default. Using ``required: false`` is therefore redundant and strongly
254discouraged.
255
256type
257====
258
259The type of a property constrains its values. The following types are
260available. See :ref:`dt-writing-property-values` for more details about writing
261values of each type in a DTS file. See :ref:`dt-phandles` for more information
262about the ``phandle*`` type properties.
263
264.. list-table::
265   :header-rows: 1
266   :widths: 1 3 2
267
268   * - Type
269     - Description
270     - Example in DTS
271
272   * - ``string``
273     - exactly one string
274     - ``status = "disabled";``
275
276   * - ``int``
277     - exactly one 32-bit value (cell)
278     - ``current-speed = <115200>;``
279
280   * - ``boolean``
281     - flags that don't take a value when true, and are absent if false
282     - ``hw-flow-control;``
283
284   * - ``array``
285     - zero or more 32-bit values (cells)
286     - ``offsets = <0x100 0x200 0x300>;``
287
288   * - ``uint8-array``
289     - zero or more bytes, in hex ('bytestring' in the Devicetree specification)
290     - ``local-mac-address = [de ad be ef 12 34];``
291
292   * - ``string-array``
293     - zero or more strings
294     - ``dma-names = "tx", "rx";``
295
296   * - ``phandle``
297     - exactly one phandle
298     - ``interrupt-parent = <&gic>;``
299
300   * - ``phandles``
301     - zero or more phandles
302     - ``pinctrl-0 = <&usart2_tx_pd5 &usart2_rx_pd6>;``
303
304   * - ``phandle-array``
305     - a list of phandles and 32-bit cells (usually specifiers)
306     - ``dmas = <&dma0 2>, <&dma0 3>;``
307
308   * - ``path``
309     - a path to a node as a phandle path reference or path string
310     - ``zephyr,bt-c2h-uart = &uart0;`` or
311       ``foo = "/path/to/some/node";``
312
313   * - ``compound``
314     - a catch-all for more complex types (no macros will be generated)
315     - ``foo = <&label>, [01 02];``
316
317deprecated
318==========
319
320A property with ``deprecated: true`` indicates to both the user and the tooling
321that the property is meant to be phased out.
322
323The tooling will report a warning if the devicetree includes the property that
324is flagged as deprecated. (This warning is upgraded to an error in the
325:ref:`twister_script` for upstream pull requests.)
326
327The default setting is ``deprecated: false``. Using ``deprecated: false`` is
328therefore redundant and strongly discouraged.
329
330.. _dt-bindings-default:
331
332default
333=======
334
335The optional ``default:`` setting gives a value that will be used if the
336property is missing from the devicetree node.
337
338For example, with this binding fragment:
339
340.. code-block:: YAML
341
342   properties:
343     foo:
344       type: int
345       default: 3
346
347If property ``foo`` is missing in a matching node, then the output will be as
348if ``foo = <3>;`` had appeared in the DTS (except YAML data types are used for
349the default value).
350
351Note that combining ``default:`` with ``required: true`` will raise an error.
352
353For rules related to ``default`` in upstream Zephyr bindings, see
354:ref:`dt-bindings-default-rules`.
355
356See :ref:`dt-bindings-example-properties` for examples. Putting ``default:`` on
357any property type besides those used in :ref:`dt-bindings-example-properties`
358will raise an error.
359
360enum
361====
362
363The ``enum:`` line is followed by a list of values the property may contain. If
364a property value in DTS is not in the ``enum:`` list in the binding, an error
365is raised. See :ref:`dt-bindings-example-properties` for examples.
366
367const
368=====
369
370This specifies a constant value the property must take. It is mainly useful for
371constraining the values of common properties for a particular piece of
372hardware.
373
374.. _dt-bindings-specifier-space:
375
376specifier-space
377===============
378
379.. warning::
380
381   It is an abuse of this feature to use it to name properties in
382   unconventional ways.
383
384   For example, this feature is not meant for cases like naming a property
385   ``my-pin``, then assigning it to the "gpio" specifier space using this
386   feature. Properties which refer to GPIOs should use conventional names, i.e.
387   end in ``-gpios`` or ``-gpio``.
388
389This property, if present, manually sets the specifier space associated with a
390property with type ``phandle-array``.
391
392Normally, the specifier space is encoded implicitly in the property name. A
393property named ``foos`` with type ``phandle-array`` implicitly has specifier
394space ``foo``. As a special case, ``*-gpios`` properties have specifier space
395"gpio", so that ``foo-gpios`` will have specifier space "gpio" rather than
396"foo-gpio".
397
398You can use ``specifier-space`` to manually provide a space if
399using this convention would result in an awkward or unconventional name.
400
401For example:
402
403.. code-block:: YAML
404
405   compatible: ...
406   properties:
407     bar:
408       type: phandle-array
409       specifier-space: my-custom-space
410
411Above, the ``bar`` property's specifier space is set to "my-custom-space".
412
413You could then use the property in a devicetree like this:
414
415.. code-block:: DTS
416
417   controller1: custom-controller@1000 {
418           #my-custom-space-cells = <2>;
419   };
420
421   controller2: custom-controller@2000 {
422           #my-custom-space-cells = <1>;
423   };
424
425   my-node {
426           bar = <&controller1 10 20>, <&controller2 30>;
427   };
428
429Generally speaking, you should reserve this feature for cases where the
430implicit specifier space naming convention doesn't work. One appropriate
431example is an ``mboxes`` property with specifier space "mbox", not "mboxe". You
432can write this property as follows:
433
434.. code-block:: YAML
435
436   properties:
437     mboxes:
438       type: phandle-array
439       specifier-space: mbox
440
441.. _dt-bindings-child:
442
443Child-binding
444*************
445
446``child-binding`` can be used when a node has children that all share the same
447properties. Each child gets the contents of ``child-binding`` as its binding,
448though an explicit ``compatible = ...`` on the child node takes precedence, if
449a binding is found for it.
450
451Consider a binding for a PWM LED node like this one, where the child nodes are
452required to have a ``pwms`` property:
453
454.. code-block:: devicetree
455
456   pwmleds {
457           compatible = "pwm-leds";
458
459           red_pwm_led {
460                   pwms = <&pwm3 4 15625000>;
461           };
462           green_pwm_led {
463                   pwms = <&pwm3 0 15625000>;
464           };
465           /* ... */
466   };
467
468The binding would look like this:
469
470.. code-block:: YAML
471
472   compatible: "pwm-leds"
473
474   child-binding:
475     description: LED that uses PWM
476
477     properties:
478       pwms:
479         type: phandle-array
480         required: true
481
482``child-binding`` also works recursively. For example, this binding:
483
484.. code-block:: YAML
485
486   compatible: foo
487
488   child-binding:
489     child-binding:
490       properties:
491         my-property:
492           type: int
493           required: true
494
495will apply to the ``grandchild`` node in this DTS:
496
497.. code-block:: devicetree
498
499   parent {
500           compatible = "foo";
501           child {
502                   grandchild {
503                           my-property = <123>;
504                   };
505           };
506   };
507
508.. _dt-bindings-bus:
509
510Bus
511***
512
513If the node is a bus controller, use ``bus:`` in the binding to say what type
514of bus. For example, a binding for a SPI peripheral on an SoC would look like
515this:
516
517.. code-block:: YAML
518
519   compatible: "manufacturer,spi-peripheral"
520   bus: spi
521   # ...
522
523The presence of this key in the binding informs the build system that the
524children of any node matching this binding appear on this type of bus.
525
526This in turn influences the way ``on-bus:`` is used to match bindings for the
527child nodes.
528
529For a single bus supporting multiple protocols, e.g. I3C and I2C, the ``bus:``
530in the binding can have a list as value:
531
532.. code-block:: YAML
533
534   compatible: "manufacturer,i3c-controller"
535   bus: [i3c, i2c]
536   # ...
537
538.. _dt-bindings-on-bus:
539
540On-bus
541******
542
543If the node appears as a device on a bus, use ``on-bus:`` in the binding to say
544what type of bus.
545
546For example, a binding for an external SPI memory chip should include this line:
547
548.. code-block:: YAML
549
550   on-bus: spi
551
552And a binding for an I2C based temperature sensor should include this line:
553
554.. code-block:: YAML
555
556   on-bus: i2c
557
558When looking for a binding for a node, the build system checks if the binding
559for the parent node contains ``bus: <bus type>``. If it does, then only
560bindings with a matching ``on-bus: <bus type>`` and bindings without an
561explicit ``on-bus`` are considered. Bindings with an explicit ``on-bus: <bus
562type>`` are searched for first, before bindings without an explicit ``on-bus``.
563The search repeats for each item in the node's ``compatible`` property, in
564order.
565
566This feature allows the same device to have different bindings depending on
567what bus it appears on. For example, consider a sensor device with compatible
568``manufacturer,sensor`` which can be used via either I2C or SPI.
569
570The sensor node may therefore appear in the devicetree as a child node of
571either an SPI or an I2C controller, like this:
572
573.. code-block:: devicetree
574
575   spi-bus@0 {
576      /* ... some compatible with 'bus: spi', etc. ... */
577
578      sensor@0 {
579          compatible = "manufacturer,sensor";
580          reg = <0>;
581          /* ... */
582      };
583   };
584
585   i2c-bus@0 {
586      /* ... some compatible with 'bus: i2c', etc. ... */
587
588      sensor@79 {
589          compatible = "manufacturer,sensor";
590          reg = <79>;
591          /* ... */
592      };
593   };
594
595You can write two separate binding files which match these individual sensor
596nodes, even though they have the same compatible:
597
598.. code-block:: YAML
599
600   # manufacturer,sensor-spi.yaml, which matches sensor@0 on the SPI bus:
601   compatible: "manufacturer,sensor"
602   on-bus: spi
603
604   # manufacturer,sensor-i2c.yaml, which matches sensor@79 on the I2C bus:
605   compatible: "manufacturer,sensor"
606   properties:
607     uses-clock-stretching:
608       type: boolean
609   on-bus: i2c
610
611Only ``sensor@79`` can have a ``use-clock-stretching`` property. The
612bus-sensitive logic ignores :file:`manufacturer,sensor-i2c.yaml` when searching
613for a binding for ``sensor@0``.
614
615.. _dt-bindings-cells:
616
617Specifier cell names (\*-cells)
618*******************************
619
620This section documents how to name the cells in a specifier within a binding.
621These concepts are discussed in detail later in this guide in
622:ref:`dt-phandle-arrays`.
623
624Consider a binding for a node whose phandle may appear in a ``phandle-array``
625property, like the PWM controllers ``pwm1`` and ``pwm2`` in this example:
626
627.. code-block:: DTS
628
629   pwm1: pwm@deadbeef {
630       compatible = "foo,pwm";
631       #pwm-cells = <2>;
632   };
633
634   pwm2: pwm@deadbeef {
635       compatible = "foo,pwm";
636       #pwm-cells = <1>;
637   };
638
639   my-node {
640       pwms = <&pwm1 1 2000>, <&pwm2 3000>;
641   };
642
643The bindings for compatible ``"foo,pwm"`` and ``"bar,pwm"`` must give a name to
644the cells that appear in a PWM specifier using ``pwm-cells:``, like this:
645
646.. code-block:: YAML
647
648   # foo,pwm.yaml
649   compatible: "foo,pwm"
650   ...
651   pwm-cells:
652     - channel
653     - period
654
655   # bar,pwm.yaml
656   compatible: "bar,pwm"
657   ...
658   pwm-cells:
659     - period
660
661A ``*-names`` (e.g. ``pwm-names``) property can appear on the node as well,
662giving a name to each entry.
663
664This allows the cells in the specifiers to be accessed by name, e.g. using APIs
665like :c:macro:`DT_PWMS_CHANNEL_BY_NAME`.
666
667If the specifier is empty (e.g. ``#clock-cells = <0>``), then ``*-cells`` can
668either be omitted (recommended) or set to an empty array. Note that an empty
669array is specified as e.g. ``clock-cells: []`` in YAML.
670
671.. _dt-bindings-include:
672
673Include
674*******
675
676Bindings can include other files, which can be used to share common property
677definitions between bindings. Use the ``include:`` key for this. Its value is
678either a string or a list.
679
680In the simplest case, you can include another file by giving its name as a
681string, like this:
682
683.. code-block:: YAML
684
685   include: foo.yaml
686
687If any file named :file:`foo.yaml` is found (see
688:ref:`dt-where-bindings-are-located` for the search process), it will be
689included into this binding.
690
691Included files are merged into bindings with a simple recursive dictionary
692merge. The build system will check that the resulting merged binding is
693well-formed. It is allowed to include at any level, including ``child-binding``,
694like this:
695
696.. code-block:: YAML
697
698   # foo.yaml will be merged with content at this level
699   include: foo.yaml
700
701   child-binding:
702     # bar.yaml will be merged with content at this level
703     include: bar.yaml
704
705It is an error if a key appears with a different value in a binding and in a
706file it includes, with one exception: a binding can have ``required: true`` for
707a :ref:`property definition <dt-bindings-properties>` for which the included
708file has ``required: false``. The ``required: true`` takes precedence, allowing
709bindings to strengthen requirements from included files.
710
711Note that weakening requirements by having ``required: false`` where the
712included file has ``required: true`` is an error. This is meant to keep the
713organization clean.
714
715The file :zephyr_file:`base.yaml <dts/bindings/base/base.yaml>` contains
716definitions for many common properties. When writing a new binding, it is a
717good idea to check if :file:`base.yaml` already defines some of the needed
718properties, and include it if it does.
719
720Note that you can make a property defined in base.yaml obligatory like this,
721taking :ref:`reg <dt-important-props>` as an example:
722
723.. code-block:: YAML
724
725   reg:
726     required: true
727
728This relies on the dictionary merge to fill in the other keys for ``reg``, like
729``type``.
730
731To include multiple files, you can use a list of strings:
732
733.. code-block:: YAML
734
735   include:
736     - foo.yaml
737     - bar.yaml
738
739This includes the files :file:`foo.yaml` and :file:`bar.yaml`. (You can
740write this list in a single line of YAML as ``include: [foo.yaml, bar.yaml]``.)
741
742When including multiple files, any overlapping ``required`` keys on properties
743in the included files are ORed together. This makes sure that a ``required:
744true`` is always respected.
745
746In some cases, you may want to include some property definitions from a file,
747but not all of them. In this case, ``include:`` should be a list, and you can
748filter out just the definitions you want by putting a mapping in the list, like
749this:
750
751.. code-block:: YAML
752
753   include:
754     - name: foo.yaml
755       property-allowlist:
756         - i-want-this-one
757         - and-this-one
758     - name: bar.yaml
759       property-blocklist:
760         - do-not-include-this-one
761         - or-this-one
762
763Each map element must have a ``name`` key which is the filename to include, and
764may have ``property-allowlist`` and ``property-blocklist`` keys that filter
765which properties are included.
766
767You cannot have a single map element with both ``property-allowlist`` and
768``property-blocklist`` keys. A map element with neither ``property-allowlist``
769nor ``property-blocklist`` is valid; no additional filtering is done.
770
771You can freely intermix strings and mappings in a single ``include:`` list:
772
773.. code-block:: YAML
774
775   include:
776     - foo.yaml
777     - name: bar.yaml
778       property-blocklist:
779         - do-not-include-this-one
780         - or-this-one
781
782Finally, you can filter from a child binding like this:
783
784.. code-block:: YAML
785
786   include:
787     - name: bar.yaml
788       child-binding:
789         property-allowlist:
790           - child-prop-to-allow
791
792Nexus nodes and maps
793********************
794
795All ``phandle-array`` type properties support mapping through ``*-map``
796properties, e.g. ``gpio-map``, as defined by the Devicetree specification.
797
798This is used, for example, to define connector nodes for common breakout
799headers, such as the ``arduino_header`` nodes that are conventionally defined
800in the devicetrees for boards with Arduino compatible expansion headers.
801