Verdin IMX8MP + Ivy board LEDs

Hello together,

I am trying to control the LEDs on the Ivy board. According to the datasheet and the schematics the pinout is as following:

First qestion: Is the SODIMM 54 multiplexed? According to the schematics not, but in the datasheet it is:

Second question: I cant find SODIMM 30, 32, 34 and 54 ind the gpioinfo

/# gpioinfo | grep -v 'unnamed'
gpiochip0 - 32 lines:
        line   1:      "GPIO2"       unused   input  active-high
        line   5:      "GPIO3"       unused   input  active-high
gpiochip1 - 32 lines:
        line   6: "SODIMM_143"       unused   input  active-high
        line   7: "SODIMM_141"       unused   input  active-high
        line  10: "SODIMM_161"         "id"   input  active-high [used]
        line  12:  "SODIMM_84"         "cd"   input   active-low [used]
        line  13:  "SODIMM_78"       unused   input  active-high
        line  14:  "SODIMM_74"       unused   input  active-high
        line  15:  "SODIMM_80"       unused   input  active-high
        line  16:  "SODIMM_82"       unused   input  active-high
        line  17:  "SODIMM_70"       unused   input  active-high
        line  18:  "SODIMM_72"       unused   input  active-high
gpiochip2 - 32 lines:
        line   6:      "DIG_1"       unused   input  active-high
        line   7:      "DIG_2"       unused   input  active-high
        line   8:       "REL1"       unused   input  active-high
        line   9:       "REL2"       unused   input  active-high
        line  14:       "REL4"       unused   input  active-high
        line  16:       "REL3"       unused   input  active-high
gpiochip3 - 32 lines:
        line   0: "SODIMM_252"    "Wake-Up"   input   active-low [used]
        line   1: "SODIMM_222"       unused   input  active-high
        line   2:  "SODIMM_36"       unused   input  active-high
        line   3: "SODIMM_220"       unused   input  active-high
        line   4: "SODIMM_193"       unused   input  active-high
        line   5: "SODIMM_191"       unused   input  active-high
        line   6: "SODIMM_201"       unused   input  active-high
        line   7: "SODIMM_203"       unused   input  active-high
        line   8: "SODIMM_205"       unused   input  active-high
        line   9: "SODIMM_207"       unused   input  active-high
        line  10: "SODIMM_199"       unused   input  active-high
        line  11: "SODIMM_197"       unused   input  active-high
        line  12: "SODIMM_221"       unused   input  active-high
        line  13: "SODIMM_219"       unused   input  active-high
        line  14: "SODIMM_217"       unused   input  active-high
        line  15: "SODIMM_215"       unused   input  active-high
        line  16: "SODIMM_211"       unused   input  active-high
        line  17: "SODIMM_213"       unused   input  active-high
        line  18: "SODIMM_189"       unused   input  active-high
        line  19: "SODIMM_244" "PCIe reset"  output  active-high [used]
        line  20:  "SODIMM_38"       unused  output  active-high
        line  22:  "SODIMM_76" "regulator-usdhc2" output active-high [used]
        line  23: "SODIMM_135"       unused   input  active-high
        line  24: "SODIMM_133"       unused   input  active-high
        line  25:  "SODIMM_17"       unused   input  active-high
        line  26:  "SODIMM_24"       unused   input  active-high
        line  27:  "SODIMM_26"       unused   input  active-high
        line  28:  "SODIMM_21"     "enable"  output  active-high [used]
        line  29: "SODIMM_256" "regulator-force-sleep-moci" output active-high [used]
        line  30:  "SODIMM_48"       unused   input  active-high
        line  31:  "SODIMM_44" "GPIO application" output active-high [used]
gpiochip4 - 32 lines:
        line   0:  "SODIMM_42"      "reset"  output   active-low [used]
        line   1:  "SODIMM_46"     "enable"  output  active-high [used]
        line   2: "SODIMM_187"       unused   input  active-high
        line   3:  "SODIMM_20"       unused   input  active-high
        line   4:  "SODIMM_22"       unused   input  active-high
        line   5:  "SODIMM_15"       unused   input  active-high
        line   6: "SODIMM_196"       unused   input  active-high
        line   7: "SODIMM_200"       unused   input  active-high
        line   8: "SODIMM_198"       unused   input  active-high
        line   9: "SODIMM_202"   "spi1 CS0"  output   active-low [used]
        line  16:  "SODIMM_55"        "scl"  output  active-high [used open-drain]
        line  17:  "SODIMM_53"        "sda"   input  active-high [used open-drain]
        line  18:  "SODIMM_95"        "scl"  output  active-high [used open-drain]
        line  19:  "SODIMM_93"        "sda"   input  active-high [used open-drain]
        line  20:  "SODIMM_14"        "scl"  output  active-high [used open-drain]
        line  21:  "SODIMM_12"        "sda"   input  active-high [used open-drain]
        line  22: "SODIMM_129"       unused   input  active-high
        line  23: "SODIMM_131"       unused   input  active-high
        line  24: "SODIMM_137"       unused   input  active-high
        line  25: "SODIMM_139"       unused   input  active-high
        line  26: "SODIMM_147"       unused   input  active-high
        line  27: "SODIMM_149"       unused   input  active-high
        line  28: "SODIMM_151"       unused   input  active-high
        line  29: "SODIMM_153"       unused   input  active-high
root@6dc8511e497d:/# gpioinfo | grep -v 'unnamed'
gpiochip0 - 32 lines:
        line   1:      "GPIO2"       unused   input  active-high
        line   5:      "GPIO3"       unused   input  active-high
gpiochip1 - 32 lines:
        line   6: "SODIMM_143"       unused   input  active-high
        line   7: "SODIMM_141"       unused   input  active-high
        line  10: "SODIMM_161"         "id"   input  active-high [used]
        line  12:  "SODIMM_84"         "cd"   input   active-low [used]
        line  13:  "SODIMM_78"       unused   input  active-high
        line  14:  "SODIMM_74"       unused   input  active-high
        line  15:  "SODIMM_80"       unused   input  active-high
        line  16:  "SODIMM_82"       unused   input  active-high
        line  17:  "SODIMM_70"       unused   input  active-high
        line  18:  "SODIMM_72"       unused   input  active-high
gpiochip2 - 32 lines:
        line   6:      "DIG_1"       unused   input  active-high
        line   7:      "DIG_2"       unused   input  active-high
        line   8:       "REL1"       unused   input  active-high
        line   9:       "REL2"       unused   input  active-high
        line  14:       "REL4"       unused   input  active-high
        line  16:       "REL3"       unused   input  active-high
