I didn’t find any schematic of your display, but looking closely at this picture:
Power, 3.3V and 5V are on the left side of picture. Usual I2C1 pins (close from 3.3V are used for the DPI interface. (left upper row, look at the zig zag of the track)
the touch function (capacitive for sure) is done with the second fpc connector and is maybe connected to i2c2 i2c0 (look there’s “SDA SCL” on the fpc and and pcb tracks are routed to pins n° 19 & 23).
Just use the custom config choice in webconf and put in there the config that is working under RaspiOs.
I’ve decompiled waveshare-touch-28dpi.dtbo, command is:
dtc -I dtb -O dts -o waveshare-touch-28dpi.dts waveshare-touch-28dpi.dtbo
and waveshare-touch-28dpi.dts looks like this
/dts-v1/;
/ {
compatible = "brcm,bcm2708\0brcm,bcm2711\0brcm,bcm2712";
fragment@0 {
target-path = "/";
__overlay__ {
rpi_backlight {
compatible = "gpio-backlight";
gpios = <0xffffffff 0x12 0x00>;
default-on;
pinctrl-names = "default";
};
};
};
fragment@1 {
target-path = "/";
__overlay__ {
i2c@0 {
compatible = "i2c-gpio";
gpios = <0xffffffff 0x0a 0x00 0xffffffff 0x0b 0x00>;
i2c-gpio,delay-us = <0x04>;
#address-cells = <0x01>;
#size-cells = <0x00>;
phandle = <0x01>;
};
};
};
fragment@2 {
target = <0x01>;
__overlay__ {
#address-cells = <0x01>;
#size-cells = <0x00>;
ft6236@14 {
compatible = "goodix,gt911";
reg = <0x14>;
interrupt-parent = <0xffffffff>;
irq-gpios = <0xffffffff 0x1b 0x02>;
touchscreen-size-x = <0x1e0>;
touchscreen-size-y = <0x280>;
touchscreen-x-mm = <0x2b>;
touchscreen-y-mm = <0x3a>;
touchscreen-swapped-x-y;
touchscreen-inverted-y;
};
ft6236@5d {
compatible = "goodix,gt911";
reg = <0x5d>;
interrupt-parent = <0xffffffff>;
irq-gpios = <0xffffffff 0x1b 0x02>;
touchscreen-size-x = <0x1e0>;
touchscreen-size-y = <0x280>;
touchscreen-x-mm = <0x2b>;
touchscreen-y-mm = <0x3a>;
touchscreen-swapped-x-y;
touchscreen-inverted-y;
};
};
};
__overrides__ {
touchscreen-inverted-x = [00 00 00 00 2b 32 00];
touchscreen-inverted-y = [00 00 00 00 2d 33 00];
touchscreen-swapped-x-y = [00 00 00 00 2d 31 00];
};
__fixups__ {
gpio = "/fragment@0/__overlay__/rpi_backlight:gpios:0\0/fragment@1/__overlay__/i2c@0:gpios:0\0/fragment@1/__overlay__/i2c@0:gpios:12\0/fragment@2/__overlay__/ft6236@14:interrupt-parent:0\0/fragment@2/__overlay__/ft6236@14:irq-gpios:0\0/fragment@2/__overlay__/ft6236@5d:interrupt-parent:0\0/fragment@2/__overlay__/ft6236@5d:irq-gpios:0";
};
__local_fixups__ {
fragment@2 {
target = <0x00>;
};
};
};
So, it takes care of setting up the alternate i2c port for the touch interface, while (I guess) vc4-kms-dpi-2inch8.dtbo should define all specific display panel timings, initialization and so on:
/dts-v1/;
/ {
compatible = "brcm,bcm2835";
fragment@100 {
target-path = "/";
__overlay__ {
panel {
rotation = <0x00>;
phandle = <0x03>;
port {
endpoint {
remote-endpoint = <0x01>;
phandle = <0x02>;
};
};
};
};
};
fragment@101 {
target = <0xffffffff>;
__overlay__ {
status = "okay";
pinctrl-names = "default";
phandle = <0x0a>;
port {
endpoint {
remote-endpoint = <0x02>;
phandle = <0x01>;
};
};
};
};
fragment@102 {
target = <0x03>;
__dormant__ {
backlight = <0x04>;
};
};
fragment@103 {
target-path = "/";
__dormant__ {
backlight {
compatible = "gpio-backlight";
gpios = <0xffffffff 0xff 0x00>;
phandle = <0x04>;
};
};
};
fragment@104 {
target = <0x03>;
__dormant__ {
backlight = <0x05>;
};
};
fragment@105 {
target-path = "/";
__dormant__ {
backlight_pwm {
compatible = "pwm-backlight";
brightness-levels = <0x00 0x06 0x08 0x0c 0x10 0x18 0x20 0x28 0x30 0x40 0x60 0x80 0xa0 0xc0 0xe0 0xff>;
default-brightness-level = <0x10>;
pwms = <0xffffffff 0x00 0x30d40>;
phandle = <0x05>;
};
};
};
fragment@106 {
target = <0xffffffff>;
__dormant__ {
pinctrl-names = "default";
pinctrl-0 = <0x06>;
assigned-clock-rates = <0xf4240>;
status = "okay";
};
};
fragment@107 {
target = <0xffffffff>;
__dormant__ {
pwm_pins {
brcm,pins = <0x12>;
brcm,function = <0x02>;
phandle = <0x06>;
};
};
};
fragment@108 {
target = <0xffffffff>;
__dormant__ {
bootargs = "snd_bcm2835.enable_headphones=0";
};
};
__overrides__ {
backlight-gpio = [00 00 00 00 2b 31 30 32 2b 31 30 33 00 00 00 00 04 67 70 69 6f 73 3a 34 00];
backlight-pwm = "\0\0\0\0+104+105+106+107+108";
backlight-pwm-chan = [00 00 00 05 70 77 6d 73 3a 34 00];
backlight-pwm-gpio = <0x06 0x6272636d 0x2c70696e 0x733a3000>;
backlight-pwm-func = <0x06 0x6272636d 0x2c66756e 0x6374696f 0x6e3a3000>;
backlight-def-brightness = [00 00 00 05 64 65 66 61 75 6c 74 2d 62 72 69 67 68 74 6e 65 73 73 2d 6c 65 76 65 6c 3a 30 00];
rotate = [00 00 00 03 72 6f 74 61 74 69 6f 6e 3a 30 00];
clock-frequency = "\0\0\0\aclock-frequency:0";
hactive = "\0\0\0\ahactive:0";
hfp = "\0\0\0\ahfront-porch:0";
hsync = "\0\0\0\ahsync-len:0";
hbp = "\0\0\0\ahback-porch:0";
vactive = "\0\0\0\avactive:0";
vfp = "\0\0\0\avfront-porch:0";
vsync = "\0\0\0\avsync-len:0";
vbp = "\0\0\0\avback-porch:0";
hsync-invert = "\0\0\0\ahsync-active:0=0";
vsync-invert = "\0\0\0\avsync-active:0=0";
de-invert = "\0\0\0\ade-active:0=0";
pixclk-invert = "\0\0\0\apixelclk-active:0=0";
width-mm = [00 00 00 03 77 69 64 74 68 2d 6d 6d 3a 30 00];
height-mm = <0x03 0x68656967 0x68742d6d 0x6d3a3000>;
rgb565 = [00 00 00 08 62 75 73 2d 66 6f 72 6d 61 74 3a 30 3d 30 78 31 30 31 37 00 00 00 00 09 70 69 6e 63 74 72 6c 2d 30 3a 30 3d 00 ff ff ff ff];
rgb565-padhi = [00 00 00 08 62 75 73 2d 66 6f 72 6d 61 74 3a 30 3d 30 78 31 30 32 32 00 00 00 00 09 70 69 6e 63 74 72 6c 2d 30 3a 30 3d 00 ff ff ff ff];
bgr666 = "\0\0\0\bbus-format:0=0x1023";
bgr666-padhi = [00 00 00 08 62 75 73 2d 66 6f 72 6d 61 74 3a 30 3d 30 78 31 30 32 34 00 00 00 00 09 70 69 6e 63 74 72 6c 2d 30 3a 30 3d 00 ff ff ff ff];
rgb666-padhi = [00 00 00 08 62 75 73 2d 66 6f 72 6d 61 74 3a 30 3d 30 78 31 30 31 35 00 00 00 00 09 70 69 6e 63 74 72 6c 2d 30 3a 30 3d 00 ff ff ff ff];
bgr888 = [00 00 00 08 62 75 73 2d 66 6f 72 6d 61 74 3a 30 3d 30 78 31 30 31 33 00 00 00 00 09 70 69 6e 63 74 72 6c 2d 30 3a 30 3d 00 ff ff ff ff];
rgb888 = [00 00 00 08 62 75 73 2d 66 6f 72 6d 61 74 3a 30 3d 30 78 31 30 30 61 00 00 00 00 09 70 69 6e 63 74 72 6c 2d 30 3a 30 3d 00 ff ff ff ff];
bus-format = "\0\0\0\bbus-format:0";
};
fragment@0 {
target = <0x03>;
__overlay__ {
compatible = "panel-dpi";
width-mm = <0x39>;
height-mm = <0x2b>;
bus-format = <0x1015>;
phandle = <0x08>;
panel-timing {
clock-frequency = <0x19a2800>;
hactive = <0x1e0>;
hfront-porch = <0x41>;
hsync-len = <0x1e>;
hback-porch = <0x41>;
hsync-active = <0x00>;
vactive = <0x280>;
vfront-porch = <0x19>;
vsync-len = <0x0a>;
vback-porch = <0x19>;
vsync-active = <0x00>;
de-active = <0x01>;
pixelclk-active = <0x00>;
phandle = <0x07>;
};
};
};
fragment@1 {
target = <0xffffffff>;
__overlay__ {
pinctrl-0 = <0xffffffff>;
phandle = <0x09>;
};
};
__symbols__ {
panel = "/fragment@100/__overlay__/panel";
panel_in = "/fragment@100/__overlay__/panel/port/endpoint";
dpi_node = "/fragment@101/__overlay__";
dpi_out = "/fragment@101/__overlay__/port/endpoint";
backlight = "/fragment@103/__dormant__/backlight";
backlight_pwm = "/fragment@105/__dormant__/backlight_pwm";
pwm_pins = "/fragment@107/__dormant__/pwm_pins";
panel_generic = "/fragment@0/__overlay__";
timing = "/fragment@0/__overlay__/panel-timing";
dpi_node_generic = "/fragment@1/__overlay__";
};
__fixups__ {
dpi = "/fragment@101:target:0\0/fragment@1:target:0";
gpio = "/fragment@103/__dormant__/backlight:gpios:0\0/fragment@107:target:0";
pwm = "/fragment@105/__dormant__/backlight_pwm:pwms:0\0/fragment@106:target:0";
chosen = "/fragment@108:target:0";
dpi_18bit_cpadhi_gpio0 = "/fragment@1/__overlay__:pinctrl-0:0";
};
__local_fixups__ {
fragment@100 {
__overlay__ {
panel {
port {
endpoint {
remote-endpoint = <0x00>;
};
};
};
};
};
fragment@101 {
__overlay__ {
port {
endpoint {
remote-endpoint = <0x00>;
};
};
};
};
fragment@102 {
target = <0x00>;
__dormant__ {
backlight = <0x00>;
};
};
fragment@104 {
target = <0x00>;
__dormant__ {
backlight = <0x00>;
};
};
fragment@106 {
__dormant__ {
pinctrl-0 = <0x00>;
};
};
__overrides__ {
backlight-gpio = <0x0d>;
backlight-pwm-chan = <0x00>;
backlight-pwm-gpio = <0x00>;
backlight-pwm-func = <0x00>;
backlight-def-brightness = <0x00>;
rotate = <0x00>;
clock-frequency = <0x00>;
hactive = <0x00>;
hfp = <0x00>;
hsync = <0x00>;
hbp = <0x00>;
vactive = <0x00>;
vfp = <0x00>;
vsync = <0x00>;
vbp = <0x00>;
hsync-invert = <0x00>;
vsync-invert = <0x00>;
de-invert = <0x00>;
pixclk-invert = <0x00>;
width-mm = <0x00>;
height-mm = <0x00>;
rgb565 = <0x00 0x18>;
rgb565-padhi = <0x00 0x18>;
bgr666 = <0x00>;
bgr666-padhi = <0x00 0x18>;
rgb666-padhi = <0x00 0x18>;
bgr888 = <0x00 0x18>;
rgb888 = <0x00 0x18>;
bus-format = <0x00>;
};
fragment@0 {
target = <0x00>;
};
};
};
The only mystery to me, is, I can’t find any doc about
enable_dpi_lcd=1
wich should, I believe, declare all the GPIOs used by the DPI interface.