Create a custom Easy Installer image with splash screen and custom DTBO

Hi,

I’m using a Toradex Colibri iMX7D (eMMC) running Torizon OS 7.6.0 (Docker).

After every fresh installation of Torizon OS, I currently have to perform a few manual steps:

  1. Replace the default splash screen.
  2. Replace the default colibri-imx7_panel-res-touch-7inch_overlay.dtbo with my modified version (customized for my LCD timings).
  3. Configure the board to boot with the following overlays:

fdt_overlays=colibri-imx7_panel-res-touch-7inch_overlay.dtbo colibri-imx7_spidev_overlay.dtbo
Since I need to repeat these steps on multiple boards, I’d like to prepare a custom Torizon OS image where these changes are already included, so that after flashing the image no additional manual configuration is required.

What is the recommended approach to achieve this?

My software and hardware details are:

Software

  • Torizon OS Upstream
  • Version: 7.6.0-build.36
  • Kernel: 6.6.130-7.6.0
  • Docker variant

Hardware

  • Toradex Colibri iMX7D 1GB (eMMC)
  • Colibri Evaluation Board V3

I’d appreciate any guidance or references to the recommended workflow for creating such a customized image.
Software summary

Bootloader: U-Boot
Kernel version: 6.6.130-7.6.0 #1-Torizon SMP PREEMPT Mon Jun 30 14:11:55 UTC 2025
Kernel command line: root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 ostree=/ostree/boot.0/torizon/bdb315b276c13bcaab84934fcebb05a0d967067b06aba6f6fcf78f8d4d246457/0
Distro name: NAME=“Torizon OS Upstream”
Distro version: VERSION_ID=7.6.0-build.36
Distro variant: VARIANT=“Docker”
Hostname: colibri-imx7-emmc-06673347

Hardware info

HW model: Toradex Colibri iMX7D 1GB (eMMC) on Colibri Evaluation Board V3
Toradex version: 0039 V1.1A
Serial number: 06673347
Processor arch: armv7l

Thank you.

Hi, I’m the Toradex AI Assistant.

I might make mistakes or occasionally get you wrong. Our support team will step in if needed.


I can guide you through creating a custom Torizon OS Easy Installer image with your splash screen and device tree overlays pre-configured. This is the recommended approach for production deployment to multiple boards.(1)(2)(3)

Recommended Approach: TorizonCore Builder with Build Command

The best method is using TorizonCore Builder’s build command with a YAML configuration file. This approach is ideal for production programming and CI/CD pipelines.(1)(2)

Prerequisites

  1. Install TorizonCore Builder on your development machine(1)
  2. Download the base Torizon OS 7.6.0 image for Colibri iMX7D from the Toradex download page(1)
  3. Prepare your custom splash screen image (PNG format)(3)
  4. Have your modified colibri-imx7_panel-res-touch-7inch_overlay.dts source file ready(1)

Step-by-Step Process

1. Set Up Your Working Directory

Create a directory structure like this:(1)

project/
├── tcbuild.yaml
├── images/
│   └── torizon-core-docker-colibri-imx7-Tezi_7.6.0+build.36.tar
├── splash.png
└── overlays/
    └── colibri-imx7_panel-res-touch-7inch_overlay.dts

2. Clone Required Repositories

You need the Linux kernel sources and device tree overlay repositories. For iMX 6/6ULL/7 devices:(1)

$ git clone -b linux-6.6.y git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
$ git clone -b master git://git.toradex.com/device-tree-overlays.git device-trees

3. Create Your Configuration File

Create a tcbuild.yaml file with the following content:(1)(2)(3)

# Configuration file for custom Colibri iMX7D image
input:
  easy-installer:
    local: images/torizon-core-docker-colibri-imx7-Tezi_7.6.0+build.36.tar

customization:
  # Custom splash screen
  splash-screen: splash.png
  
  # Device tree configuration
  device-tree:
    include-dirs:
      - linux/include
      - device-trees/overlays
    overlays:
      add:
        - overlays/colibri-imx7_panel-res-touch-7inch_overlay.dts
        - device-trees/overlays/colibri-imx7_spidev_overlay.dts

output:
  easy-installer:
    local: torizon-core-docker-colibri-imx7-CUSTOM

4. Build the Custom Image

Run the build command:(2)

$ torizoncore-builder build