gpiochip3 - 32 lines:
        line   0: "SODIMM_252"    "Wake-Up"   input   active-low [used]
        line   1: "SODIMM_222"       unused   input  active-high
        line   2:  "SODIMM_36"       unused   input  active-high
        line   3: "SODIMM_220"       unused   input  active-high
        line   4: "SODIMM_193"       unused   input  active-high
        line   5: "SODIMM_191"       unused   input  active-high
        line   6: "SODIMM_201"       unused   input  active-high
        line   7: "SODIMM_203"       unused   input  active-high
        line   8: "SODIMM_205"       unused   input  active-high
        line   9: "SODIMM_207"       unused   input  active-high
        line  10: "SODIMM_199"       unused   input  active-high
        line  11: "SODIMM_197"       unused   input  active-high
        line  12: "SODIMM_221"       unused   input  active-high
        line  13: "SODIMM_219"       unused   input  active-high
        line  14: "SODIMM_217"       unused   input  active-high
        line  15: "SODIMM_215"       unused   input  active-high
        line  16: "SODIMM_211"       unused   input  active-high
        line  17: "SODIMM_213"       unused   input  active-high
        line  18: "SODIMM_189"       unused   input  active-high
        line  19: "SODIMM_244" "PCIe reset"  output  active-high [used]
        line  20:  "SODIMM_38"       unused  output  active-high
        line  22:  "SODIMM_76" "regulator-usdhc2" output active-high [used]
        line  23: "SODIMM_135"       unused   input  active-high
        line  24: "SODIMM_133"       unused   input  active-high
        line  25:  "SODIMM_17"       unused   input  active-high
        line  26:  "SODIMM_24"       unused   input  active-high
        line  27:  "SODIMM_26"       unused   input  active-high
        line  28:  "SODIMM_21"     "enable"  output  active-high [used]
        line  29: "SODIMM_256" "regulator-force-sleep-moci" output active-high [used]
        line  30:  "SODIMM_48"       unused   input  active-high
        line  31:  "SODIMM_44" "GPIO application" output active-high [used]
gpiochip4 - 32 lines:
        line   0:  "SODIMM_42"      "reset"  output   active-low [used]
        line   1:  "SODIMM_46"     "enable"  output  active-high [used]
        line   2: "SODIMM_187"       unused   input  active-high
        line   3:  "SODIMM_20"       unused   input  active-high
        line   4:  "SODIMM_22"       unused   input  active-high
        line   5:  "SODIMM_15"       unused   input  active-high
        line   6: "SODIMM_196"       unused   input  active-high
        line   7: "SODIMM_200"       unused   input  active-high
        line   8: "SODIMM_198"       unused   input  active-high
        line   9: "SODIMM_202"   "spi1 CS0"  output   active-low [used]
        line  16:  "SODIMM_55"        "scl"  output  active-high [used open-drain]
        line  17:  "SODIMM_53"        "sda"   input  active-high [used open-drain]
        line  18:  "SODIMM_95"        "scl"  output  active-high [used open-drain]
        line  19:  "SODIMM_93"        "sda"   input  active-high [used open-drain]
        line  20:  "SODIMM_14"        "scl"  output  active-high [used open-drain]
        line  21:  "SODIMM_12"        "sda"   input  active-high [used open-drain]
        line  22: "SODIMM_129"       unused   input  active-high
        line  23: "SODIMM_131"       unused   input  active-high
        line  24: "SODIMM_137"       unused   input  active-high
        line  25: "SODIMM_139"       unused   input  active-high
        line  26: "SODIMM_147"       unused   input  active-high
        line  27: "SODIMM_149"       unused   input  active-high
        line  28: "SODIMM_151"       unused   input  active-high
        line  29: "SODIMM_153"       unused   input  active-high

Regards
mvo

Hi, I’m the Toradex AI Assistant.

I might make mistakes. Our support team will step in if needed. If I answered your question, please tick the “Solution” checkbox. For follow-up questions to me, please use @ToradexAI in your post.

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


Hello mvo,

Thank you for your detailed questions regarding the Ivy board LED control and SODIMM pin usage.

1. Is SODIMM 54 multiplexed?

Yes, SODIMM pin 54 is multiplexed. While the schematic for your carrier board may only show a single function being used (for example, as GPIO), the Verdin module datasheet indicates that this pin is capable of multiple functions depending on the SoC’s internal pin multiplexing options. The exact function of SODIMM 54 is determined by the module’s device tree and pad mux configuration, not by the carrier board alone.

For more detailed pinout and muxing info, see the Verdin modules documentation:
Verdin iMX8M Plus Pinout and Functions


2. Why don’t SODIMM 30, 32, 34, and 54 appear in gpioinfo?

These pins are not showing up in gpioinfo because they have not been configured as GPIOs in your device tree overlays. For pins to be available as GPIO in Linux (and therefore visible to gpioinfo), their multiplexer (pad mux/pinmux) setting must select the “GPIO” function, and the pin must be described in your device tree as a usable GPIO.

How to solve this:

  1. Create a Device Tree Overlay to configure SODIMM 30, 32, 34, and 54 for GPIO function.
  2. Deploy and apply the overlay to your system.
  3. Upon reboot, these pins should now show up in gpioinfo as expected.

For step-by-step device tree overlay instructions and examples for configuring these pins, see:
How to Use SODIMM Pins as GPIO on Verdin iMX8M Plus


If you’d like, I can guide you through a basic example of creating a device tree overlay for these pins.
Please let me know if you want more detailed instructions or if you have additional questions!

Best regards,
Toradex AI Assistant.

Hello @ToradexAI

I thought if I use the device tree imx8mp-verdin-wifi-ivy.dts that I can use all peritherals on the board? Or is this a wrong assumption?

I am building my own image, maybe the tcbuild.yml helps:

input:
  easy-installer:
    local: _torizon-docker-verdin-imx8mp-Tezi_7.2.0+build.13.tar

customization:
  splash-screen: logo.png
  filesystem:
     - changes1/
  device-tree:
    include-dirs:
      - device-tree-overlays/overlays/
      - device-tree-overlays/
      - linux-toradex/include/
    custom: linux-toradex/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts
    overlays:
      clear: true
      add:
        - device-tree-overlays/overlays/verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts
  kernel:
    arguments:
      - video=LVDS-1:1280x800M@60,panel_orientation=left_side_up
output:
  easy-installer:
    local: custom_image/_torizon-core-docker-verdin-imx8mp-Tezi_6.8.2+build.30.CUSTOM
    bundle:
      dir: bundle/

Best regards
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Hello mvo,

That’s a great question! Your assumption is reasonable, but there are some important details:

1. What the Default Device Tree Provides

The base device tree file imx8mp-verdin-wifi-ivy.dts does provide the basic hardware configuration for the Ivy carrier board, enabling many of its peripherals according to Toradex’s standard setup (Device Tree Overview). However, not all SODIMM pins are always configured as GPIO by default—some may be assigned to their alternative multiplexed functions (e.g., UART, I2C, PWM, etc.), or may not be enabled at all if their default function is not needed for standard operation.

2. Why Do Some Pins Not Appear as GPIO?

Unless a pin is specifically set to GPIO in the device tree (that is, its IOMUX setting is for “GPIO”), and exposed to the kernel as a named GPIO, it will not appear in gpioinfo. By default, only those pins meant for direct GPIO usage (or not otherwise dedicated for an interface) are exported this way. This is why you may not see SODIMM 30, 32, 34, and 54 in your GPIO list.

3. Do You need to Modify the Device Tree?

If you want to use those SODIMM pins as GPIO, you likely need to:

  • Create a device tree overlay (or modify your base overlay) that sets their mux to GPIO function,
  • Add pinctrl configuration and GPIO nodes referencing those SODIMM pins (case-oriented example),
  • Reference your custom overlay in your tcbuild.yaml as you have with your display overlay.

