Device Tree Overlays (Linux)
Introductionβ
Device Tree Overlays were introduced in BSP 5. Therefore, this information does not apply to earlier BSPs.
Device Tree Overlays (DTO) provide a way to modify the overall device tree without re-compiling the complete device tree.
Overlays are small pieces, or fragments of a complete device tree, and can be added or removed as needed, often enabling/disabling hardware components in the system.
Because of this flexible nature, overlays provide an advantageous way of describing peripheral hardware that can be added or removed from the system. It is also useful for tweaking the parameters of existing hardware before committing it to a complete device tree.
In a very brief description, the process of designing a Device Tree Overlay comprises three macro steps:
- Write a Device Tree Overlay (.dts) file.
- Compile the .dts file to generate a .dtbo file.
- Enable the overlay (using the .dtbo file)
This article will explore these steps for the Toradex BSP Layers and Reference Images for Yocto Project. For information specific to Torizon, see the Device Tree Overlays on Torizon article.
Stages of Developmentβ
The development cycle of a device tree overlay, much like many other software components that you plan to integrate into your custom Yocto Project build might have three phases. You are of course free to do it differently, but here's how this article suggests:
- Evaluation: enable pre-built overlays that are included in our Reference Images, making it possible to evaluate some hardware peripherals in a few minutes.
- Development: for faster iteration cycles, build the overlays manually, copy them over to the device and enable them. We do provide a Makefile to ease this process.
- Production: after you are happy with the overlays you have developed:
- Either integrate them into your custom Yocto Project build.
- Or integrate them into your final device tree and then integrate your final device tree into your custom Yocto Project build.
Device Tree Overlays Version Informationβ
The Device Tree Overlays branch matches perfectly with the Kernel branch, which you can find at Kernel Version Information. In other words, for upstream based modules, the branch is master
, and for downstream based modules is toradex_5.15-2.<n>.x-imx
.
Evaluation: Pre-built Device Tree Overlays for Peripherals and Add-on Products Provided by Toradexβ
To reduce complexity and also to provide you with example implementations, Toradex provides pre-built Device Tree Overlays for SoM peripherals and add-on products (Display and Touch Controllers) available in the webshop. The Reference Images offer these Overlays as binaries (.dtbo files).
On a Toradex SoM you can list these files available on the boot partition. As an example, using the the terminal of a Apalis iMX8:
$ ls /boot/overlays
apalis-imx8_ar0521_overlay.dtbo apalis-imx8_atmel-mxt_overlay.dtbo apalis-imx8_hdmi_overlay.dtbo
apalis-imx8_lvds_overlay.dtbo apalis-imx8_ov5640-2_overlay.dtbo apalis-imx8_ov5640_overlay.dtbo
display-dpi-lt170410_overlay.dtbo display-edt5.7_overlay.dtbo display-edt7_overlay.dtbo
display-fullhd-imx6_overlay.dtbo display-fullhd_overlay.dtbo display-lt161010_overlay.dtbo
display-lt170410_overlay.dtbo display-vga_overlay.dtbo
To enable these overlays, see the Enable/Disable a Device Tree Overlay section. Some overlays are pre-enabled by default, refer to the Pre-enabled Device Tree Overlays section for this.
If you want to obtain the source code of the Device Tree Overlays provided by Toradex for the products available in the webshop, see the Build U-Boot and Linux Kernel from Source Code article.
Displaysβ
- HDMI/DVI
- Capacitive Touch Display 10.1" LVDS
- Capacitive Touch Display 10.1" DSI
- Capacitive Touch Display 7" Parallel
- Resistive Touch Display 7" Parallel
- VGA
- LG LP156WF1
Default resolution with these overlays: 1920x1080
Native Interface:
Module | Starting from version | Overlay |
---|---|---|
Verdin iMX8M Plus | 6.1.0 | verdin-imx8mp_hdmi_overlay.dtbo |
Apalis iMX8 QuadMax | 6.1.0 | apalis-imx8_hdmi_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | apalis-imx8_hdmi_overlay.dtbo |
Apalis iMX6 | 6.0.0 | apalis-imx6_hdmi_overlay.dtbo |
Colibri iMX6 | 6.0.0 | colibri-imx6_hdmi_overlay.dtbo |
Using Verdin DSI to HDMI adapter:
Module | Starting from version | Overlay |
---|---|---|
Verdin iMX8M Plus | 6.1.0 | verdin-imx8mp_dsi-to-hdmi_overlay.dtbo |
Verdin iMX8M Mini | 6.1.0 | verdin-imx8mm_dsi-to-hdmi_overlay.dtbo |
Verdin AM62 | 6.4.0 | verdin-am62_dsi-to-hdmi_overlay.dtbo |
Using Colibri DSI to HDMI adapter:
Module | Starting from version | Overlay |
---|---|---|
Colibri iMX8X | 6.2.0 | colibri-imx8x_dsihdmi_overlay.dtbo |
Default resolution with these overlays: 1280x800
See the Capacitive Touch Display 10.1" LVDS in the Webshop and in the Developer Website.
Native Interface:
Module | Starting from version | Overlay |
---|---|---|
Apalis iMX8 QuadMax | 6.1.0 | apalis-imx8_panel-cap-touch-10inch-lvds_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | apalis-imx8_panel-cap-touch-10inch-lvds_overlay.dtbo |
Apalis iMX6 | 6.0.0 | apalis-imx6_panel-cap-touch-10inch_overlay.dtbo |
Colibri iMX8XΒΉ | 6.2.0 | colibri-imx8x_panel-cap-touch-10inch-lvds_overlay.dtbo |
Colibri iMX7 eMMC | 6.0.0 | colibri-imx7_panel-cap-touch-10inch-lvds_overlay.dtbo |
Colibri iMX6 | 6.0.0 | colibri-imx6_panel-cap-touch-10inch-lvds_overlay.dtbo |
Colibri iMX6ULL eMMC | 6.0.0 | colibri-imx6ull_panel-cap-touch-10inch-lvds_overlay.dtbo |
ΒΉ Requires carrier board with the specific connector, e.g. Iris Carrier Board V2.0.
Using Verdin DSI to LVDS adapter:
Module | Starting from version | Overlay |
---|---|---|
Verdin iMX8M Plus | 6.1.0 | verdin-imx8mp_dsi-to-lvds_panel-cap-touch-10inch-lvds_overlay.dtbo |
Verdin iMX8M Mini | 6.1.0 | verdin-imx8mm_dsi-to-lvds_panel-cap-touch-10inch-lvds_overlay.dtbo |
Verdin AM62 | 6.4.0 | verdin-am62_dsi-to-lvds_panel-cap-touch-10inch-lvds_overlay.dtbo |
Using Mezzanine add-on boards:
Module | Starting from version | Overlay |
---|---|---|
Verdin iMX8M Plus | 6.1.0 | verdin-imx8mp_mezzanine_panel-cap-touch-10inch-lvds_overlay.dtbo |
Verdin AM62 | 6.4.0 | verdin-am62_mezzanine_panel-cap-touch-10inch-lvds_overlay.dtbo |
Apalis iMX8 QuadMax | 6.1.0 | apalis-imx8_mezzanine_panel-cap-touch-10inch-lvds_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | apalis-imx8_mezzanine_panel-cap-touch-10inch-lvds_overlay.dtbo |
Default resolution with these overlays: 1280x800
See the Capacitive Touch Display 10.1" DSI in the Webshop and in the Developer Website.
Native Interface:
Module | Starting from version | Overlay |
---|---|---|
Verdin iMX8M Plus | 6.5.0 | verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dtbo |
Verdin iMX8M Mini | 6.5.0 | verdin-imx8mm_panel-cap-touch-10inch-dsi_overlay.dtbo |
Verdin AM62 | 6.5.0 | verdin-am62_panel-cap-touch-10inch-dsi_overlay.dtbo |
A Verdin DSI Display Adapter is required to use this display on the Verdin Development Board and the Dahlia Carrier Board.
Default resolution with these overlays: 800x480
See the Capacitive Touch Display 7" Parallel in the Webshop and in the Developer Website.
Native Interface:
Module | Starting from version | Overlay |
---|---|---|
Apalis iMX6 | 6.0.0 | apalis-imx6_panel-cap-touch-7inch_overlay.dtbo |
Colibri iMX8XΒΉ | 6.2.0 | colibri-imx8x_panel-cap-touch-7inch_overlay.dtbo |
Colibri iMX7 eMMC | 6.0.0 | colibri-imx7_panel-cap-touch-7inch_overlay.dtbo |
Colibri iMX6 | 6.0.0 | colibri-imx6_panel-cap-touch-7inch_overlay.dtbo |
Colibri iMX6ULL eMMC | 6.0.0 | colibri-imx6ull_panel-cap-touch-7inch_overlay.dtbo |
ΒΉ Requires carrier board with the specific connector, e.g. Iris Carrier Board V2.0.
Using the capacitive touch adapter:
Module | Starting from version | Overlay |
---|---|---|
Colibri iMX8X | 6.2.0 | colibri-imx8x_panel-cap-touch-7inch_adapter_overlay.dtbo |
Colibri iMX7 eMMC | 6.0.0 | colibri-imx7_panel-cap-touch-7inch_adapter_overlay.dtbo |
Colibri iMX6 | 6.0.0 | colibri-imx6_panel-cap-touch-7inch_adapter_overlay.dtbo |
Colibri iMX6ULL eMMC | 6.0.0 | colibri-imx6ull_panel-cap-touch-7inch_adapter_overlay.dtbo |
Default resolution with these overlays: 800x480
See the Resistive Touch Display 7" Parallel in the Webshop and in the Developer Website.
Native Interface:
Module | Starting from version | Overlay |
---|---|---|
Apalis iMX6 | 6.0.0 | apalis-imx6_panel-res-touch-7inch_overlay.dtbo |
Colibri iMX8X | 6.2.0 | colibri-imx8x_panel-res-touch-7inch_overlay.dtbo |
Colibri iMX7 eMMC | 6.0.0 | colibri-imx7_panel-res-touch-7inch_overlay.dtbo |
Colibri iMX6 | 6.0.0 | colibri-imx6_panel-res-touch-7inch_overlay.dtbo |
Colibri iMX6ULL eMMC | 6.0.0 | colibri-imx6ull_panel-res-touch-7inch_overlay.dtbo |
Default resolution with these overlays: 640x480
Native Interface:
Module | Starting from version | Overlay |
---|---|---|
Apalis iMX6 | 6.0.0 | apalis-imx6_vga-640x480_overlay.dtbo |
Colibri iMX8X | 6.2.0 | colibri-imx8x_vga-640x480_overlay.dtbo |
Colibri iMX7 eMMC | 6.1.0 | colibri-imx7_vga-640x480_overlay.dtbo |
Colibri iMX6 | 6.0.0 | colibri-imx6_vga-640x480_overlay.dtbo |
Colibri iMX6ULL eMMC | 6.0.0 | colibri-imx6ull_vga-640x480_overlay.dtbo |
LG LP156WF1 Dual Channel 1080p 18bit:
Module | Starting from version | Overlay |
---|---|---|
Apalis iMX8 QuadMax | 6.1.0 | apalis-imx8_panel-lvds-dual-channel-1080p_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | apalis-imx8_panel-lvds-dual-channel-1080p_overlay.dtbo |
Using Mezzanine add-on boards:
Module | Starting from version | Overlay |
---|---|---|
Verdin iMX8M Plus | 6.1.0 | verdin-imx8mp_mezzanine_panel-lvds-dual-channel-1080p_overlay.dtbo |
Verdin AM62 | 6.4.0 | verdin-am62_mezzanine_panel-lvds-dual-channel-1080p_overlay.dtbo |
SPIDEVβ
Native Interface:
Module | Starting from version | Interface | Overlay |
---|---|---|---|
Verdin iMX8M Plus | 6.0.0 | SPI | verdin-imx8mp_spidev_overlay.dtbo |
Verdin iMX8M Mini | 6.0.0 | SPI | verdin-imx8mm_spidev_overlay.dtbo |
Verdin AM62 | 6.4.0 | SPI | verdin-am62_spidev_overlay.dtbo |
Apalis iMX8 QuadMax | 6.1.0 | SPI 1 | apalis-imx8_spi1_spidev_overlay.dtbo |
Apalis iMX8 QuadMax | 6.1.0 | SPI 2 | apalis-imx8_spi2_spidev_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | SPI 1 | apalis-imx8_spi1_spidev_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | SPI 2 | apalis-imx8_spi2_spidev_overlay.dtbo |
Apalis iMX6 | 6.0.0 | SPI 1 | apalis-imx6_spi1_spidev_overlay.dtbo |
Apalis iMX6 | 6.0.0 | SPI 2 | apalis-imx6_spi2_spidev_overlay.dtbo |
Colibri iMX8X | 6.1.0 | SPI | colibri-imx8x_spidev_overlay.dtbo |
Colibri iMX6ULL eMMC | 6.1.0 | SPI | colibri-imx6ull_spidev_overlay.dtbo |
CANβ
Module | Starting from version | Interface | Overlay |
---|---|---|---|
Verdin iMX8M Mini | 6.1.0 | CAN 1 [20MHz] | verdin-imx8mm_20mhz_can1.dtbo |
Verdin iMX8M Mini | 6.0.0 | CAN 1 [Disable] | verdin-imx8mm_disable_can1.dtbo |
Using Mezzanine add-on boards:
Module | Starting from version | Interface | Overlay |
---|---|---|---|
Apalis iMX8 QuadMax | 6.1.0 | CAN | apalis-imx8_mezzanine_can_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | CAN | apalis-imx8_mezzanine_can_overlay.dtbo |
Cameraβ
OV5640 CSI Cameraβ
See the OV5640 CSI Camera in the Developer Wesite.
Native Interface:
Module | Starting from version | Interface | Overlay |
---|---|---|---|
Verdin iMX8M Plus | 6.0.0 | CSI | verdin-imx8mp_ov5640_overlay.dtbo |
Verdin iMX8M Mini | 6.0.0 | CSI | verdin-imx8mm_ov5640_overlay.dtbo |
Verdin AM62 | 6.4.0 | CSI | verdin-am62_ov5640_overlay.dtbo |
Using Mezzanine add-on boards:
Module | Starting from version | Interface | Overlay |
---|---|---|---|
Verdin iMX8M Plus [Default jumper setting] | 6.1.0 | CSI | verdin-imx8mp_mezzanine_ov5640-default-jumpers_overlay.dtbo |
Verdin iMX8M Plus [Alternate jumper setting] | 6.1.0 | CSI | verdin-imx8mp_mezzanine_ov5640-alt-jumpers_overlay.dtbo |
Apalis iMX8 QuadMax | 6.1.0 | CSI | apalis-imx8_ov5640_overlay.dtbo apalis-imx8_mezzanine_ov5640_overlay.dtbo |
Apalis iMX8 QuadPlus | 6.1.0 | CSI | apalis-imx8_ov5640_overlay.dtbo apalis-imx8_mezzanine_ov5640_overlay.dtbo |
Verdin Mezzanine jumper settings:
Jumper Setting | JP3 | JP4 | JP5 | JP6 |
---|---|---|---|---|
Default | 2-3 | 2-3 | 2-3 | 2-3 |
Alternate | 2-3 | 2-3 | 1-2 | 1-2 |
HMPβ
Heterogeneous Multicore Processing Overlays:
Module | Starting from version | Overlay |
---|---|---|
Verdin AM62 | 6.6.0 | verdin-am62_hmp_overlays.dtbo |
Verdin iMX8M Plus | 6.3.0 | verdin-imx8mp_hmp_overlay.dtbo |
Verdin iMX8M Mini | 6.2.0 | verdin-imx8mm_hmp_overlay.dtbo |
Colibri iMX8X | 6.4.0 | colibri-imx8x_hmp_overlay.dtbo |
BTL Audio Output on NAU8822β
Verdin Development Board features an analog audio interface based on the NAU8822 24-bit audio codec IC with integrated DSP with specific functions
Module | Starting from version | Overlay |
---|---|---|
Verdin iMX8M Plus | 6.2.0 | verdin-imx8mp_nau8822-btl_overlay.dtbo |
Verdin iMX8M Mini | 6.2.0 | verdin-imx8mm_nau8822-btl_overlay.dtbo |
Verdin AM62 | 6.4.0 | verdin-am62_nau8822-btl_overlay.dts |
Pre-enabled Device Tree Overlaysβ
By default, the following overlays are enabled to simplify the use of Toradex carrier boards and modules. Note that these overlays may cause conflicts with other peripherals.
Module | Supported Peripherals | Overlays |
---|---|---|
Apalis iMX8 | HDMI SPIDEV | apalis-imx8_hdmi_overlay.dtbo apalis-imx8_spi1_spidev_overlay.dtbo apalis-imx8_spi2_spidev_overlay.dtbo |
Apalis iMX6 | HDMI SPIDEV | apalis-imx6_hdmi_overlay.dtbo apalis-imx6_spi1_spidev_overlay.dtbo apalis-imx6_spi2_spidev_overlay.dtbo |
Module | Supported Peripherals | Overlays |
---|---|---|
Colibri iMX8X | VGA | colibri-imx8x_vga-640x480_overlay.dtbo |
Colibri iMX7 | VGA | colibri-imx7_vga-640x480_overlay.dtbo |
Colibri iMX6 | VGA | colibri-imx6_vga-640x480_overlay.dtbo |
Colibri iMX6ULL | VGA | colibri-imx6ull_vga-640x480_overlay.dtbo |
Module | Supported Peripherals | Overlays |
---|---|---|
Verdin iMX8M Plus | DSI to HDMI adapter Native HDMI SPIDEV | verdin-imx8mp_dsi-to-hdmi_overlay.dtbo verdin-imx8mp_hdmi_overlay.dtbo verdin-imx8mp_spidev_overlay.dtbo |
Verdin iMX8M Mini | DSI to HDMI adapter SPIDEV | verdin-imx8mm_dsi-to-hdmi_overlay.dtbo verdin-imx8mm_spidev_overlay.dtbo |
Verdin AM62 | DSI to HDMI adapter SPIDEV | verdin-am62_dsi-to-hdmi_overlay.dtbo verdin-am62_spidev_overlay.dtbo |
Enable/Disable a Device Tree Overlayβ
To enable or disable applying a pre-built overlay on a Toradex SoM just add/remove it to/from the file overlays.txt
located on the boot partition, and reboot the system.
For example, one wants to disable a parallel RGB interface and display on Colibri-iMX8X and enable an HDMI interface (using DSI-to-HDMI adapter). The initial overlays.txt
file looks like:
# cat /boot/overlays.txt
fdt_overlays=colibri-imx8x_parallel-rgb_overlay.dtbo colibri-imx8x_ad7879_overlay.dtbo display-edt7_overlay.dtbo
Steps to disable a parallel RGB and enable an HDMI:
- Open the
overlays.txt
file with any text editor, e.g.vi
:
# vi /boot/overlays.txt
- Remove overlays, that is needed for Resistive Touch Display 7" Parallel and add one for DSI-to-HDMI adapter. The file should look like:
# cat /boot/overlays.txt
fdt_overlays=colibri-imx8x_dsihdmi_overlay.dtbo
- Synchronize them filesystems:
# sync
- Reboot the system:
# reboot
In case you find yourself with a non-working kernel after applying the overlays, see the Removing a conflicting DTO section.
If you want to obtain the source code of the Device Tree Overlays provided by Toradex for the products available in the webshop, see the Build U-Boot and Linux Kernel from Source Code article.
Development: Writing a Custom DTOβ
The most recommended way to create a new overlay is to start looking at our evaluation boards' overlays and then adapt to your project's needs. You can find those overlays in the device-tree-overlays repository.
As with normal device trees, overlays must get explicitly written for the correct kernel version. This depends on the BSP you are using from Toradex and can be checked on Build U-Boot and Linux Kernel from Source Code article.
As an example, here is the device tree overlay for parallel RGB on a Colibri iMX8X (colibri-imx8x_parallel-rgb_overlay.dts):
// Enable the parallel RGB interface on Colibri iMX8X
/dts-v1/;
/plugin/;
/ {
compatible = "toradex,colibri-imx8x";
};
&adma_pwm {
status = "okay";
};
&backlight {
status = "okay";
};
&display_lcdif {
status = "okay";
};
&panel_dpi {
status = "okay";
};
This overlay, if loaded, is directly appended to imx8qxp-colibri-eval-v3.dts. This device tree, however, includes the "System on Module Level" device tree imx8qxp-colibri.dtsi which contains most of the device tree nodes.
If the overlay gets loaded, it gets integrated into the already loaded device tree. To add or overwrite properties can be achieved with the ampersand character the same way as described in section Device Tree Structure and Conventions.
Devicetree overlays have to be denoted with /plugin/;
in the header.
For further reading on this topic, we refer to the kernel documentation: https://www.kernel.org/doc/html/latest/devicetree/overlay-notes.html?highlight=overlays
Building a DTOβ
To build the Device Tree Overlay, see the Build U-Boot and Linux Kernel from Source Code article.
Deploying a Device Tree Overlayβ
To deploy a custom overlay on a Toradex SoM with the Linux BSP >= 5.0 installed:
- copy the
.dtbo
file to theoverlays/
directory in the boot partition; - add the overlay binary
.dtbo
to theoverlays.txt
file. This file contains a space separated list of overlays. For example:
$ cat /boot/overlays.txt
fdt_overlays=verdin-imx8mm_lt8912_overlay.dtbo verdin-imx8mm_ov5640_overlay.dtbo
After changing the overlays.txt
, run the command sync
and reboot the board. Do not power-cycle because the edits done may not sync to the file system.
In case you find yourself with a non-working kernel after applying the overlay, see the Removing a conflicting DTO section
Removing a conflicting DTOβ
In case you find yourself with a non-working kernel (normally, stuck at the "Loading kernel..." message), you can choose the way to solve this issue:
- Disable loading all overlays by setting the special u-boot variable:
> setenv skip_fdt_overlays 1
> boot
- Delete your custom overlays easily directly from your PC. You would need to set up a USB-OTG connection with your PC and run the UMS functionality of U-Boot by simply stopping the autoboot at U-boot and running the following commands:
ums 0 mmc 0
After this command, you should see a BOOT partition show up on your PC. Delete the conflicting .dtbo and the corresponding item in the overlays.txt file.
Check your carrier board datasheet to what ports and jumper configurations work with USB-OTG. With Toradex carrier boards, it requires using the correct port or a small jumper removal (like Ixora's JP2).
Production: Add Your Overlays to a Custom Yocto Project Buildβ
It is expected that you have some knowledge of Yocto Project/OpenEmbedded. The minimum prerequisite is being able to Build a Reference Image with Yocto Project.
If you decide to integrate your final changes into full device trees, read the article Custom meta layers, recipes and images in Yocto Project (hello-world examples).
If you decide to deploy the overlays, two steps are required and explained below:
- Add your overlays, making sure they are compiled and deployed to the image.
- Have the overlays listed in
overlays.txt
, making sure they are enabled.
Raw NAND modules don't support device tree overlays
Add Your Overlays to the Yocto Projectβ
There are currently two recipes that handle device tree overlays:
- Upstream-based images: meta-toradex-bsp-common/recipes-kernel/linux/device-tree-overlays-mainline_git.bb.
- Downstream-based images: meta-toradex-nxp/recipes-kernel/linux/device-tree-overlays_git.bb.
You can, for instance, write your own bbappends to add your device tree overlays repository instead of ours.
Enable Your Overlays in the Yocto Projectβ
The class meta-toradex-bsp-common/classes/image_type_tezi.bbclass is responsible for adding overlays that will be applied during boot time. It uses the variable TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT
that is set by default in our machine configuration files, either machine.conf
or machine.inc
.
You can find them using e.g. grep
inside the layers
directory:
$ cd <yocto projet setup>
$ grep -nre "TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT" layers/*
Then you need to either append to or override the variable. One possibility is to use a <machine>-extra.conf
file. You can find an example on Custom meta layers, recipes and images in Yocto Project (hello-world examples).