Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 1 | .. SPDX-License-Identifier: GPL-2.0 |
| 2 | |
| 3 | Writing Devicetree Bindings in json-schema |
| 4 | ========================================== |
| 5 | |
| 6 | Devicetree bindings are written using json-schema vocabulary. Schema files are |
| 7 | written in a JSON-compatible subset of YAML. YAML is used instead of JSON as it |
| 8 | is considered more human readable and has some advantages such as allowing |
| 9 | comments (Prefixed with '#'). |
| 10 | |
| 11 | Also see :ref:`example-schema`. |
| 12 | |
| 13 | Schema Contents |
| 14 | --------------- |
| 15 | |
| 16 | Each schema doc is a structured json-schema which is defined by a set of |
| 17 | top-level properties. Generally, there is one binding defined per file. The |
| 18 | top-level json-schema properties used are: |
| 19 | |
| 20 | $id |
| 21 | A json-schema unique identifier string. The string must be a valid |
| 22 | URI typically containing the binding's filename and path. For DT schema, it must |
| 23 | begin with "http://devicetree.org/schemas/". The URL is used in constructing |
| 24 | references to other files specified in schema "$ref" properties. A $ref value |
| 25 | with a leading '/' will have the hostname prepended. A $ref value with only a |
| 26 | relative path or filename will be prepended with the hostname and path |
| 27 | components of the current schema file's '$id' value. A URL is used even for |
| 28 | local files, but there may not actually be files present at those locations. |
| 29 | |
| 30 | $schema |
| 31 | Indicates the meta-schema the schema file adheres to. |
| 32 | |
| 33 | title |
Tom Rini | 6bb92fc | 2024-05-20 09:54:58 -0600 | [diff] [blame] | 34 | A one-line description of the hardware being described in the binding schema. |
Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 35 | |
| 36 | maintainers |
| 37 | A DT specific property. Contains a list of email address(es) |
| 38 | for maintainers of this binding. |
| 39 | |
| 40 | description |
| 41 | Optional. A multi-line text block containing any detailed |
Tom Rini | 6bb92fc | 2024-05-20 09:54:58 -0600 | [diff] [blame] | 42 | information about this hardware. It should contain things such as what the block |
Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 43 | or device does, standards the device conforms to, and links to datasheets for |
| 44 | more information. |
| 45 | |
| 46 | select |
| 47 | Optional. A json-schema used to match nodes for applying the |
| 48 | schema. By default, without 'select', nodes are matched against their possible |
| 49 | compatible-string values or node name. Most bindings should not need select. |
| 50 | |
| 51 | allOf |
| 52 | Optional. A list of other schemas to include. This is used to |
| 53 | include other schemas the binding conforms to. This may be schemas for a |
| 54 | particular class of devices such as I2C or SPI controllers. |
| 55 | |
| 56 | properties |
| 57 | A set of sub-schema defining all the DT properties for the |
| 58 | binding. The exact schema syntax depends on whether properties are known, |
| 59 | common properties (e.g. 'interrupts') or are binding/vendor-specific |
| 60 | properties. |
| 61 | |
| 62 | A property can also define a child DT node with child properties defined |
| 63 | under it. |
| 64 | |
| 65 | For more details on properties sections, see 'Property Schema' section. |
| 66 | |
| 67 | patternProperties |
| 68 | Optional. Similar to 'properties', but names are regex. |
| 69 | |
| 70 | required |
| 71 | A list of DT properties from the 'properties' section that |
| 72 | must always be present. |
| 73 | |
Tom Rini | 6bb92fc | 2024-05-20 09:54:58 -0600 | [diff] [blame] | 74 | additionalProperties / unevaluatedProperties |
| 75 | Keywords controlling how schema will validate properties not matched by this |
| 76 | schema's 'properties' or 'patternProperties'. Each schema is supposed to |
| 77 | have exactly one of these keywords in top-level part, so either |
| 78 | additionalProperties or unevaluatedProperties. Nested nodes, so properties |
| 79 | being objects, are supposed to have one as well. |
| 80 | |
| 81 | * additionalProperties: false |
| 82 | Most common case, where no additional schema is referenced or if this |
| 83 | binding allows subset of properties from other referenced schemas. |
| 84 | |
| 85 | * unevaluatedProperties: false |
| 86 | Used when this binding references other schema whose all properties |
| 87 | should be allowed. |
| 88 | |
| 89 | * additionalProperties: true |
| 90 | Rare case, used for schemas implementing common set of properties. Such |
| 91 | schemas are supposed to be referenced by other schemas, which then use |
| 92 | 'unevaluatedProperties: false'. Typically bus or common-part schemas. |
| 93 | |
Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 94 | examples |
Tom Rini | 6bb92fc | 2024-05-20 09:54:58 -0600 | [diff] [blame] | 95 | Optional. A list of one or more DTS hunks implementing this binding only. |
| 96 | Example should not contain unrelated device nodes, e.g. consumer nodes in a |
| 97 | provider binding, other nodes referenced by phandle. |
| 98 | Note: YAML doesn't allow leading tabs, so spaces must be used instead. |
Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 99 | |
| 100 | Unless noted otherwise, all properties are required. |
| 101 | |
| 102 | Property Schema |
| 103 | --------------- |
| 104 | |
| 105 | The 'properties' section of the schema contains all the DT properties for a |
| 106 | binding. Each property contains a set of constraints using json-schema |
| 107 | vocabulary for that property. The properties schemas are what are used for |
| 108 | validation of DT files. |
| 109 | |
| 110 | For common properties, only additional constraints not covered by the common, |
| 111 | binding schema need to be defined such as how many values are valid or what |
| 112 | possible values are valid. |
| 113 | |
| 114 | Vendor-specific properties will typically need more detailed schema. With the |
| 115 | exception of boolean properties, they should have a reference to a type in |
| 116 | schemas/types.yaml. A "description" property is always required. |
| 117 | |
| 118 | The Devicetree schemas don't exactly match the YAML-encoded DT data produced by |
| 119 | dtc. They are simplified to make them more compact and avoid a bunch of |
| 120 | boilerplate. The tools process the schema files to produce the final schema for |
| 121 | validation. There are currently 2 transformations the tools perform. |
| 122 | |
| 123 | The default for arrays in json-schema is they are variable-sized and allow more |
| 124 | entries than explicitly defined. This can be restricted by defining 'minItems', |
| 125 | 'maxItems', and 'additionalItems'. However, for DeviceTree Schemas, a fixed |
| 126 | size is desired in most cases, so these properties are added based on the |
| 127 | number of entries in an 'items' list. |
| 128 | |
| 129 | The YAML Devicetree format also makes all string values an array and scalar |
| 130 | values a matrix (in order to define groupings) even when only a single value |
| 131 | is present. Single entries in schemas are fixed up to match this encoding. |
| 132 | |
| 133 | Coding style |
| 134 | ------------ |
| 135 | |
| 136 | Use YAML coding style (two-space indentation). For DTS examples in the schema, |
| 137 | preferred is four-space indentation. |
| 138 | |
| 139 | Testing |
| 140 | ------- |
| 141 | |
| 142 | Dependencies |
| 143 | ~~~~~~~~~~~~ |
| 144 | |
| 145 | The DT schema project must be installed in order to validate the DT schema |
| 146 | binding documents and validate DTS files using the DT schema. The DT schema |
| 147 | project can be installed with pip:: |
| 148 | |
| 149 | pip3 install dtschema |
| 150 | |
| 151 | Note that 'dtschema' installation requires 'swig' and Python development files |
| 152 | installed first. On Debian/Ubuntu systems:: |
| 153 | |
| 154 | apt install swig python3-dev |
| 155 | |
| 156 | Several executables (dt-doc-validate, dt-mk-schema, dt-validate) will be |
| 157 | installed. Ensure they are in your PATH (~/.local/bin by default). |
| 158 | |
| 159 | Recommended is also to install yamllint (used by dtschema when present). |
| 160 | |
| 161 | Running checks |
| 162 | ~~~~~~~~~~~~~~ |
| 163 | |
| 164 | The DT schema binding documents must be validated using the meta-schema (the |
| 165 | schema for the schema) to ensure they are both valid json-schema and valid |
| 166 | binding schema. All of the DT binding documents can be validated using the |
| 167 | ``dt_binding_check`` target:: |
| 168 | |
| 169 | make dt_binding_check |
| 170 | |
| 171 | In order to perform validation of DT source files, use the ``dtbs_check`` target:: |
| 172 | |
| 173 | make dtbs_check |
| 174 | |
| 175 | Note that ``dtbs_check`` will skip any binding schema files with errors. It is |
| 176 | necessary to use ``dt_binding_check`` to get all the validation errors in the |
| 177 | binding schema files. |
| 178 | |
| 179 | It is possible to run both in a single command:: |
| 180 | |
| 181 | make dt_binding_check dtbs_check |
| 182 | |
| 183 | It is also possible to run checks with a subset of matching schema files by |
| 184 | setting the ``DT_SCHEMA_FILES`` variable to 1 or more specific schema files or |
| 185 | patterns (partial match of a fixed string). Each file or pattern should be |
| 186 | separated by ':'. |
| 187 | |
| 188 | :: |
| 189 | |
| 190 | make dt_binding_check DT_SCHEMA_FILES=trivial-devices.yaml |
| 191 | make dt_binding_check DT_SCHEMA_FILES=trivial-devices.yaml:rtc.yaml |
| 192 | make dt_binding_check DT_SCHEMA_FILES=/gpio/ |
| 193 | make dtbs_check DT_SCHEMA_FILES=trivial-devices.yaml |
| 194 | |
| 195 | |
| 196 | json-schema Resources |
| 197 | --------------------- |
| 198 | |
| 199 | |
| 200 | `JSON-Schema Specifications <http://json-schema.org/>`_ |
| 201 | |
| 202 | `Using JSON Schema Book <http://usingjsonschema.com/>`_ |
| 203 | |
| 204 | .. _example-schema: |
| 205 | |
| 206 | Annotated Example Schema |
| 207 | ------------------------ |
| 208 | |
| 209 | Also available as a separate file: :download:`example-schema.yaml` |
| 210 | |
| 211 | .. literalinclude:: example-schema.yaml |