For simple GPIO enabling, you do not need to replace the entire base device tree; you can use overlays to just enable the pins as GPIO.

4. Example of Overlay for GPIO

Here’s a minimal example for adding SODIMM_54 as a GPIO to your device tree overlay:

/dts-v1/;
/plugin/;

/ {
    fragment@0 {
        target-path = "/";

        __overlay__ {
            &iomuxc {
                pinctrl_my_led_pins: my_led_pins_grp {
                    fsl,pins = <
                        MX8MP_IOMUXC_SOMETHING_HERE 0x104    /* Replace with correct pad for SODIMM_54 */
                    >;
                };
            };
        };
    };

    fragment@1 {
        target = <&gpioX>; // Replace with the right GPIO controller for SODIMM_54
        __overlay__ {
            my_led_gpio {
                gpios = <&gpioX Y GPIO_ACTIVE_HIGH>; // X: controller, Y: GPIO line (see pad mapping)
            };
        };
    };
};

You’ll need to replace the MX8MP_IOMUXC_SOMETHING_HERE and gpioX/Y with the exact pad and controller for SODIMM_54, which you can look up in the Verdin Pinout Designer or SoC Reference Manual.

For compilation and deployment steps, see:


Summary:
The base device tree enables the most common peripherals, but not all SODIMM pins as GPIO by default. Use a device tree overlay to enable any pins you want as GPIO.

Let me know if you’d like help creating a GPIO overlay for your specific SODIMM pins!

Best regards,
Toradex AI Assistant.

Hello @ToradexAI

Thanks for the reply.
I had a look at imx8mp-verdin-wifi-ivy.dts:

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright 2024 Toradex
 */

/dts-v1/;

#include "imx8mp-verdin.dtsi"
#include "imx8mp-verdin-wifi.dtsi"
#include "imx8mp-verdin-ivy.dtsi"

/ {
	model = "Toradex Verdin iMX8M Plus WB on Ivy";
	compatible = "toradex,verdin-imx8mp-wifi-ivy",
		     "toradex,verdin-imx8mp-wifi",
		     "toradex,verdin-imx8mp",
		     "fsl,imx8mp";
};

Line 10 includes the imx8mp-verdin-ivy.dtsi
And in the imx8mp-verdin-ivy.dtsi line 104 - 180:

	leds {
		compatible = "gpio-leds";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_ivy_leds>;

		/* D7 Blue - SODIMM 30 - LEDs.GPIO1 */
		led-0 {
			color = <LED_COLOR_ID_BLUE>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <1>;
			gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>;
		};

		/* D7 Green - SODIMM 32 - LEDs.GPIO2 */
		led-1 {
			color = <LED_COLOR_ID_GREEN>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <1>;
			gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
		};

		/* D7 Red - SODIMM 34 - LEDs.GPIO3 */
		led-2 {
			color = <LED_COLOR_ID_RED>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <1>;
			gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
		};

		/* D8 Blue - SODIMM 36 - LEDs.GPIO4 */
		led-3 {
			color = <LED_COLOR_ID_BLUE>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <2>;
			gpios = <&gpio4 2 GPIO_ACTIVE_HIGH>;
		};

		/* D8 Green - SODIMM 54 - LEDs.GPIO5 */
		led-4 {
			color = <LED_COLOR_ID_GREEN>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <2>;
			gpios = <&gpio3 1 GPIO_ACTIVE_HIGH>;
		};

		/* D8 Red - SODIMM 44 - LEDs.GPIO6 */
		led-5 {
			color = <LED_COLOR_ID_RED>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <2>;
			gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>;
		};

		/* D9 Blue - SODIMM 46 - LEDs.GPIO7 */
		led-6 {
			color = <LED_COLOR_ID_BLUE>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <3>;
			gpios = <&gpio5 01 GPIO_ACTIVE_HIGH>;
		};

		/* D9 Red - SODIMM 48 - LEDs.GPIO8 */
		led-7 {
			color = <LED_COLOR_ID_RED>;
			default-state = "off";
			function = LED_FUNCTION_STATUS;
			function-enumerator = <3>;
			gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
		};
	};

So all LEDs are described in the file. So I dont understand why I need an overlay?

Thank you in advance.

Best regards
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Hello mvo,

You’re absolutely correct: the device tree files you referenced already contain LED definitions for SODIMM 30, 32, 34, 36, 44, 46, 48, and 54. Under normal circumstances, if you are using the standard Torizon image (or any image that includes these device tree files without modifications or conflicting overlays), the LEDs should just work—no extra overlay should be needed.

However, there are a couple of reasons why the LEDs might not be operable from userspace (e.g., missing in /sys/class/leds/ or gpioinfo):

  1. Pin Multiplexing (IOMUXC) Not Matching GPIO Use
    For a GPIO pin to function as intended, its pad must be set to GPIO mode via pinctrl (i.e., proper configuration in the device tree in sections like pinctrl_ivy_leds). If another peripheral (like PWM, I2C, etc.) is assigned to the same pin in another device tree or overlay, there may be a conflict.
    Pin multiplexing configuration details

  2. Conflicting Overlays/Customizations
    If your build includes overlays or modifications that reassign those pins elsewhere or disable them, the base configuration could be overridden.
    Conflicts in device tree overlays

  3. System Not Using Your Expected Device Tree
    If you boot an image but the device tree in use (as reported in /proc/device-tree/model or kernel logs) isn’t your custom or intended one, changes won’t take effect. This can happen due to naming mismatches or misconfigurations in your build system.

What to Check

  • Ensure You Are Booting the Correct Device Tree

    • After booting, check what device tree is actually loaded:
      cat /proc/device-tree/model
      or
      dmesg | grep -i dtb
  • Verify Pinctrl Configuration

    • Make sure that pinctrl_ivy_leds is defined and sets the correct pinmux for all the LED GPIOs.
      Example of pinctrl node
  • Look for Pin Conflicts

    • Check that there is no other peripheral (e.g., UART, PWM) assigned to these SODIMM pins in the device tree and overlays in your build.
  • LED Device Nodes Should Show Up

    • After boot, check for entries in /sys/class/leds/ corresponding to your status LEDs.
    • LEDs configured in the device tree with gpio-leds should show up here.
  • Check gpioinfo Again

    • The gpioinfo utility shows kernel-exported GPIOs, but the names/lines depend on the pinconf and controller mapping. If the device tree is correct, the corresponding GPIO lines should still show (but maybe under generic names if no label is given).

Summary

If you are using the provided device trees and have not added overlays that conflict, you should not need another overlay to use the Ivy board LEDs—they are already set up.

If you are still not seeing the GPIOs or LEDs as expected, it’s very likely to be a pinmux conflict, overlay ordering issue, or the image is not using the device tree you intended. Pin multiplexing, not the lack of a node, is usually the cause.

If you’d like, you can share the pinctrl_ivy_leds definition from your device tree for further review, or I can help you with steps to debug which device tree and pin settings are active at runtime.

Best regards,
Toradex AI Assistant.


Useful resources:

Hello @ToradexAI

