Verdin iMX8M Plus (Mallow Carrier) – LVDS Overlay causes board not to boot

Hi,

I’m working on the Mallow carrier board with Verdin iMX8M Plus and using the Yocto Project.
I created a custom LVDS overlay based on the Toradex example, but after adding the generated .dtbo to /boot/overlay/ and enabling it in overlays.txt, the system doesn’t boot anymore.

Here’s the overlay I used:

raju@sys:/mnt/yocto_build/toradex-verdin-am62mp/layers$ tree meta-winstar-display/
meta-winstar-display/
├── conf
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-kernel
    └── linux
        ├── device-tree-overlays
        │   └── my-device-tree_overlay.dts
        └── device-tree-overlays_%.bbappend

4 directories, 5 files
udaykumar@SYS-TK01:/mnt/yocto_build/toradex-verdin-am62mp/layers$ cat meta-winstar-display/recipes-kernel/linux/device-tree-overlays_%.bbappend
FILESEXTRAPATHS:prepend := "${THISDIR}/device-tree-overlays:"

CUSTOM_OVERLAYS_SOURCE = " \
    my-device-tree_overlay.dts \
"
CUSTOM_OVERLAYS_BINARY = " \
    my-device-tree_overlay.dtbo \
"

SRC_URI += " \
    file://my-device-tree_overlay.dts \
"

TEZI_EXTERNAL_KERNEL_DEVICETREE += " \
    ${CUSTOM_OVERLAYS_BINARY} \
"

TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT = " \
    ${CUSTOM_OVERLAYS_BINARY} \
"

do_collect_overlays:prepend() {
    for DTS in ${CUSTOM_OVERLAYS_SOURCE}; do
        cp ${WORKDIR}/${DTS} ${S}
    done
}
raju@sys:/mnt/yocto_build/toradex-verdin-am62mp/layers$ cat meta-winstar-display/recipes-kernel/linux/device-tree-overlays/my-device-tree_overlay.dts
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright 2023 Toradex
 */

// Verdin iMX8M Plus single-channel LVDS

/dts-v1/;
/plugin/;


#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pwm/pwm.h>
#include "imx8mp-pinfunc.h"


/ {
	compatible = "toradex,verdin-imx8mp";
};

&{/} {
	backlight_lvds_native: backlight-lvds-native {
		compatible = "pwm-backlight";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_i2s_2_d_out_dsi_1_bkl_en>;		
		brightness-levels = <0 45 63 88 119 158 203 255>;
		default-brightness-level = <4>;
		/* Verdin I2S_2_D_OUT as GPIO (SODIMM 46) */
		enable-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;	
		/* Verdin PWM_2 (SODIMM 16) */
		pwms = <&pwm2 0 6666667 PWM_POLARITY_INVERTED>;
		status = "okay";
	};

	panel-lvds-native {
		compatible = "panel-lvds";
		backlight = <&backlight_lvds_native>;
		data-mapping = "vesa-24";
		height-mm = <136>;
		width-mm = <217>;

		panel-timing {
			clock-frequency = <68900000 71100000 73400000>;
			de-active = <1>;
			hactive = <1280 1280 1280>;
			hback-porch = <23 60 71>;
			hfront-porch = <23 60 71>;
			hsync-active = <0>;
			hsync-len = <15 40 47>;
			pixelclk-active = <1>; /* positive edge */
			vactive = <800 800 800>;
			vback-porch = <5 7 10>;
			vfront-porch = <5 7 10>;
			vsync-active = <0>;
			vsync-len = <6 9 12>;
		};

		port {
			panel_lvds_native_in: endpoint {
				remote-endpoint = <&lvds_out>;
			};
		};
	};
};

&gpu_2d {
	status = "okay";
};

&gpu_3d {
	status = "okay";
};