This will generate your custom Easy Installer image in the torizon-core-docker-colibri-imx7-CUSTOM directory.(2)

Key Points

  • Splash Screen: The splash-screen property in the YAML file automatically integrates your custom PNG image into the initramfs.(3)
  • Device Tree Overlays: The overlays: add: section compiles and includes your custom overlay along with the spidev overlay.(1)
  • Include Directories: The include-dirs property ensures TorizonCore Builder can find all header files referenced by your device tree overlays.(1)(2)

Deployment

Once built, you can deploy this custom image to all your boards using:(1)

  1. USB stick with Toradex Easy Installer (recommended for production)
  2. Direct SSH deployment during development
  3. Torizon Cloud OTA updates for field devices

For USB deployment, simply copy the output directory to a USB stick:(1)

$ cp -a torizon-core-docker-colibri-imx7-CUSTOM /media/user/myUSBstick

Result

After flashing this custom image, your boards will boot with:

  • Your custom splash screen displayed during boot(3)
  • Your modified LCD timing overlay applied(1)
  • The spidev overlay enabled(1)
  • No manual configuration required

This eliminates all post-installation steps and ensures consistency across all your devices.

Best regards,
Toradex AI Assistant.


Did you like my answer? :+1: :-1:

If I answered your question, please tick the “Solution” checkbox.

For follow-up questions to me, please use @ToradexAI in your post.

using above step please explain how i can deploy because i did that steps created tcbuild but insted of usb i copy folder using scp but what next step i want to do @ToradexAI
intersense@Lenovo:~/MytorizonOs$ ls
base_image output_directory overlays splash tcbuild.yaml
intersense@Lenovo:~/MytorizonOs$ cat tcbuild.yaml

>> NOTES:

>> Lines containing “>>” are simply comments explaining the properties that

>> follow; if you don’t like these comments run:

>> $ grep -v ‘>>’ tcbuild.yaml > tcbuild-clean.yaml

>> A line not containing “>>” can be uncommented (by removing the hash mark

>> plus a space from its beginning); also set the corresponding property to

>> appropriate values.

>> When uncommenting a line having a property, remember to uncomment all its

>> parent properties as well; for example: if you uncomment the

>> ‘splash-screen’ property, also uncomment its parent property called

>> ‘customization’.

>> The input section specifies the image to be taken as the base for the

>> customization.

input:
easy-installer:
# >> Choose one of the options (REQUIRED):
# >> (1) Image as local folder or tarball.
local: base_image/torizon-docker-colibri-imx7-emmc-Tezi_7.6.0+build.36.tar
# >> (2) Remote file (optionally with a filename and or a sha256 checksum):
# remote: “https://artifacts.toradex.com/.../torizon-core-docker-apalis-imx8-Tezi_5.1.0%2Bbuild.1.tar
# remote: “https://artifacts.toradex.com/.../torizon-core-docker-colibri-imx6-Tezi_5.0.0-devel-202009%2Bbuild.2.tar;filename=torizon-core-docker-colibri-imx6-Tezi_5.0.0-devel-202009+build.2.tar;sha256sum=368595fa3fb00af9604e70311de3b04df6b30b280deec2f8918c46f479026ddb
# >> (3) Image specification (URL will be generated by the tool)
# toradex-feed:
# version: “5.1.0”
# release: quarterly
# machine: colibri-imx7-emmc
# distro: torizon-upstream
# variant: torizon-core-docker
# build-number: “1”
# # build-date: “20210408”

>> If using a Torizon OS image in .wic or .img format, like found in some Common Torizon images,

>> use the option below:

raw-image:

# local: torizon-core-common-docker-dev-intel-corei7-64.wic
# >> (OPTIONAL) specify the filesystem label where rootfs is located in the image.
# >> If not defined it defaults to 'otaroot'
# rootfs-label: otaroot

>> The customization section defines the modifications to be applied to get

>> the desired output image.

customization:

>> Splash screen image:

splash-screen: splash/splash.png

>> Splash screen configuration:

splash-config: spinner.plymouth

>> Directories overlayed to the base OSTree

filesystem:

 # - changes/

device-tree:

# >> Directories where to look for include files.
# include-dirs:
  # - device-trees/include/