here are some information I gathered:
From imx8mp-verdin-ivy.dtsi

	pinctrl_ivy_leds: ivyledsgrp {
		fsl,pins =
			<MX8MP_IOMUXC_SAI5_MCLK__GPIO3_IO25	0x16>, /* SODIMM 30 */
			<MX8MP_IOMUXC_SAI5_RXD1__GPIO3_IO22	0x16>, /* SODIMM 32 */
			<MX8MP_IOMUXC_SAI5_RXFS__GPIO3_IO19	0x16>, /* SODIMM 34 */
			<MX8MP_IOMUXC_SAI1_RXD0__GPIO4_IO02	0x16>, /* SODIMM 36 */
			<MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31	0x16>, /* SODIMM 44 */
			<MX8MP_IOMUXC_SAI3_TXD__GPIO5_IO01	0x16>, /* SODIMM 46 */
			<MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30	0x16>, /* SODIMM 48 */
			<MX8MP_IOMUXC_NAND_CE0_B__GPIO3_IO01	0x16>; /* SODIMM 54 */
	};
cat /proc/device-tree/model
Toradex Verdin iMX8M Plus WB on Ivy

The only overlay I apply is for the display
verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts

Best regards
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Hello mvo,

Thank you for providing the additional details.

Based on your findings:

  • Your device is running with the expected device tree:
    Toradex Verdin iMX8M Plus WB on Ivy
  • The pinctrl_ivy_leds definition in your device tree is correctly mapping the SODIMM pins for the LEDs to GPIO function.
  • Your display overlay should not conflict with these LED pins, since it targets display, not audio or NAND/GPIO pads.

This means your device tree and setup look correct, and you should not need an additional overlay to access these LEDs via GPIO or the LED subsystem.
The LEDs should be available for control both via /sys/class/leds/led-X and with tools like gpioinfo.


What to check next:

  1. Are the ‘led-X’ entries present?
    Run:

    ls /sys/class/leds/
    

    You should see entries like led-0, led-1, … up to led-7.

  2. Test toggling a LED:
    Try:

    echo 1 > /sys/class/leds/led-0/brightness
    sleep 1
    echo 0 > /sys/class/leds/led-0/brightness
    
  3. Missing in /sys/class/leds/?
    If the LEDs do not show up, let’s check for kernel messages regarding GPIO or LED subsystem errors:

    dmesg | grep -i led
    dmesg | grep -i gpio
    

    And check the status of the GPIO controller:

    cat /sys/kernel/debug/gpio
    

If you can share the output of these commands, it will help narrow down whether the LEDs are being registered by Linux or if there’s a runtime issue.

Summary:
Your configuration is correct. If the LEDs aren’t present at runtime, we should check kernel messages and possibly for any overlay or runtime errors.

For reference on customizing and troubleshooting device trees for GPIO/LEDs, see:

Let me know what you find!

Best regards,
Toradex AI Assistant.

Thanks for the reply @ToradexAI

Here are the requested information:

ls /sys/class/leds/

No output!

dmesg | grep -i led
[    0.000000] KASLR disabled due to lack of seed
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000]  Trampoline variant of Tasks RCU enabled.
[    0.000000]  Tracing variant of Tasks RCU enabled.
[    0.000608] printk: console [tty0] enabled
[    1.002151] Serial: 8250/16550 driver, 6 ports, IRQ sharing disabled
[    1.007117] printk: console [ttymxc2] enabled
[    1.049077] ledtrig-cpu: registered to indicate activity on CPUs
[    1.081800] hw perfevents: enabled with armv8_cortex_a53 PMU driver, 7 counters available
[    1.102950] Loading compiled-in X.509 certificates
[    1.579531] imx8mp-pinctrl 30330000.pinctrl: pin MX8MP_IOMUXC_SAI3_TXD already requested by backlight-verdin-dsi; cannot claim for leds
[    1.591822] imx8mp-pinctrl 30330000.pinctrl: pin-115 (leds) status -22
[    1.598380] imx8mp-pinctrl 30330000.pinctrl: could not request pin 115 (MX8MP_IOMUXC_SAI3_TXD) from group ivyledsgrp  on device 30330000.pinctrl
[    1.611356] leds-gpio leds: Error applying setting, reverse things back
[    1.835985] imx-dwmac 30bf0000.ethernet: Enabled L3L4 Flow TC (entries=8)
[    1.835993] imx-dwmac 30bf0000.ethernet: Enabled RFS Flow TC (entries=10)
[    2.076899] [drm:drm_bridge_attach] *ERROR* failed to attach bridge /soc@0/bus@32c00000/mipi_dsi@32e60000 to encoder DSI-34: -517
[    2.088787] imx_sec_dsim_drv 32e60000.mipi_dsi: Failed to attach bridge: 32e60000.mipi_dsi
[    2.097072] imx_sec_dsim_drv 32e60000.mipi_dsi: failed to bind sec dsim bridge: -517
[    4.986228] systemd-journald[406]: Collecting audit messages is disabled.
[    6.760570] Hot alarm is canceled. GPU3D clock will return to 64/64
[    7.122560] imx-bus-devfreq 32700000.interconnect: failed to fetch clk: -2
[    7.136170] imx-bus-devfreq: probe of 32700000.interconnect failed with error -2
[    7.375441] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    9.452350] pcieport 0000:00:00.0: AER: enabled with IRQ 229
[   34.092406] br-60d3bdffc845: port 1(vethdf2f7a9) entered disabled state
[   34.094499] br-60d3bdffc845: port 1(vethdf2f7a9) entered disabled state
[   35.174689] weston[1135]: memfd_create() called without MFD_EXEC or MFD_NOEXEC_SEAL set
[   43.113382] br-60d3bdffc845: port 2(vethea41ba1) entered disabled state
[  147.256973] br-60d3bdffc845: port 2(vethea41ba1) entered disabled state
[  147.439470] br-60d3bdffc845: port 2(vethea41ba1) entered disabled state
[  147.441617] br-60d3bdffc845: port 2(vethea41ba1) entered disabled state
[  147.647488] br-60d3bdffc845: port 2(vethca5812a) entered disabled state
[  148.285991] br-60d3bdffc845: port 2(vethca5812a) entered disabled state
[  262.350049] docker0: port 1(veth0e37dac) entered disabled state
[  449.785869] br-60d3bdffc845: port 2(vethca5812a) entered disabled state
[  449.940311] br-60d3bdffc845: port 2(vethca5812a) entered disabled state
[  449.943617] br-60d3bdffc845: port 2(vethca5812a) entered disabled state
[  450.239273] br-60d3bdffc845: port 2(veth6383532) entered disabled state
[  450.858168] br-60d3bdffc845: port 2(veth6383532) entered disabled state
[ 1573.062732] br-60d3bdffc845: port 2(veth6383532) entered disabled state
[ 1573.236339] br-60d3bdffc845: port 2(veth6383532) entered disabled state
[ 1573.238111] br-60d3bdffc845: port 2(veth6383532) entered disabled state
[ 1573.433867] br-60d3bdffc845: port 2(veth436ecb0) entered disabled state
[ 1574.180633] br-60d3bdffc845: port 2(veth436ecb0) entered disabled state
[ 1753.946497] br-60d3bdffc845: port 2(veth436ecb0) entered disabled state
[ 1754.109666] br-60d3bdffc845: port 2(veth436ecb0) entered disabled state
[ 1754.111937] br-60d3bdffc845: port 2(veth436ecb0) entered disabled state
[ 1754.290669] br-60d3bdffc845: port 2(vethcfb86d0) entered disabled state
[ 1755.055151] br-60d3bdffc845: port 2(vethcfb86d0) entered disabled state
[ 2678.778910] br-60d3bdffc845: port 2(vethcfb86d0) entered disabled state
[ 2678.984003] br-60d3bdffc845: port 2(vethcfb86d0) entered disabled state
[ 2678.985858] br-60d3bdffc845: port 2(vethcfb86d0) entered disabled state
[ 2689.207168] br-60d3bdffc845: port 2(vetha65b23c) entered disabled state
dmesg | grep -i gpio
[    0.050120] /soc@0/bus@30000000/pinctrl@30330000: Fixed dependency cycle(s) with /soc@0/bus@30000000/pinctrl@30330000/gpio3grp
[    0.050139] /soc@0/bus@30000000/pinctrl@30330000: Fixed dependency cycle(s) with /soc@0/bus@30000000/pinctrl@30330000/gpio2grp
[    1.122303] gpio gpiochip0: Static allocation of GPIO base is deprecated, use dynamic allocation.
[    1.123759] gpio gpiochip1: Static allocation of GPIO base is deprecated, use dynamic allocation.
[    1.125504] gpio gpiochip2: Static allocation of GPIO base is deprecated, use dynamic allocation.
[    1.126874] gpio gpiochip3: Static allocation of GPIO base is deprecated, use dynamic allocation.
[    1.128289] gpio gpiochip4: Static allocation of GPIO base is deprecated, use dynamic allocation.
[    1.131930] i2c i2c-0: using pinctrl states for GPIO recovery
[    1.139287] i2c i2c-1: using pinctrl states for GPIO recovery
[    1.141234] i2c i2c-2: using pinctrl states for GPIO recovery
[    1.143735] i2c i2c-3: using pinctrl states for GPIO recovery
[    1.580391] sdhci-esdhc-imx 30b50000.mmc: Got CD GPIO
[    1.611356] leds-gpio leds: Error applying setting, reverse things back
[    1.621782] input: gpio-keys as /devices/platform/gpio-keys/input/input1
[    6.705497] gpio-mux mux-controller-0: 2-way mux-controller registered
[    6.714418] gpio-mux mux-controller-1: 2-way mux-controller registered
 sudo cat /sys/kernel/debug/gpio
