How do I combine dtsi and dts data of same sort?

I am trying to use the basic family device data in the dtsi file and fill it up with more device unique data in the dts file.
But I either end up in build syntax error if I use some kind of '&' symbol or compile a image that doesn't have any leds or keys at all.

It feels I have tried all combinations of code I can find in the target folder but I got stuck on this one.

Is it even possible to have split config data, the problem seems to be connected to everything in the first block in the dts file? Like basic leds and keys data in the dtsi and add on a little more in the dts or do I need to have everything int the dts?

dtsi:

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

#include "rtl838x.dtsi"

#include <dt-bindings/input/input.h>
#include <dt-bindings/gpio/gpio.h>

/ {
	aliases {
		led-boot = &led_power;
		led-failsafe = &led_power;
		led-running = &led_power;
		led-upgrade = &led_power;
	};

	memory@0 {
		device_type = "memory";
		reg = <0x0 0x8000000>;
	};

	leds {
		pinctrl-names = "default";
		pinctrl-0 = <&pinmux_disable_sys_led>;

		compatible = "gpio-leds";

		led_power: power {
			label = "green:power";
			gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
		};
	};
	
	gpio-restart {
		status = "disabled";
		compatible = "gpio-restart";
		gpios = <&gpio1 34 GPIO_ACTIVE_LOW>;
		open-source;
	};
	
	keys {
		status = "disabled";
		compatible = "gpio-keys-polled";
		poll-interval = <20>;

		reset {
			label = "reset";
			gpios = <&gpio1 33 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RESTART>;
		};
	};

	gpio1: rtl8231-gpio {
		status = "disabled";
		compatible = "realtek,rtl8231-gpio";
		#gpio-cells = <2>;
		gpio-controller;
		indirect-access-bus-id = <0>;
	};
};

&gpio0 {
	indirect-access-bus-id = <0>;
};

&spi0 {
	status = "okay";
	flash@0 {
		compatible = "jedec,spi-nor";
		reg = <0>;
		spi-max-frequency = <10000000>;

		partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;

			partition@0 {
				label = "u-boot";
				reg = <0x00000000 0x80000>;
				read-only;
			};
			partition@80000 {
				label = "u-boot-env";
				reg = <0x00080000 0x40000>;
				read-only;
			};
			partition@c0000 {
				label = "board-name";
				reg = <0x000c0000 0x40000>;
			};
			partition@280000 {
				label = "firmware";
				compatible = "denx,uimage";
				reg = <0x00100000 0xd80000>;
			};
			partition@be80000 {
				label = "kernel2";
				reg = <0x00e80000 0x180000>;
			};
			partition@1000000 {
				label = "sysinfo";
				reg = <0x01000000 0x40000>;
			};
			partition@1040000 {
				label = "rootfs2";
				reg = <0x01040000 0xc00000>;
			};
			partition@1c40000 {
				label = "jffs2";
				reg = <0x01c40000 0x3c0000>;
			};
		};
	};
};

dts (this morning latest attempt wich gave another syntax error on &leds {:

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

#include "rtl838x_d-link_dgs-1210.dtsi"

/ {
	compatible = "d-link,dgs-1210-10mp", "realtek,rtl838x-soc";
	model = "D-Link DGS-1210-10MP";
}

&leds {
    poe_max {
		label = "yellow:poe_max";
		gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
	};

    link_act {
		label = "green:link_act";
		gpios = <&gpio1 28 GPIO_ACTIVE_LOW>;
	};

	poe {
		label = "green:poe";
		gpios = <&gpio1 29 GPIO_ACTIVE_LOW>;
	};
};

&gpio-restart {
	status = "okay";
};

&keys {
    // mode key <KEY_LIGHTS_TOGGLE> doesn't have any code to it but the gpio pin is verified.
	mode {
		label = "mode";
		gpios = <&gpio1 30 GPIO_ACTIVE_LOW>;
		linux,code = <KEY_LIGHTS_TOGGLE>;
	};
};

&gpio1 {
		status = "okay";
};


&uart1 {
	status = "okay";
};

&ethernet0 {
	mdio: mdio-bus {
		compatible = "realtek,rtl838x-mdio";
		regmap = <&ethernet0>;
		#address-cells = <1>;
		#size-cells = <0>;

		INTERNAL_PHY(8)
		INTERNAL_PHY(9)
		INTERNAL_PHY(10)
		INTERNAL_PHY(11)
		INTERNAL_PHY(12)
		INTERNAL_PHY(13)
		INTERNAL_PHY(14)
		INTERNAL_PHY(15)
		INTERNAL_PHY(24)
		INTERNAL_PHY(26)
	};
};

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

		SWITCH_PORT(8, 1, internal)
		SWITCH_PORT(9, 2, internal)
		SWITCH_PORT(10, 3, internal)
		SWITCH_PORT(11, 4, internal)
		SWITCH_PORT(12, 5, internal)
		SWITCH_PORT(13, 6, internal)
		SWITCH_PORT(14, 7, internal)
		SWITCH_PORT(15, 8, internal)
		SWITCH_SFP_PORT(24, 9, rgmii-id)
		SWITCH_SFP_PORT(26, 10, rgmii-id)

		port@28 {
			ethernet = <&ethernet0>;
			reg = <28>;
			phy-mode = "internal";
			fixed-link {
				speed = <1000>;
				full-duplex;
			};
		};
	};
};