# >> Custom device tree source:
# custom: device-trees/dts-arm32/imx6ull-colibri-eval-v3.dts
# >> Device-tree overlays configuration:
# overlays:
  # >> Whether to ignore all overlays from the base image (or ostree
  # >> archive in the future).
  # clear: false
  # >> Specific overlays not to use from base image (useful only when
  # >> clear is false and not DT has been selected).
  # remove:
    # - apalis-imx8_hdmi_overlay.dtbo
  # >> Overlays to add to output image.
  # add:
    # - device-trees/overlays/display-edt7_overlay.dts

kernel:

# >> Custom kernel arguments.
# arguments:
  # - key1=val1
  # - key2=val2
# >> Modules to build and possibly load automatically.
# modules:
  # - source-dir: virtual_touchscreen/
  #   autoload: false

>> Secure Boot related Options

>> NOTE: All secboot options need a Torizon OS image with secure boot support built-in.

>> This includes kernel in FIT format, U-Boot built with the corresponding secure boot kconfigs, etc.

secboot:

# >> Sign kernel FIT image
# sign-kernel:
  # >> (REQUIRED) directory path with the keys to sign the kernel
  # kernel-key-dir: ./kernel_keys/
  # >> (REQUIRED) Key details
  # kernel-key:
     # >> 'algo' corresponds to the hashing and crypto algorithms to be used for the signing
     # >> process. If not set it defaults to the value given below.
     # - name: "prod"
     #   algo: "sha256,rsa2048"
# >> Sign bootloader for NXP SoCs supporting High Assurance Boot (HAB)
# sign-bootloader-hab:
  # >> (REQUIRED) directory path with the CST directory pre-configured with
  # >> keys, cerfiticates, SRK table and e-fuse hash binaries
  # cst-dir: ./cst-3.4.1/
  # >> (OPTIONAL) CST related options. If an option is not set,
  # >> it will default to the values given below
  # cst-args:
    # crypto: "rsa"
    # key-size: "2048"
    # key-exp: "65537"
    # dig-algo: "sha256"
    # srk-index: "1"
    # srk-table: "SRK_1_2_3_4_table.bin"
    # srk-fuse: "SRK_1_2_3_4_fuse.bin"
    # srk-no-ca-flag: false
  # >> (OPTIONAL) If the options below are provided, the public key used to verify
  # >> the kernel FIT will be updated. These must be set if signing the kernel FIT
  # >> with a new key.
  # kernel-key-dir: ./kernel_keys/
  # kernel-key:
     # >> 'algo' corresponds to the hashing and crypto algorithms used to verify and sign the
     # >> kernel, respectively. If not set it defaults to the value given below.
     # - name: "prod"
     #   algo: "sha256,rsa2048"

>> The output section defines properties of the output image.

output:

>> OSTree deployment configuration (relevant also for raw/Easy Installer output).

ostree:

# branch: my-dev-branch
# commit-subject: "OSTree commit subject"
# commit-body: "OSTree commit body"

>> Choose one of the options (REQUIRED):

>> (1) Parameters for deploying a WIC/raw image.

raw-image:

# >> (REQUIRED) output file/directory of the customized image:
# local: tcb_common_torizon.wic
# >> (OPTIONAL) specify the filesystem label where rootfs is located in the base image.
# >> If not defined it defaults to 'otaroot'.
# base-rootfs-label: otaroot
# >> (OPTIONAL) base image for the output.
# >> If not set it will default to be the same as the input one.
# >> Do not change this unless you know what you're doing.
# base-image:
# bundle:
  # >> Choose one of the options:
  # >> (1) Specify a docker-compose file whose referenced images will be downloaded.
  # >>     Properties platform, username, password, registry, ca-certificate and
  # >>     keep-double-dollar-sign are optional.
  # >>     When using a docker-compose file all config values with '$$' will be replaced
  # >>     by '$', unless keep-double-dollar-sign is set to true.
  # compose-file: files/docker-compose.yml
  # platform: linux/arm64
  # username: "${USERNAME}"
  # password: "${PASSWORD}"
  # registry: hub.docker.com
  # ca-certificate: cacert.pem
  # keep-double-dollar-sign: false
  # dind-params:
    # - '--param1'
    # - '--param2'
  # dind-env:
    # - 'VAR1=value1'
  # >> (2) Specify a local directory containing the bundled images (previously
  # >>     obtained by 'torizoncore-builder bundle' command).
  # dir: bundle/

>> (2) Parameters for deploying to an Easy Installer image.