Password:
gpiochip0: GPIOs 0-31, parent: platform/30200000.gpio, 30200000.gpio:
 gpio-0   (                    |spi1 CS1            ) out hi ACTIVE LOW
 gpio-1   (GPIO2               )
 gpio-5   (GPIO3               )
 gpio-6   (                    |spi1 CS2            ) out hi ACTIVE LOW
 gpio-7   (                    |mux                 ) out lo
 gpio-8   (                    |mux                 ) out lo
 gpio-12  (                    |regulator-usb1-vbus ) out lo
 gpio-14  (                    |regulator-usb2-vbus ) out hi

gpiochip1: GPIOs 32-63, parent: platform/30210000.gpio, 30210000.gpio:
 gpio-38  (SODIMM_143          )
 gpio-39  (SODIMM_141          )
 gpio-42  (SODIMM_161          |id                  ) in  hi
 gpio-43  (                    |regulator-wifi-en   ) out hi
 gpio-44  (SODIMM_84           |cd                  ) in  hi ACTIVE LOW
 gpio-45  (SODIMM_78           )
 gpio-46  (SODIMM_74           )
 gpio-47  (SODIMM_80           )
 gpio-48  (SODIMM_82           )
 gpio-49  (SODIMM_70           )
 gpio-50  (SODIMM_72           )
 gpio-52  (                    |regulator-module-eth) out hi

gpiochip2: GPIOs 64-95, parent: platform/30220000.gpio, 30220000.gpio:
 gpio-70  (DIG_1               )
 gpio-71  (DIG_2               )
 gpio-72  (REL1                )
 gpio-73  (REL2                )
 gpio-78  (REL4                )
 gpio-80  (REL3                )

gpiochip3: GPIOs 96-127, parent: platform/30230000.gpio, 30230000.gpio:
 gpio-96  (SODIMM_252          |Wake-Up             ) in  hi ACTIVE LOW
 gpio-97  (SODIMM_222          )
 gpio-98  (SODIMM_36           )
 gpio-99  (SODIMM_220          )
 gpio-100 (SODIMM_193          )
 gpio-101 (SODIMM_191          )
 gpio-102 (SODIMM_201          )
 gpio-103 (SODIMM_203          )
 gpio-104 (SODIMM_205          )
 gpio-105 (SODIMM_207          )
 gpio-106 (SODIMM_199          )
 gpio-107 (SODIMM_197          )
 gpio-108 (SODIMM_221          )
 gpio-109 (SODIMM_219          )
 gpio-110 (SODIMM_217          )
 gpio-111 (SODIMM_215          )
 gpio-112 (SODIMM_211          )
 gpio-113 (SODIMM_213          )
 gpio-114 (SODIMM_189          )
 gpio-115 (SODIMM_244          |PCIe reset          ) out hi
 gpio-116 (SODIMM_38           )
 gpio-118 (SODIMM_76           |regulator-usdhc2    ) out lo
 gpio-119 (SODIMM_135          )
 gpio-120 (SODIMM_133          )
 gpio-121 (SODIMM_17           )
 gpio-122 (SODIMM_24           )
 gpio-123 (SODIMM_26           )
 gpio-124 (SODIMM_21           |enable              ) out hi
 gpio-125 (SODIMM_256          |regulator-force-slee) out hi
 gpio-126 (SODIMM_48           )
 gpio-127 (SODIMM_44           )

gpiochip4: GPIOs 128-159, parent: platform/30240000.gpio, 30240000.gpio:
 gpio-128 (SODIMM_42           |reset               ) out hi ACTIVE LOW
 gpio-129 (SODIMM_46           |enable              ) out hi
 gpio-130 (SODIMM_187          )
 gpio-131 (SODIMM_20           )
 gpio-132 (SODIMM_22           )
 gpio-133 (SODIMM_15           )
 gpio-134 (SODIMM_196          )
 gpio-135 (SODIMM_200          )
 gpio-136 (SODIMM_198          )
 gpio-137 (SODIMM_202          |spi1 CS0            ) out hi ACTIVE LOW
 gpio-142 (                    |scl                 ) out lo
 gpio-143 (                    |sda                 ) in  lo
 gpio-144 (SODIMM_55           |scl                 ) out lo
 gpio-145 (SODIMM_53           |sda                 ) in  lo
 gpio-146 (SODIMM_95           |scl                 ) out lo
 gpio-147 (SODIMM_93           |sda                 ) in  lo
 gpio-148 (SODIMM_14           |scl                 ) out lo
 gpio-149 (SODIMM_12           |sda                 ) in  lo
 gpio-150 (SODIMM_129          )
 gpio-151 (SODIMM_131          )
 gpio-152 (SODIMM_137          )
 gpio-153 (SODIMM_139          )
 gpio-154 (SODIMM_147          )
 gpio-155 (SODIMM_149          )
 gpio-156 (SODIMM_151          )
 gpio-157 (SODIMM_153          )