/* Verdin I2C_2_DSI */
&i2c2 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";
	
	touch@4a {
		compatible = "atmel,maxtouch";
		reg = <0x4a>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_i2s_2_d_in_gpio>,
			    <&pinctrl_i2s_2_sync_gpio>;	
		/* Verdin I2S_2_SYNC as GPIO (SODIMM 44) */
		interrupt-parent = <&gpio4>;
		interrupts = <31 IRQ_TYPE_EDGE_FALLING>;
		/* Verdin I2S_2_D_IN as GPIO (SODIMM 48) */
		reset-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>;
		status = "okay";
	};
};

&lcdif2 {
	status = "okay";
};

&ldb {
	status = "okay";
};

&ldb_phy {
	status = "okay";
};

&lvds_out{
	remote-endpoint = <&panel_lvds_native_in>;
};

&mix_gpu_ml {
	status = "okay";
};

&ml_vipsi {
	status = "okay";
};

/* Verdin PWM_2 */
&pwm2 {
	status = "okay";
};

&iomuxc {
	pinctrl_i2s_2_d_in_gpio: gpio4io30grp {
		fsl,pins =
			<MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30 0x1c4>;	/* SODIMM 48 */
	};	

	pinctrl_i2s_2_sync_gpio: gpio4io31grp {
		fsl,pins =
			<MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31 0x184>;	/* SODIMM 44 */
	};
};

Regards,
Raju

Hi, I’m the Toradex AI Assistant.

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


LVDS Device Tree Overlay Issues on Verdin iMX8M Plus

Based on your overlay configuration and the boot failure you’re experiencing, there are several potential issues to address:

Key Issues Identified

  1. Missing Node Reference: Your overlay references &lvds_out but this node may not exist in the base device tree for the Verdin iMX8M Plus (1).

  2. LVDS Controller Configuration: The Verdin iMX8M Plus has specific LVDS configuration requirements that need to be properly addressed (1).

Verdin iMX8M Plus LVDS Configuration

According to the Toradex documentation, the Verdin iMX8M Plus supports native LVDS through lcdif2 + ldb with the device tree node reference lcdif2 + ldb and DRM connector name LVDS-1 (1). The LVDS interface is not part of the Always Compatible interfaces and uses module-specific pins (1).

Recommended Solutions

  1. Check Node References: Verify that all node references in your overlay exist in the base device tree. The community forum indicates similar issues with FDT_ERR_NOTFOUND errors when node references don’t match (2).

  2. Use Provided Overlays as Reference: Toradex provides pre-built overlays for LVDS displays. For the Verdin iMX8M Plus, you can reference the native LVDS overlays available in the system (3).

  3. Verify Overlay Compilation: Ensure your overlay compiles correctly using the device tree compiler. The bbappend structure you’re using follows the correct pattern as documented (4):

FILESEXTRAPATHS:prepend := "${THISDIR}/device-tree-overlays:"

CUSTOM_OVERLAYS_SOURCE = " \
    my-device-tree_overlay.dts \
"
CUSTOM_OVERLAYS_BINARY = " \
    my-device-tree_overlay.dtbo \
"

SRC_URI += " \
    file://my-device-tree_overlay.dts \
"

TEZI_EXTERNAL_KERNEL_DEVICETREE += " \
    ${CUSTOM_OVERLAYS_BINARY} \
"

TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT = " \
    ${CUSTOM_OVERLAYS_BINARY} \
"

do_collect_overlays:prepend() {
    for DTS in ${CUSTOM_OVERLAYS_SOURCE}; do
        cp ${WORKDIR}/${DTS} ${S}
    done
}

(4)

Debugging Steps

  1. Check Boot Logs: Review the complete boot log for specific error messages about the overlay application (5).

  2. Test with Simplified Overlay: Start with a minimal overlay to isolate the problematic sections (5).

  3. Verify Base Device Tree: Ensure the base device tree includes the nodes your overlay expects to modify (2).

Alternative Approach