easy-installer:
# >> Output directory of the customized image (REQUIRED):
local: output_directory
# >> Information used by Toradex Easy Installer:
description: “My torizon customized image”
# licence: files/custom-licence.html
# release-notes: files/custom-release-notes.html
# accept-licence: true
# autoinstall: true
# autoreboot: true
# bundle:
# >> Choose one of the options:
# >> (1) Specify a docker-compose file whose referenced images will be downloaded.
# >> Properties platform, username, password, registry, ca-certificate and
# >> keep-double-dollar-sign are optional.
# >> When using a docker-compose file all config values with ‘$$’ will be replaced
# >> by ‘$’, unless keep-double-dollar-sign is set to true.
# compose-file: files/docker-compose.yml
# platform: linux/arm/v7
# username: “${USERNAME}”
# password: “${PASSWORD}”
# registry: hub.docker.com
# ca-certificate: cacert.pem
# keep-double-dollar-sign: false
# >> (2) Specify a local directory containing the bundled images (previously
# >> obtained by ‘torizoncore-builder bundle’ command).
# dir: bundle/
# >> Provisioning configuration:
# provisioning:
# >> For “online” mode, properties “shared-data” and “online-data” must be specified.
# >> For “offline” mode, property “shared-data” must be specified alone.
# mode: “online”
# shared-data: “shared-data.tar.gz”
# online-data: “${ONLINE_PROVISIONING_DATA:?online provisioning data not supplied}”
# >> Provision in hibernated mode. In this state devices are registered, but
# >> cannot send/receive data to/from Torizon Cloud, and they’re not counted
# >> towards a subscription.
# hibernated: false
above is tcbuild.yml which i created

To deploy your custom image directly via SSH (since you mentioned copying with SCP), you need to complete a few additional steps after running the build command.(1)(2)

Current Status

Based on your tcbuild.yaml, I can see you have:

  • Splash screen configured: splash-screen: splash/splash.png
  • Output directory configured: local: output_directory
  • Base image specified

However, I notice your device tree overlay configuration is commented out. You’ll need to uncomment and configure the overlay section.

Steps to Deploy via SSH

1. First, Update Your tcbuild.yaml

You need to uncomment and configure the device tree overlay section. Add this to your customization section:(2)

customization:
  splash-screen: splash/splash.png
  
  device-tree:
    include-dirs:
      - device-trees/include/
    overlays:
      add:
        - overlays/colibri-imx7_panel-res-touch-7inch_overlay.dts
        - device-trees/overlays/colibri-imx7_spidev_overlay.dts

2. Build the Custom Image

Run the build command in your MytorizonOs directory:(1)

$ torizoncore-builder build

This generates the custom image in the output_directory folder.

3. Unpack the Output Image

Before deploying via SSH, you must unpack the Easy Installer image:(1)(2)

$ torizoncore-builder images unpack output_directory

4. Deploy Directly via SSH

Now deploy to your board using the deploy command:(1)(2)

$ torizoncore-builder deploy --remote-host <YOUR_BOARD_IP> --remote-username torizon --remote-password torizon --reboot

Replace <YOUR_BOARD_IP> with your actual board IP address (e.g., 192.168.1.117).

Important Notes

  • The deploy command via SSH does not support pre-provisioned containers.(1)(2)
  • The default username and password for Torizon OS are both torizon, so you can omit those arguments if unchanged.(1)(2)
  • The --reboot flag automatically reboots the board after deployment.(1)(2)

Alternative: USB Deployment

If you prefer USB deployment instead (which you mentioned initially), after the build command completes, simply copy the output_directory folder to a USB stick:(2)

$ cp -a output_directory /media/user/myUSBstick

Then boot your board with the USB stick and use Toradex Easy Installer to flash the image.

Best regards,
Toradex AI Assistant.


Did you like my answer? :+1: :-1:

If I answered your question, please tick the “Solution” checkbox.

For follow-up questions to me, please use @ToradexAI in your post.

I did all steps and its works but problem is clock frequecy getting exploite when i aatach dts file but if i did mannually dtbo add on ostree then scrren show perfect @ToradexAI what will be solution for this i attached
intersense@Lenovo:~/MytorizonOs$ cat tcbuild.yaml

>> NOTES:

>> Lines containing “>>” are simply comments explaining the properties that

>> follow; if you don’t like these comments run:

>> $ grep -v ‘>>’ tcbuild.yaml > tcbuild-clean.yaml