The problem seems to be that gpio1 isn’t a SoC hardware but a add-on. And then it can’t really be turned on/off by status. And then leds based both on gpio0 and gpio1 can’t be combined in dts.

Do I move power-led from dtsi to dts then aliases fails, if I have power-led in both dtsi and dts then the build fails because of dual power led. And if I have the gpio1 leds in dts all non poe switched fail because they don’t have those leds.

in dtsi:

leds { -> leds: leds {
keys { -> keys: keys {

2 Likes

Do anyone know if I can see anywhere the “big master dts” end result the builder does with all the dtsi and dts files that are supposed to be included in the build?

Yes, you can.
It is a build artefact, and you can see the compiled DTS blob in your build system, and you can also expand it to cleartext.

see "dtc" host tool.

If I remember right, the blob is somewhere in the staging_dir. (EDIT: actually build_dir, see next message for example)

Note that the compiled dts blob does not contains label texts.

You can also see the DTS items in the running system in /proc (?).

(I am not at my PC, so I can't give you any concrete examples)

EDIT2:

root@router1:~# ls /proc/device-tree/
#address-cells    compatible        interrupt-parent  model             sfpb-mutex
#size-cells       cpu-pmu           keys              name              smem
aliases           cpus              leds              opp_table0        soc
chosen            fab-scaling       memory            opp_table_l2      thermal-zones
clocks            firmware          memory@0          reserved-memory
2 Likes
user@hostname:/openwrt/user/git/musashino-build/openwrt$ ls -alh build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/*.dtb                                                                                                                                      -rw-r--r-- 1 user group 7.8K Jul 24 12:12 build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/image-rtl8380_engenius_ews2910p.dtb
-rw-r--r-- 1 user group 6.5K Jul 24 12:12 build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/image-rtl8380_netgear_gs108t-v3.dtb
-rw-r--r-- 1 user group 6.6K Jul 24 12:12 build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/image-rtl8380_netgear_gs110tpp-v1.dtb
-rw-r--r-- 1 user group 6.5K Jul 24 12:12 build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/image-rtl8380_netgear_gs308t-v1.dtb
-rw-r--r-- 1 user group 6.6K Jul 24 12:12 build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/image-rtl8380_netgear_gs310tp-v1.dtb
-rw-r--r-- 1 user group 8.4K Jul 24 12:12 build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/image-rtl8380_panasonic_m8eg-pn28080k.dtb
... (truncated)
user@hostname:/openwrt/user/git/musashino-build/openwrt$ dtc -I dtb -O dts build_dir/target-mips_4kec_musl/linux-realtek_rtl838x/image-rtl8382_d-link_dgs-1210-28.dtb
<stdout>: Warning (unit_address_vs_reg): /soc: node has a reg or ranges property, but no unit name
<stdout>: Warning (unit_address_vs_reg): /switch@1b000000: node has a unit name, but no reg or ranges property
/dts-v1/;

/ {
        #address-cells = <0x01>;
        #size-cells = <0x01>;
        compatible = "d-link,dgs-1210-28\0realtek,rtl838x-soc";
        model = "D-Link DGS-1210-28";

        cpus {
                #address-cells = <0x01>;
                #size-cells = <0x00>;
                frequency = <0x1dcd6500>;

                cpu@0 {
                        compatible = "mips,mips4KEc";
                        reg = <0x00>;
                };
        };

        chosen {
                bootargs = "console=ttyS0,115200";
        };

... (truncated)
3 Likes

This solution solved this problem. Just remember to move the dts node out from the dts root.

This also helped, after installing the dtc package! Helped a lot to see what it has actually compiled.

2 Likes

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.