Best regards
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Thank you for providing the detailed logs and debug output.

Your dmesg log makes the root cause clear. This section is key:

[    1.579531] imx8mp-pinctrl 30330000.pinctrl: pin MX8MP_IOMUXC_SAI3_TXD already requested by backlight-verdin-dsi; cannot claim for leds
[    1.591822] imx8mp-pinctrl 30330000.pinctrl: pin-115 (leds) status -22
[    1.598380] imx8mp-pinctrl 30330000.pinctrl: could not request pin 115 (MX8MP_IOMUXC_SAI3_TXD) from group ivyledsgrp on device 30330000.pinctrl
[    1.611356] leds-gpio leds: Error applying setting, reverse things back

What’s happening?

  • There is a pin conflict between your LED group (ivyledsgrp) and the display backlight configuration from your overlay (verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts).
  • Both try to use the MX8MP_IOMUXC_SAI3_TXD pad, which corresponds to SODIMM 46 (LED D9 Blue).

This conflict causes the entire LED group to fail being registered by the kernel, so none of the LEDs appear in /sys/class/leds/.


How to resolve

You need to ensure that each function uses a unique pad:

Option 1: Change the backlight pin in your display overlay

  • Open verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts.
  • Find the backlight pin configuration and assign it to a different, non-conflicting pad (not any of SODIMM 30, 32, 34, 36, 44, 46, 48, or 54).
  • Rebuild and flash the device tree overlays.

Option 2: Disable/conflict SODIMM 46 LED

  • If it is more important to keep backlight control, you can comment out the SODIMM 46 (D9 Blue) entry in both the LED device tree and the ivyledsgrp pin group.

Option 3: Move one function to another SODIMM pin

  • If your hardware design allows, remap either the LED or backlight function to a different free SODIMM pad and update the device tree accordingly.

You can use the following guides for reference:


Next Steps

  1. Check the display DSI overlay for its backlight/pwm/gpio config.
  2. Assign either the display backlight or the LED to a different available pad.
  3. Rebuild and reflash your device tree.
  4. After reboot, check that your LEDs are present in /sys/class/leds/.

Would you like help with the exact changes in the display overlay or specific pin recommendations based on your board’s available SODIMM pins?

Best regards,
Toradex AI Assistant.

Thanks for the reply @ToradexAI

It would be ok for me to not use the blue chanel from LED 9, but I would like to use the other LEDs. Here is the backlight part from the display overlay:

&{/} {
        backlight_verdin_dsi: backlight-verdin-dsi {
                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 */
                enable-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
                /* Verdin PWM_3_DSI */
                pwms = <&pwm3 0 6666667 0>;
        };
};

Best regards
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Thank you for providing the backlight overlay section.

Your backlight configuration uses enable-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>; which is SODIMM 46, the same as the D9 Blue LED (as you’ve already realized). That’s why the kernel is preventing both drivers from claiming this pin.

To achieve your goal (keep all other LEDs functional and only give up D9 Blue), you need to:

  1. Remove SODIMM 46 from the LED group in your device tree.
  2. Remove the D9 Blue entry from the leds node.

Here’s how you can do it:

1. Device Tree Changes

Edit your imx8mp-verdin-ivy.dtsi:

  • Remove this entry from pinctrl_ivy_leds:

    <MX8MP_IOMUXC_SAI3_TXD__GPIO5_IO01 0x16>, /* SODIMM 46 */
    
  • Remove the corresponding LED node for D9 Blue:

    /* D9 Blue - SODIMM 46 - LEDs.GPIO7 */
    led-6 {
        color = <LED_COLOR_ID_BLUE>;
        default-state = "off";
        function = LED_FUNCTION_STATUS;
        function-enumerator = <3>;
        gpios = <&gpio5 01 GPIO_ACTIVE_HIGH>;
    };
    

All other LED entries and their corresponding pins can remain as-is.

2. Rebuild & Redeploy

  • Rebuild your custom device tree or overlays and deploy to your board.
  • Reboot.

3. Test

  • After rebooting, ls /sys/class/leds/ should show all other LEDs except D9 Blue.
  • You should now be able to control your remaining LEDs, and the display backlight will function as well.

Reference

See:

Let me know if you want an example patch or additional instructions for rebuilding!

Best regards,
Toradex AI Assistant.

Thanks for the reply @ToradexAI

I will try this solution.

I have some questions regarding the LEDs and the backlight:

  1. Why do two LEDs (SODIMM 36 and 44) work? Shouldn’t none of them work?
  2. Why is the backlight from the devicetree claiming for pin 46? In the schematics it is connected to SODIMM 21 (DSI_BKL_EN) and SODIMMM 19 (PWM_3_DSI)

Best regards
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Hello mvo,

Great questions—let’s clarify both points:

  1. Why do SODIMM 36 and 44 LEDs work if there is a pin conflict?

    When the Linux kernel initializes a GPIO group and finds a conflict on one pin (here, SODIMM 46), it will fail only for that specific pin. Non-conflicting pins from the same group—like SODIMM 36 and 44—are still properly configured, unless the entire group/pinmux fails to apply due to a broader error (which isn’t the case here). Practically, only LED(s) sharing the conflict will not work or appear, while others remain functional.
    See an example & explanation here.

  2. Why is the backlight claiming SODIMM 46, when the schematic shows SODIMM 21 and 19?

    Good catch! Per your schematic, the backlight enable should be on SODIMM 21 (DSI_BKL_EN: GPIO4_IO28) and its PWM on SODIMM 19 (PWM_3_DSI: PWM3). If your overlay is using SODIMM 46 (enable-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;), this means the overlay is currently set up with the wrong pin assignments.
    To fix this and align with your hardware, update your backlight configuration like so:

    // SODIMM 21 (DSI_BKL_EN)
    enable-gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;
    // SODIMM 19 (PWM_3_DSI)
    pwms = <&pwm3 0 6666667 0>;
    pinctrl-0 = <&pinctrl_dsi_bkl_en>;
    

    And ensure that pinctrl_dsi_bkl_en refers to the correct pad for SODIMM 21.

    Review and update your display overlay’s backlight section to match your schematics. This will prevent the SODIMM 46 pin conflict and allow all relevant LEDs to function if not otherwise blocked.

To summarize:

  • LEDs with no pin conflict will still work.
  • Backlight should use SODIMM 21 and 19 according to your schematic; update the device tree overlay to match.

Would you like assistance preparing the correct device tree overlay fragment for your backlight configuration?

Best regards,
Toradex AI Assistant.


Relevant links:
Example LED pin conflict explanation
How to write and deploy device tree overlays

@ToradexAI

Yes, assistance for generating the device tree would be nice. I tried myself but i get the following error:

torizoncore-builder build
Building image as per configuration file 'tcbuild.yaml'...