>> A line not containing “>>” can be uncommented (by removing the hash mark

>> plus a space from its beginning); also set the corresponding property to

>> appropriate values.

>> When uncommenting a line having a property, remember to uncomment all its

>> parent properties as well; for example: if you uncomment the

>> ‘splash-screen’ property, also uncomment its parent property called

>> ‘customization’.

>> The input section specifies the image to be taken as the base for the

>> customization.

input:
easy-installer:
# >> Choose one of the options (REQUIRED):
# >> (1) Image as local folder or tarball.
local: base_image/torizon-docker-colibri-imx7-emmc-Tezi_7.6.0+build.36.tar
# >> (2) Remote file (optionally with a filename and or a sha256 checksum):
# remote: “https://artifacts.toradex.com/.../torizon-core-docker-apalis-imx8-Tezi_5.1.0%2Bbuild.1.tar
# remote: “https://artifacts.toradex.com/.../torizon-core-docker-colibri-imx6-Tezi_5.0.0-devel-202009%2Bbuild.2.tar;filename=torizon-core-docker-colibri-imx6-Tezi_5.0.0-devel-202009+build.2.tar;sha256sum=368595fa3fb00af9604e70311de3b04df6b30b280deec2f8918c46f479026ddb
# >> (3) Image specification (URL will be generated by the tool)
# toradex-feed:
# version: “5.1.0”
# release: quarterly
# machine: colibri-imx7-emmc
# distro: torizon-upstream
# variant: torizon-core-docker
# build-number: “1”
# # build-date: “20210408”

>> If using a Torizon OS image in .wic or .img format, like found in some Common Torizon images,

>> use the option below:

raw-image:

# local: torizon-core-common-docker-dev-intel-corei7-64.wic
# >> (OPTIONAL) specify the filesystem label where rootfs is located in the image.
# >> If not defined it defaults to 'otaroot'
# rootfs-label: otaroot

>> The customization section defines the modifications to be applied to get

>> the desired output image.

customization:

>> Splash screen image:

splash-screen: splash/splash.png

>> Splash screen configuration:

splash-config: spinner.plymouth

>> Directories overlayed to the base OSTree

filesystem:

 # - changes/

device-tree:
# >> Directories where to look for include files.
# include-dirs:
# - device-trees/include/
# >> Custom device tree source:
# custom: device-trees/dts-arm32/imx6ull-colibri-eval-v3.dts
# >> Device-tree overlays configuration:
overlays:
# >> Whether to ignore all overlays from the base image (or ostree
# >> archive in the future).
# clear: false
# >> Specific overlays not to use from base image (useful only when
# >> clear is false and not DT has been selected).
remove:
- colibri-imx7_vga-640x480_overlay.dtbo
# - apalis-imx8_hdmi_overlay.dtbo
# >> Overlays to add to output image.
add:
# - device-trees/overlays/display-edt7_overlay.dts
- device-tree/overlays/colibri-imx7_panel-res-touch-7inch_overlay.dts
- device-tree/overlays/colibri-imx7_spidev_overlay.dts

kernel:

# >> Custom kernel arguments.
# arguments:
  # - key1=val1
  # - key2=val2
# >> Modules to build and possibly load automatically.
# modules:
  # - source-dir: virtual_touchscreen/
  #   autoload: false

>> Secure Boot related Options

>> NOTE: All secboot options need a Torizon OS image with secure boot support built-in.

>> This includes kernel in FIT format, U-Boot built with the corresponding secure boot kconfigs, etc.

secboot:

# >> Sign kernel FIT image
# sign-kernel:
  # >> (REQUIRED) directory path with the keys to sign the kernel
  # kernel-key-dir: ./kernel_keys/
  # >> (REQUIRED) Key details
  # kernel-key:
     # >> 'algo' corresponds to the hashing and crypto algorithms to be used for the signing
     # >> process. If not set it defaults to the value given below.
     # - name: "prod"
     #   algo: "sha256,rsa2048"
