| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- .. SPDX-License-Identifier: GPL-2.0
- Writing Devicetree Bindings in json-schema
- ==========================================
- Devicetree bindings are written using json-schema vocabulary. Schema files are
- written in a JSON-compatible subset of YAML. YAML is used instead of JSON as it
- is considered more human readable and has some advantages such as allowing
- comments (Prefixed with '#').
- Also see :ref:`example-schema`.
- Schema Contents
- ---------------
- Each schema doc is a structured json-schema which is defined by a set of
- top-level properties. Generally, there is one binding defined per file. The
- top-level json-schema properties used are:
- $id
- A json-schema unique identifier string. The string must be a valid
- URI typically containing the binding's filename and path. For DT schema, it must
- begin with "http://devicetree.org/schemas/". The URL is used in constructing
- references to other files specified in schema "$ref" properties. A $ref value
- with a leading '/' will have the hostname prepended. A $ref value with only a
- relative path or filename will be prepended with the hostname and path
- components of the current schema file's '$id' value. A URL is used even for
- local files, but there may not actually be files present at those locations.
- $schema
- Indicates the meta-schema the schema file adheres to.
- title
- A one-line description of the hardware being described in the binding schema.
- maintainers
- A DT specific property. Contains a list of email address(es)
- for maintainers of this binding.
- description
- Optional. A multi-line text block containing any detailed
- information about this hardware. It should contain things such as what the block
- or device does, standards the device conforms to, and links to datasheets for
- more information.
- select
- Optional. A json-schema used to match nodes for applying the
- schema. By default, without 'select', nodes are matched against their possible
- compatible-string values or node name. Most bindings should not need select.
- allOf
- Optional. A list of other schemas to include. This is used to
- include other schemas the binding conforms to. This may be schemas for a
- particular class of devices such as I2C or SPI controllers.
- properties
- A set of sub-schema defining all the DT properties for the
- binding. The exact schema syntax depends on whether properties are known,
- common properties (e.g. 'interrupts') or are binding/vendor-specific
- properties.
- A property can also define a child DT node with child properties defined
- under it.
- For more details on properties sections, see 'Property Schema' section.
- patternProperties
- Optional. Similar to 'properties', but names are regex.
- required
- A list of DT properties from the 'properties' section that
- must always be present.
- additionalProperties / unevaluatedProperties
- Keywords controlling how schema will validate properties not matched by this
- schema's 'properties' or 'patternProperties'. Each schema is supposed to
- have exactly one of these keywords in top-level part, so either
- additionalProperties or unevaluatedProperties. Nested nodes, so properties
- being objects, are supposed to have one as well.
- * additionalProperties: false
- Most common case, where no additional schema is referenced or if this
- binding allows subset of properties from other referenced schemas.
- * unevaluatedProperties: false
- Used when this binding references other schema whose all properties
- should be allowed.
- * additionalProperties: true
- Rare case, used for schemas implementing common set of properties. Such
- schemas are supposed to be referenced by other schemas, which then use
- 'unevaluatedProperties: false'. Typically bus or common-part schemas.
- examples
- Optional. A list of one or more DTS hunks implementing this binding only.
- Example should not contain unrelated device nodes, e.g. consumer nodes in a
- provider binding, other nodes referenced by phandle.
- Note: YAML doesn't allow leading tabs, so spaces must be used instead.
- Unless noted otherwise, all properties are required.
- Property Schema
- ---------------
- The 'properties' section of the schema contains all the DT properties for a
- binding. Each property contains a set of constraints using json-schema
- vocabulary for that property. The properties schemas are what are used for
- validation of DT files.
- For common properties, only additional constraints not covered by the common,
- binding schema need to be defined such as how many values are valid or what
- possible values are valid.
- Vendor-specific properties will typically need more detailed schema. With the
- exception of boolean properties, they should have a reference to a type in
- schemas/types.yaml. A "description" property is always required.
- The Devicetree schemas don't exactly match the YAML-encoded DT data produced by
- dtc. They are simplified to make them more compact and avoid a bunch of
- boilerplate. The tools process the schema files to produce the final schema for
- validation. There are currently 2 transformations the tools perform.
- The default for arrays in json-schema is they are variable-sized and allow more
- entries than explicitly defined. This can be restricted by defining 'minItems',
- 'maxItems', and 'additionalItems'. However, for DeviceTree Schemas, a fixed
- size is desired in most cases, so these properties are added based on the
- number of entries in an 'items' list.
- The YAML Devicetree format also makes all string values an array and scalar
- values a matrix (in order to define groupings) even when only a single value
- is present. Single entries in schemas are fixed up to match this encoding.
- Coding style
- ------------
- Use YAML coding style (two-space indentation). For DTS examples in the schema,
- preferred is four-space indentation.
- Testing
- -------
- Dependencies
- ~~~~~~~~~~~~
- The DT schema project must be installed in order to validate the DT schema
- binding documents and validate DTS files using the DT schema. The DT schema
- project can be installed with pip::
- pip3 install dtschema
- Note that 'dtschema' installation requires 'swig' and Python development files
- installed first. On Debian/Ubuntu systems::
- apt install swig python3-dev
- Several executables (dt-doc-validate, dt-mk-schema, dt-validate) will be
- installed. Ensure they are in your PATH (~/.local/bin by default).
- Recommended is also to install yamllint (used by dtschema when present).
- Running checks
- ~~~~~~~~~~~~~~
- The DT schema binding documents must be validated using the meta-schema (the
- schema for the schema) to ensure they are both valid json-schema and valid
- binding schema. All of the DT binding documents can be validated using the
- ``dt_binding_check`` target::
- make dt_binding_check
- In order to perform validation of DT source files, use the ``dtbs_check`` target::
- make dtbs_check
- Note that ``dtbs_check`` will skip any binding schema files with errors. It is
- necessary to use ``dt_binding_check`` to get all the validation errors in the
- binding schema files.
- It is possible to run both in a single command::
- make dt_binding_check dtbs_check
- It is also possible to run checks with a subset of matching schema files by
- setting the ``DT_SCHEMA_FILES`` variable to 1 or more specific schema files or
- patterns (partial match of a fixed string). Each file or pattern should be
- separated by ':'.
- ::
- make dt_binding_check DT_SCHEMA_FILES=trivial-devices.yaml
- make dt_binding_check DT_SCHEMA_FILES=trivial-devices.yaml:rtc.yaml
- make dt_binding_check DT_SCHEMA_FILES=/gpio/
- make dtbs_check DT_SCHEMA_FILES=trivial-devices.yaml
- json-schema Resources
- ---------------------
- `JSON-Schema Specifications <http://json-schema.org/>`_
- `Using JSON Schema Book <http://usingjsonschema.com/>`_
- .. _example-schema:
- Annotated Example Schema
- ------------------------
- Also available as a separate file: :download:`example-schema.yaml`
- .. literalinclude:: example-schema.yaml
|