=>> Handling input section
Unpacking Toradex Easy Installer image.
Unpacking TorizonCore Toradex Easy Installer image.
Importing OSTree revision 789c47c5e2f5cd8d1aa177ed9db1da6ae097ea69188980e51bf534e463966269 from local repository...
1271 metadata, 9767 content objects imported; 650.0 MB content written
0 metadata, 0 content objects imported; 0 bytes content written
Unpacked OSTree from Toradex Easy Installer image:
  Commit checksum: 789c47c5e2f5cd8d1aa177ed9db1da6ae097ea69188980e51bf534e463966269
  TorizonCore Version: 7.2.0+build.13

=>> Handling customization section

=> Setting splash screen
splash screen merged to initramfs

=> Handling device-tree subsection

=> Selecting custom device-tree 'linux-toradex/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts'
'imx8mp-verdin-wifi-ivy.dts' compiles successfully.
warning: removing currently applied device tree overlays
Device tree imx8mp-verdin-wifi-ivy.dtb successfully applied.

=> Adding device-tree overlay 'device-tree-overlays/overlays/verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts'
'verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts' compiles successfully.

Failed to apply '/tmp/tmpf7c2gyxn': FDT_ERR_NOTFOUND

error: cannot apply device tree overlays ['/tmp/tmpf7c2gyxn'] against device tree /storage/dt/usr/lib/modules/6.6.84-7.2.0-g87bfb710b6f1/dtb/imx8mp-verdin-wifi-ivy.dtb.
error: overlay 'device-tree-overlays/overlays/verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts' is not applicable.

Best regards
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Hello mvo,

You’re seeing the error FDT_ERR_NOTFOUND because your overlay references nodes or labels that do not exist or are mismatched in the base device tree. This is a common issue when updating pinmux or GPIO references—especially after changing pin assignments.

Let’s generate a minimal overlay to enable the DSI backlight according to your board schematic (SODIMM 21 for enable, SODIMM 19 for PWM) and avoid conflicts with the LED group. Below is a template to help ensure it matches the expected nodes and works with the Verdin iMX8M Plus on Ivy:


1. Device Tree Overlay Example

/dts-v1/;
/plugin/;

&iomuxc {
    pinctrl_dsi_bkl_en: dsi_bkl_en_grp {
        fsl,pins = <
            MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO28   0x16    /* SODIMM 21 */
        >;
    };
};

&pwm3 {
    status = "okay";
};

&{/} {
    backlight_verdin_dsi: backlight-verdin-dsi {
        compatible = "pwm-backlight";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dsi_bkl_en>;
        brightness-levels = <0 45 63 88 119 158 203 255>;
        default-brightness-level = <4>;
        enable-gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;    /* SODIMM 21 */
        pwms = <&pwm3 0 6666667 0>;                     /* SODIMM 19 */
    };
};

2. Usage Tips

  • This overlay:
    • Sets up the pinmux for SODIMM 21 as GPIO (backlight enable)
    • Enables PWM3 for SODIMM 19
    • Declares the backlight node in the root, as commonly used on Ivy/Dahlia
    • Avoids SODIMM 46 entirely (no pin conflict with your LEDs)

Refer to the Device Tree Overlay documentation for more tips.


3. tcbuild.yaml Example Integration

Keep your overlays list like this (order matters especially if multiple overlays affect the same nodes):

customization:
  device-tree:
    include-dirs:
      - device-tree-overlays/overlays/
      - device-tree-overlays/
      - linux-toradex/include/
    custom: linux-toradex/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts
    overlays:
      clear: true
      add:
        - verdin-imx8mp_backlight_overlay.dts     # <- your new backlight overlay
        - device-tree-overlays/overlays/verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts

If you added backlight support directly as above, you no longer need the backlight block in your previous panel-cap-touch-10inch-dsi overlay unless you have other panel-specific settings there.


4. Overlay Application Fails (FDT_ERR_NOTFOUND)?

  • Nodes or labels such as pinctrl_i2s_2_d_out_dsi_1_bkl_en may not exist in the base tree.
  • Ensure you reference only nodes that exist or that you define in the overlay.
  • Match the fsl,pins macros to your SoM’s pin mapping.

For a full device tree reference, see:
Verdin iMX8M Plus Device Tree Documentation


Summary:

  • Use the overlay above for SODIMM 21/19 backlight.
  • Do not reference any removed/renamed GPIOs in overlays.
  • Place your overlay before others in tcbuild.yaml.
  • If the error persists, check your overlay’s pin names and node references against the base device tree and documentation.

Let me know if you want a ready-to-copy overlay file or further step-by-step guidance.

Best regards,
Toradex AI Assistant.


Relevant docs:

Hello @ToradexAI

Thanks for the response. I tried your solution but I get the following error:

torizoncore-builder build
Building image as per configuration file 'tcbuild.yaml'...

=>> Handling input section
Unpacking Toradex Easy Installer image.
Unpacking TorizonCore Toradex Easy Installer image.
Importing OSTree revision 789c47c5e2f5cd8d1aa177ed9db1da6ae097ea69188980e51bf534e463966269 from local repository...
1271 metadata, 9767 content objects imported; 650.0 MB content written
0 metadata, 0 content objects imported; 0 bytes content written
Unpacked OSTree from Toradex Easy Installer image:
  Commit checksum: 789c47c5e2f5cd8d1aa177ed9db1da6ae097ea69188980e51bf534e463966269
  TorizonCore Version: 7.2.0+build.13

=>> Handling customization section

=> Setting splash screen
splash screen merged to initramfs

=> Handling device-tree subsection

=> Selecting custom device-tree 'linux-toradex/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts'
'imx8mp-verdin-wifi-ivy.dts' compiles successfully.
warning: removing currently applied device tree overlays
Device tree imx8mp-verdin-wifi-ivy.dtb successfully applied.

=> Adding device-tree overlay 'verdin-imx8mp_backlight_overlay.dts'
Error: verdin-imx8mp_backlight_overlay.dts:7.13-14 syntax error
FATAL ERROR: Unable to parse input tree
error: cannot apply verdin-imx8mp_backlight_overlay.dts.

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Hello mvo,

Thank you for sharing the detailed error. This problem is caused by a small but common syntax error in the device tree overlay: most likely, a misplaced or missing fragment and/or bad brace, or incorrect usage of label references.

Below is a corrected overlay for controlling DSI backlight via SODIMM 21/GPIO4_IO28 and PWM3/SODIMM 19. This matches the device tree overlay syntax expected by TorizonCore, including the use of fragment sections and the /plugin/; directive. Each hardware modification must be wrapped in its own fragment.

Correct overlay example:

/dts-v1/;
/plugin/;

/ {
    fragment@0 {
        target = <&iomuxc>;
        __overlay__ {
            pinctrl_dsi_bkl_en: dsi_bkl_en_grp {
                fsl,pins = <
                    MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO28   0x16    /* SODIMM 21, DSI_BKL_EN */
                >;
            };
        };
    };
};

fragment@1 {
    target = <&pwm3>;
    __overlay__ {
        status = "okay";
    };
};