# >> Sign bootloader for NXP SoCs supporting High Assurance Boot (HAB)
# sign-bootloader-hab:
  # >> (REQUIRED) directory path with the CST directory pre-configured with
  # >> keys, cerfiticates, SRK table and e-fuse hash binaries
  # cst-dir: ./cst-3.4.1/
  # >> (OPTIONAL) CST related options. If an option is not set,
  # >> it will default to the values given below
  # cst-args:
    # crypto: "rsa"
    # key-size: "2048"
    # key-exp: "65537"
    # dig-algo: "sha256"
    # srk-index: "1"
    # srk-table: "SRK_1_2_3_4_table.bin"
    # srk-fuse: "SRK_1_2_3_4_fuse.bin"
    # srk-no-ca-flag: false
  # >> (OPTIONAL) If the options below are provided, the public key used to verify
  # >> the kernel FIT will be updated. These must be set if signing the kernel FIT
  # >> with a new key.
  # kernel-key-dir: ./kernel_keys/
  # kernel-key:
     # >> 'algo' corresponds to the hashing and crypto algorithms used to verify and sign the
     # >> kernel, respectively. If not set it defaults to the value given below.
     # - name: "prod"
     #   algo: "sha256,rsa2048"

>> The output section defines properties of the output image.

output:

>> OSTree deployment configuration (relevant also for raw/Easy Installer output).

ostree:

# branch: my-dev-branch
# commit-subject: "OSTree commit subject"
# commit-body: "OSTree commit body"

>> Choose one of the options (REQUIRED):

>> (1) Parameters for deploying a WIC/raw image.

raw-image:

# >> (REQUIRED) output file/directory of the customized image:
# local: tcb_common_torizon.wic
# >> (OPTIONAL) specify the filesystem label where rootfs is located in the base image.
# >> If not defined it defaults to 'otaroot'.
# base-rootfs-label: otaroot
# >> (OPTIONAL) base image for the output.
# >> If not set it will default to be the same as the input one.
# >> Do not change this unless you know what you're doing.
# base-image:
# bundle:
  # >> Choose one of the options:
  # >> (1) Specify a docker-compose file whose referenced images will be downloaded.
  # >>     Properties platform, username, password, registry, ca-certificate and
  # >>     keep-double-dollar-sign are optional.
  # >>     When using a docker-compose file all config values with '$$' will be replaced
  # >>     by '$', unless keep-double-dollar-sign is set to true.
  # compose-file: files/docker-compose.yml
  # platform: linux/arm64
  # username: "${USERNAME}"
  # password: "${PASSWORD}"
  # registry: hub.docker.com
  # ca-certificate: cacert.pem
  # keep-double-dollar-sign: false
  # dind-params:
    # - '--param1'
    # - '--param2'
  # dind-env:
    # - 'VAR1=value1'
  # >> (2) Specify a local directory containing the bundled images (previously
  # >>     obtained by 'torizoncore-builder bundle' command).
  # dir: bundle/

>> (2) Parameters for deploying to an Easy Installer image.

easy-installer:
# >> Output directory of the customized image (REQUIRED):
local: output_directory
# >> Information used by Toradex Easy Installer:
description: “My torizon customized image”
# licence: files/custom-licence.html
# release-notes: files/custom-release-notes.html
# accept-licence: true
# autoinstall: true
# autoreboot: true
# bundle:
# >> Choose one of the options:
# >> (1) Specify a docker-compose file whose referenced images will be downloaded.
# >> Properties platform, username, password, registry, ca-certificate and
# >> keep-double-dollar-sign are optional.
# >> When using a docker-compose file all config values with ‘$$’ will be replaced
# >> by ‘$’, unless keep-double-dollar-sign is set to true.
# compose-file: files/docker-compose.yml
# platform: linux/arm/v7
# username: “${USERNAME}”
# password: “${PASSWORD}”
# registry: hub.docker.com
# ca-certificate: cacert.pem
# keep-double-dollar-sign: false
# >> (2) Specify a local directory containing the bundled images (previously
# >> obtained by ‘torizoncore-builder bundle’ command).
# dir: bundle/
# >> Provisioning configuration:
# provisioning:
# >> For “online” mode, properties “shared-data” and “online-data” must be specified.
# >> For “offline” mode, property “shared-data” must be specified alone.
# mode: “online”
# shared-data: “shared-data.tar.gz”
# online-data: “${ONLINE_PROVISIONING_DATA:?online provisioning data not supplied}”
# >> Provision in hibernated mode. In this state devices are registered, but
# >> cannot send/receive data to/from Torizon Cloud, and they’re not counted
# >> towards a subscription.
# hibernated: false
also dts
/dts-v1/;
/plugin/;