Consider using the DSI to LVDS adapter approach if native LVDS continues to cause issues. The Verdin iMX8M Plus supports DSI-to-LVDS adapters with the overlay verdin-imx8mp_dsi-to-lvds_panel-cap-touch-10inch-lvds_overlay.dtbo (3).

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.

Hi @raju3003!

Could you please share the boot log? Is there any error message?

Best regards.

Hi lucas_az.tx,

Thanks for your reply.

Currently, nothing appears on the display. I also connected an HDMI monitor to check the boot logs, but there is no output.

I want to adjust some parameters according to my display requirements, and I also want to work on enabling dual-channel LVDS. I used the following DTS as a reference:
verdin-imx8mp-single-channel-lvds
(verdin-imx8mp_panel-cap-touch-10inch-lvds_overlay.dts « overlays - device-tree-overlays.git - Sources for Device Tree Overlays

meta-winstar-display/
├── conf
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-kernel
    └── linux
        ├── device-tree-overlays
        │   └── my-device-tree_overlay.dts
        └── device-tree-overlays_git.bbappend

And the bbappend file contains:

FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:"

SRC_URI:append = " file://my-device-tree_overlay.dts"

do_collect_overlays:prepend () {
    cp ${WORKDIR}/my-device-tree_overlay.dts ${S}
}

TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT:append = " my-device-tree_overlay.dtbo"

and for dts i just copied the above dts in the link as it is later i will change

i think there is something happening after adding the dtbo intially i tested without
“TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT:append = " my-device-tree_overlay.dtbo”
it boots well after i added this in overlays.txt then its not booting may be possibly with the overlay
i am copying as it because if this works mine next step will be like modifying diplay parameters based on my display

Best regards,
Raju

Hi @raju3003,

For debugging purposes, it would be best if you could use the Debug UART (serial communication), as it outputs many log messages that can help us identify the root cause of the issue.

Also, please note that the Mallow is a volume board, meaning it’s not recommended for development, mainly due to its limited available interfaces. I’d recommend using a Dahlia or Development Board instead. If you don’t have either of those, you can still access the Debug UART on Mallow through the X11 header.

Without the boot log, it’s much harder to understand the error, so please try to establish a serial connection so we can narrow down the issue.

Best regards,

Hi lucas_az.tx

Here is the output from u-boot

NOTICE:  Do not release JR0 to NS as it can be used by HAB
NOTICE:  BL31: v2.10.0  (release):lf-6.6.52-2.2.1-dirty
NOTICE:  BL31: Built : 06:40:36, Jul  7 2025


U-Boot 2024.07-7.4.0-devel+git.3f772959501c (Jul 01 2024 - 18:07:18 +0000)

CPU:   Freescale i.MX8MP Lite[4] rev1.1 1600 MHz (running at 1200 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 56C
Reset cause: POR
DRAM:  1 GiB
Core:  177 devices, 31 uclasses, devicetree: separate
WDT:   Started watchdog@30280000 with servicing every 1000ms (60s timeout)
MMC:   FSL_SDHC: 1, FSL_SDHC: 2
Loading Environment from MMC... Reading from MMC(2)... OK
In:    serial@30880000
Out:   serial@30880000
Err:   serial@30880000
Model: Toradex 0065 Verdin iMX8M Plus QuadLite 1GB IT V1.1A
Serial#: 15010457
Carrier: Toradex Verdin Development Board V1.1F, Serial# 11349801
SEC0:  RNG instantiated
Setting variant to nonwifi
Net:   eth1: ethernet@30be0000, eth0: ethernet@30bf0000 [PRIME]
Hit any key to stop autoboot:  0
MMC: no card present
switch to partitions #0, OK
mmc2(part 0) is current device
Scanning mmc 2:1...
Found U-Boot script /boot.scr
5389 bytes read in 3 ms (1.7 MiB/s)
## Executing script at 50280000
Loading DeviceTree: imx8mp-verdin-nonwifi-dev.dtb
87336 bytes read in 3 ms (27.8 MiB/s)
149 bytes read in 2 ms (72.3 KiB/s)
Working FDT set to 50200000
Applying Overlay: verdin-imx8mp_hdmi_overlay.dtbo
2219 bytes read in 1 ms (2.1 MiB/s)
Applying Overlay: verdin-imx8mp_dsi-to-hdmi_overlay.dtbo
4099 bytes read in 2 ms (2 MiB/s)
Applying Overlay: verdin-imx8mp_spidev_overlay.dtbo
561 bytes read in 2 ms (273.4 KiB/s)
Applying Overlay: verdin-imx8mp_gpio-pullup.dtbo
4145 bytes read in 3 ms (1.3 MiB/s)
failed on fdt_overlay_apply(): FDT_ERR_NOTFOUND
8302089 bytes read in 59 ms (134.2 MiB/s)
Bootargs: root=PARTUUID=03eddeb4-02 ro rootwait console=tty1 console=ttymxc2,115200
   Uncompressing Kernel Image to 0
ERROR: Did not find a cmdline Flattened Device Tree
Could not find a valid device tree
Booting from mmc failed!
SCRIPT FAILED: continuing...
87336 bytes read in 3 ms (27.8 MiB/s)
MMC: no card present
No EFI system partition
No EFI system partition
Failed to persist EFI variables
No EFI system partition

I think there is some issue with the overlay content its failing there

also i changed a file names little bit help me like where exactly the issue

raju@sys-:/mnt/yocto_build/toradex-verdin-am62mp/layers$ tree meta-gpio/
meta-gpio/
├── conf
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-kernel
    └── linux
        ├── device-tree-overlays
        │   └── verdin-imx8mp_gpio-pullup.dts
        └── device-tree-overlays_%.bbappend

4 directories, 5 files
raju@sys- :/mnt/yocto_build/toradex-verdin-am62mp/layers$ ls
meta-arm           meta-custom              meta-freescale-distro  meta-qt5                       meta-ti                  meta-toradex-distro  meta-winstar-display
meta-canopenlinux  meta-freescale           meta-gpio              meta-security                  meta-toradex-bsp-common  meta-toradex-nxp     meta-yocto
meta-canopennode   meta-freescale-3rdparty  meta-openembedded      meta-teckinsoft-carrier-board  meta-toradex-demos       meta-toradex-ti      openembedded-core
udaykumar@SYS-TK01:/mnt/yocto_build/toradex-verdin-am62mp/layers$ cd ../
udaykumar@SYS-TK01:/mnt/yocto_build/toradex-verdin-am62mp$ cd layers/
udaykumar@SYS-TK01:/mnt/yocto_build/toradex-verdin-am62mp/layers$ tree meta-gpio/
meta-gpio/
├── conf
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-kernel
    └── linux
        ├── device-tree-overlays
        │   └── verdin-imx8mp_gpio-pullup.dts
        └── device-tree-overlays_%.bbappend

4 directories, 5 files
udaykumar@SYS-TK01:/mnt/yocto_build/toradex-verdin-am62mp/layers$ cat meta-gpio/recipes-kernel/linux/device-tree-overlays_%.bbappend
FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:"

SRC_URI:append = " file://verdin-imx8mp_gpio-pullup.dts"

do_collect_overlays:prepend () {
    cp ${WORKDIR}/verdin-imx8mp_gpio-pullup.dts ${S}
}

TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT:append = " verdin-imx8mp_gpio-pullup.dtbo"
raju@sys-:/mnt/yocto_build/toradex-verdin-am62mp/layers$ cat meta-gpio/recipes-kernel/linux/device-tree-overlays/verdin-imx8mp_gpio-pullup.dts
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright 2023 Toradex
 */

// Verdin iMX8M Plus single-channel LVDS

/dts-v1/;
/plugin/;


#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pwm/pwm.h>
#include "imx8mp-pinfunc.h"


/ {
        compatible = "toradex,verdin-imx8mp";
};

&{/} {
        backlight_lvds_native: backlight-lvds-native {
                compatible = "pwm-backlight";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_i2s_2_d_out_dsi_1_bkl_en>;                
                brightness-levels = <0 45 63 88 119 158 203 255>;
                default-brightness-level = <4>;
                /* Verdin I2S_2_D_OUT as GPIO (SODIMM 46) */
                enable-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;     
                /* Verdin PWM_2 (SODIMM 16) */
                pwms = <&pwm2 0 6666667 PWM_POLARITY_INVERTED>;
                status = "okay";
        };

        panel-lvds-native {
                compatible = "panel-lvds";
                backlight = <&backlight_lvds_native>;
                data-mapping = "vesa-24";
                height-mm = <136>;
                width-mm = <217>;

                panel-timing {
                        clock-frequency = <68900000 71100000 73400000>;
                        de-active = <1>;
                        hactive = <1280 1280 1280>;
                        hback-porch = <23 60 71>;
                        hfront-porch = <23 60 71>;
                        hsync-active = <0>;
                        hsync-len = <15 40 47>;
                        pixelclk-active = <1>; /* positive edge */
                        vactive = <800 800 800>;
                        vback-porch = <5 7 10>;
                        vfront-porch = <5 7 10>;
                        vsync-active = <0>;
                        vsync-len = <6 9 12>;
                };

                port {
                        panel_lvds_native_in: endpoint {
                                remote-endpoint = <&lvds_out>;
                        };
                };
        };
};

&gpu_2d {
        status = "okay";
};

&gpu_3d {
        status = "okay";
};

/* Verdin I2C_2_DSI */
&i2c2 {
        #address-cells = <1>;
        #size-cells = <0>;
        status = "okay";
        
        touch@4a {
                compatible = "atmel,maxtouch";
                reg = <0x4a>;
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_i2s_2_d_in_gpio>,
                            <&pinctrl_i2s_2_sync_gpio>; 
                /* Verdin I2S_2_SYNC as GPIO (SODIMM 44) */
                interrupt-parent = <&gpio4>;
                interrupts = <31 IRQ_TYPE_EDGE_FALLING>;
                /* Verdin I2S_2_D_IN as GPIO (SODIMM 48) */
                reset-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>;
                status = "okay";
        };
};

&lcdif2 {
        status = "okay";
};

&ldb {
        status = "okay";
};

&ldb_phy {
        status = "okay";
};

&lvds_out{
        remote-endpoint = <&panel_lvds_native_in>;
};

&mix_gpu_ml {
        status = "okay";
};

&ml_vipsi {
        status = "okay";
};

/* Verdin PWM_2 */
&pwm2 {
        status = "okay";
};

&iomuxc {
        pinctrl_i2s_2_d_in_gpio: gpio4io30grp {
                fsl,pins =
                        <MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30 0x1c4>;      /* SODIMM 48 */
        };      

        pinctrl_i2s_2_sync_gpio: gpio4io31grp {
                fsl,pins =
                        <MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31 0x184>;     /* SODIMM 44 */
        };
};

Earlier i was working mallow carrier board that time here development board automatically selected to verdin development since it doesnt has lvds i though its not supporting than i changed that to mallow and checked again its same its same issue so it tells that its not about development board can you please check like u also facing same issue or somewhere i did wrong

Regards,
Raju

Hi Community,

Any update on this

regards,
Raju

Hi @raju3003!

The error “FDT_ERR_NOTFOUND” happens because the node the overlay is trying to operate on is not found in the kernel image. One of the most common reasons is building the overlay against a different kernel version that’s running on the module.

To debug this issue, I would comment out nodes of the overlay until I find the section that is responsible for the error. Then, you’d need to understand why this node is causing the issue, and you could do that by checking the kernel version and the device tree.

If you’re not familiar with overlays, I would recommend our Partner Network, where you can find people who will help you address your issue and develop the project.

Best regards.