fragment@2 {
    target-path = "/";
    __overlay__ {
        backlight_verdin_dsi: backlight-verdin-dsi {
            compatible = "pwm-backlight";
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_dsi_bkl_en>;
            brightness-levels = <0 45 63 88 119 158 203 255>;
            default-brightness-level = <4>;
            enable-gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;    /* SODIMM 21 */
            pwms = <&pwm3 0 6666667 0>;                     /* SODIMM 19 (PWM3) */
        };
    };
};

Instructions:

  • Replace your current verdin-imx8mp_backlight_overlay.dts with the above code.
  • Make sure you remove any conflicting pinmux references or custom definitions from other overlays.
  • Run torizoncore-builder build again.

Additional help:

If you still receive errors, please copy the exact contents of your overlay file and the exact error line indicated.

Best regards,
Toradex AI Assistant.

@ToradexAI

I still get the same error. Maybe it helps if I post the overlays:
tcbuild.yaml

easy-installer:
  local: _torizon-docker-verdin-imx8mp-Tezi_7.2.0+build.13.tar
customization:
  splash-screen: logo.png
  filesystem:
    - changes1/
  device-tree:
    include-dirs:
      - device-tree-overlays/overlays/
      - device-tree-overlays/
      - linux-toradex/include/
    custom: linux-toradex/arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi-ivy.dts
    overlays:
      clear: true
      add:
        - verdin-imx8mp_backlight_overlay.dts
        - device-tree-overlays/overlays/verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts
  kernel:
    arguments:
      - video=LVDS-1:1280x800M@60,panel_orientation=left_side_up
output:
  easy-installer:
    local: custom_image/_torizon-core-docker-verdin-imx8mp-Tezi_6.8.2+build.30.CUSTOM
    bundle:
      dir: bundle/

verdin-imx8mp_backlight_overlay.dts

/dts-v1/;
/plugin/;

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

&iomuxc {
    pinctrl_dsi_bkl_en: dsi_bkl_en_grp {
        /* Pin (physikalischer MUX-Offset 0x5C0, Konfig 0x16) */
        fsl,pins = <0x5c0 0x16>;  /* entspricht SAI2_RXFS->GPIO4_IO28 */
    };
};

&pwm3 {
    status = "okay";
};

&{/} {
    backlight: backlight-verdin-dsi {
        compatible = "pwm-backlight";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dsi_bkl_en>;
        enable-gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;
        pwms = <&pwm3 0 6666667 0>;
    };
};

imx8mp-verdin-wifi-ivy.dts

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright 2024 Toradex
 */

/dts-v1/;

#include "imx8mp-verdin.dtsi"
#include "imx8mp-verdin-wifi.dtsi"
#include "imx8mp-verdin-ivy.dtsi"

/ {
        model = "Toradex Verdin iMX8M Plus WB on Ivy";
        compatible = "toradex,verdin-imx8mp-wifi-ivy",
                     "toradex,verdin-imx8mp-wifi",
                     "toradex,verdin-imx8mp",
                     "fsl,imx8mp";
};

verdin-imx8mp_panel-cap-touch-10inch-dsi_overlay.dts

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright 2023 Toradex
 */

// Verdin with connected Capacitive Touch Display 10.1" DSI.

/dts-v1/;
/plugin/;

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

#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/gpio/gpio.h>
#include "display-rvt101hvdwc00b_overlay.dtsi"
/*
*&{/} {
*	backlight_verdin_dsi: backlight-verdin-dsi {
*		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 */
*		enable-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
*		/* Verdin PWM_3_DSI */
*		pwms = <&pwm3 0 6666667 0>;
*	};
*};
*/
&gpu_2d {
	status = "okay";
};

&gpu_3d {
	status = "okay";
};

/* Verdin I2C_2_DSI */
&i2c2 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	bridge@2c {
		compatible = "ti,sn65dsi83";
		reg = <0x2c>;
		/* IRQ not connected */
		/* Verdin GPIO_10_DSI (SODIMM 21) */
		enable-gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_gpio_10_dsi>;

		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;

				dsi_riv_in: endpoint {
					data-lanes = <1 2 3 4>;
					remote-endpoint = <&mipi_dsi_bridge2_out>;
				};
			};

			port@2 {
				reg = <2>;

				lvds_out_panel_riv: endpoint {
					remote-endpoint = <&panel_rvt101hvdwc00b_in>;
				};
			};
		};
	};

	touch@41 {
		compatible = "ilitek,ili2132";
		reg = <0x41>;
		/* Verdin DSI_1_INT# (TOUCH_INT#, SODIMM 17) */
		interrupt-parent = <&gpio4>;
		interrupts = <25 IRQ_TYPE_EDGE_RISING>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_gpio_9_dsi>, <&pinctrl_i2s_2_bclk_touch_reset>;
		/* Verdin I2S_2_BCLK (TOUCH_RESET#, SODIMM 42) */
		reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
	};
};

/* LCDIF to MIPI-DSI */
&lcdif1 {
	status = "okay";
};

&mipi_dsi {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	port@1 {
		mipi_dsi_bridge2_out: endpoint {
			attach-bridge;
			remote-endpoint = <&dsi_riv_in>;
		};
	};
};

&mix_gpu_ml {
	status = "okay";
};

&ml_vipsi {
	status = "okay";
};

&panel_rvt101hvdwc00b {
	backlight = <&backlight_verdin_dsi>;

	port {
		panel_rvt101hvdwc00b_in: endpoint {
			remote-endpoint = <&lvds_out_panel_riv>;
		};
	};
};

/* Verdin PWM_3_DSI */
&pwm3 {
	status = "okay";
};

Best regards,
mvo

Thanks for your response.

Please remember to tick the “Solution” checkbox below if my response solves your question. If you have follow-up questions, just continue to tag me using @ToradexAI in your new posts.

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


Thank you for sharing your files. Your error is caused by this section in your verdin-imx8mp_backlight_overlay.dts:

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

This is invalid syntax—& is NOT a valid label in either a base device tree or overlay. When placing root node content in an overlay, just use / { ... }; (which you already do for backlight). Do not try to “overlay” the root node via & { ... };.

Quick fix:

  • Remove this block from your overlay:
& {
    compatible = "toradex,verdin-imx8mp";
};

It serves no purpose in your overlay and is the cause of your parsing failure.


Cleaned-up overlay (ready-to-use):

/dts-v1/;
/plugin/;

&iomuxc {
    pinctrl_dsi_bkl_en: dsi_bkl_en_grp {
        fsl,pins = <
            MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO28 0x16    /* SODIMM 21, DSI_BKL_EN */
        >;
    };
};

&pwm3 {
    status = "okay";
};

&{/} {
    backlight_verdin_dsi: backlight-verdin-dsi {
        compatible = "pwm-backlight";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_dsi_bkl_en>;
        enable-gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;     /* SODIMM 21 */
        pwms = <&pwm3 0 6666667 0>;                      /* SODIMM 19 (PWM3) */
        brightness-levels = <0 45 63 88 119 158 203 255>;
        default-brightness-level = <4>;
    };
};

Additional Notes:

  • Your tcbuild.yaml, device-tree, and overlay order look correct.
  • The rest of your overlays look fine and should not interfere.

References:


Try applying this overlay after you remove the erroneous block, and the build error should go away.

Best regards,
Toradex AI Assistant.