/ {
compatible = “toradex,colibri-imx7d”,
“toradex,colibri-imx7s”,
“toradex,colibri-imx7d-emmc”;
};
&panel_dpi {
compatible = “panel-dpi”;
status = “okay”;

    width-mm = <154>;
    height-mm = <86>;

    data-mapping = "rgb666";
    bus-width = <18>;

    panel-timing {
            clock-frequency = <33300000>;//<25165392>;
            hactive = <800>;
            vactive = <480>;
            hsync-len = <48>;//<43>;
            hfront-porch = <40>;//<10>;
            hback-porch = <40>;//<7>;
            vsync-len = <2>;
            vfront-porch = <11>;
            vback-porch = <21>;
            pixelclk-active = <1>;
            hsync-active = <1>;
            vsync-active = <1>;
            de-active = <1>;
    };

};

&backlight {
status = “okay”;
};

&lcdif {
status = “okay”;
};

&pwm1 {
status = “okay”;
};

&ad7879_ts {
status = “okay”;
};

The issue you’re experiencing suggests that your device tree overlay structure may not be correctly modifying the base device tree. Based on a similar case in the Toradex community, device tree overlays require specific syntax to properly override properties in the root node.(1) ## Problem Analysis When you manually add the .dtbo file to the OSTree directory, it works correctly. However, when compiled through TorizonCore Builder, the clock frequency appears incorrect. This indicates the overlay isn’t being applied as expected during the build process.(1) ## Solution: Fix Your Device Tree Overlay Syntax Your current overlay uses the raw / syntax, which only specifies compatibility. To actually modify nodes in the device tree, you need to use the &{/} syntax for the root node.(1) ### Corrected Device Tree Overlay Here’s how your colibri-imx7_panel-res-touch-7inch_overlay.dts should be structured:(1) dts /dts-v1/; /plugin/; / { compatible = "toradex,colibri-imx7d", "toradex,colibri-imx7s", "toradex,colibri-imx7d-emmc"; }; &panel_dpi { compatible = "panel-dpi"; status = "okay"; width-mm = <154>; height-mm = <86>; data-mapping = "rgb666"; bus-width = <18>; panel-timing { clock-frequency = <33300000>; hactive = <800>; vactive = <480>; hsync-len = <48>; hfront-porch = <40>; hback-porch = <40>; vsync-len = <2>; vfront-porch = <11>; vback-porch = <21>; pixelclk-active = <1>; hsync-active = <1>; vsync-active = <1>; de-active = <1>; }; }; &backlight { status = "okay"; }; &lcdif { status = "okay"; }; &pwm1 { status = "okay"; }; &ad7879_ts { status = "okay"; }; (1) ## Additional Configuration Issues I also notice an issue in your tcbuild.yaml configuration. You need to add the include-dirs section for proper compilation:(2)(3)(4) yaml device-tree: include-dirs: - device-tree/include/ overlays: remove: - colibri-imx7_vga-640x480_overlay.dtbo add: - device-tree/overlays/colibri-imx7_panel-res-touch-7inch_overlay.dts - device-tree/overlays/colibri-imx7_spidev_overlay.dts (2)(3)(4) ## Rebuild and Deploy After making these changes:(3)(4) 1. Rebuild the image: bash $ torizoncore-builder build (4) 2. Deploy via SSH: bash $ torizoncore-builder deploy --remote-host <YOUR_BOARD_IP> --remote-username torizon --remote-password torizon --reboot (3)(4) ## Verification After deployment, verify the overlay was applied correctly:(3) bash $ cat /proc/device-tree/chosen/overlays/colibri-imx7_panel-res-touch-7inch_overlay.dtbo (3) If the output is 0, the overlay was successfully applied.(3) The key difference from your original overlay is using &panel_dpi directly instead of trying to modify it through the root node. This ensures the panel timing parameters, including your custom clock frequency of 33.3 MHz, are correctly applied during boot.(1) Best regards, Toradex AI Assistant.


Did you like my answer? :+1: :-1:

If I answered your question, please tick the “Solution” checkbox.

For follow-up questions to me, please use @ToradexAI in your post.

Hello,

First, your overall approach seems correct. Using TorizonCore Builder’s build command with a tcbuild.yaml that defines the splash screen and the overlays to add or remove, followed by deployment over SSH with deploy --reboot, is the recommended workflow for preparing a production image. There should be no need to change that part of the process.

One correction regarding the previous Toradex AI suggestion is that changing the overlay to target &panel_dpi does not apply in this case, as your overlay already targets that node correctly. Therefore, this does not appear to be a device tree syntax issue.

The clock-frequency property is stored as a plain integer in the device tree. When dtc compiles the overlay, it should preserve that value regardless of whether the compilation is performed directly or through TorizonCore Builder. In other words, the build process itself should not change 33300000 into another frequency.

One of the first possibilities to verify is whether the manually installed .dtbo that works and the .dts currently passed to TorizonCore Builder contain different timing values. The source you shared also makes this worth checking, since the following line shows that at least two clock values were tested at some point:

clock-frequency = <33300000>; // <25165392>

You can verify this by decompiling the working binary overlay and comparing it with the source used by TorizonCore Builder.

First, decompile the .dtbo that works:

dtc -I dtb -O dts \ colibri-imx7_panel-res-touch-7inch_overlay.dtbo \ -o working.dts

Then compare the panel-timing block in working.dts with the corresponding block in the .dts passed to TorizonCore Builder. In particular, check:

  • clock-frequency
  • hactive and vactive
  • hsync-len, hfront-porch, and hback-porch
  • vsync-len, vfront-porch, and vback-porch

If any of these values differ, update the source used by TorizonCore Builder with the values from working.dts, then rebuild and deploy the image. This should make the generated overlay match the one that is already working correctly.

You can also confirm whether the overlay was applied by reading the following property on the target:

cat /proc/device-tree/chosen/overlays/colibri-imx7_panel-res-touch-7inch_overlay.dtbo

A value of 0 indicates that U-Boot applied the overlay successfully. However, this only confirms that the overlay was applied; it does not confirm that the applied file contains the expected timing values.

If the two panel-timing blocks are identical and the display still behaves differently, the next step would be to compare the working .dtbo with the .dtbo generated by TorizonCore Builder and check the final list and order of overlays applied by the image.

In that case, please attach the working .dtbo, the generated .dtbo, and the final overlay configuration so we can investigate further.

Rafael Savitsky
Toradex

Hello,

First, your overall approach seems correct. Using TorizonCore Builder’s build command with a tcbuild.yaml that defines the splash screen and the overlays to add or remove, followed by deployment over SSH with deploy --reboot, is the recommended workflow for preparing a production image. There should be no need to change that part of the process.

One correction regarding the previous Toradex AI suggestion is that changing the overlay to target &panel_dpi does not apply in this case, as your overlay already targets that node correctly. Therefore, this does not appear to be a device tree syntax issue.

The clock-frequency property is stored as a plain integer in the device tree. When dtc compiles the overlay, it should preserve that value regardless of whether the compilation is performed directly or through TorizonCore Builder. In other words, the build process itself should not change 33300000 into another frequency.

One of the first possibilities to verify is whether the manually installed .dtbo that works and the .dts currently passed to TorizonCore Builder contain different timing values. The source you shared also makes this worth checking, since the following line shows that at least two clock values were tested at some point:

clock-frequency = <33300000>; // <25165392>

You can verify this by decompiling the working binary overlay and comparing it with the source used by TorizonCore Builder.

First, decompile the .dtbo that works:

dtc -I dtb -O dts \ colibri-imx7_panel-res-touch-7inch_overlay.dtbo \ -o working.dts

Then compare the panel-timing block in working.dts with the corresponding block in the .dts passed to TorizonCore Builder. In particular, check:

clock-frequency
hactive and vactive
hsync-len, hfront-porch, and hback-porch
vsync-len, vfront-porch, and vback-porch

If any of these values differ, update the source used by TorizonCore Builder with the values from working.dts, then rebuild and deploy the image. This should make the generated overlay match the one that is already working correctly.

You can also confirm whether the overlay was applied by reading the following property on the target:

cat /proc/device-tree/chosen/overlays/colibri-imx7_panel-res-touch-7inch_overlay.dtbo

A value of 0 indicates that U-Boot applied the overlay successfully. However, this only confirms that the overlay was applied; it does not confirm that the applied file contains the expected timing values.

If the two panel-timing blocks are identical and the display still behaves differently, the next step would be to compare the working .dtbo with the .dtbo generated by TorizonCore Builder and check the final list and order of overlays applied by the image.

In that case, please attach the working .dtbo, the generated .dtbo, and the final overlay configuration so we can investigate further.

Rafael Savitsky
Toradex