Jean-Francois Lessard Posted December 8, 2025 Author Posted December 8, 2025 On 12/6/2025 at 4:09 PM, snowbody said: root@homeassistant:/boot# ls /sys/class/leds/display brightness device digits map_seg7 max_brightness num_digits num_segments power segments subsystem trigger uevent value 16 hours ago, snowbody said: display-service -c [INFO] all digits and leds on /usr/sbin/display-service: 116: cannot create /sys/class/leds/display/message: Permission denied On 10/31/2025 at 1:32 PM, Jean-Francois Lessard said: I think your previous permission denied issue was because you were using an older version of the driver with the current version of the display-service. On 10/31/2025 at 1:32 PM, Jean-Francois Lessard said: Latest driver version now use line-display library (expected upstreaming requirements), therefore there is no more sysfs value attribute. This has been replaced with the line-display message attribute. @snowbody you are using an older version of the driver with the current version of the display-service. That won't work. Since you are on 6.12 kernel, start by cloning the main branch of https://github.com/jefflessard/tm16xx-display.git it already contains the line-display backport. 0 Quote
blackc Posted December 18, 2025 Posted December 18, 2025 Hello! I have a strange behavior at compiling Цитата make EXTRA_CFLAGS="-DCONFIG_TM16XX -DCONFIG_TM16XX_KEYPAD -DCONFIG_TM16XX_I2C -DCONFIG_TM16XX_SPI -include /home/bc/Soft/tm16xx-display/drivers/auxdisplay/tm16xx_compat.h -I/home/bc/Soft/tm16xx-display/include/" -C /lib/modules/6.17.2-edge-sunxi64/build M=/home/bc/Soft/tm16xx-display/drivers/auxdisplay CONFIG_TM16XX=m CONFIG_TM16XX_KEYPAD=m CONFIG_TM16XX_I2C=m CONFIG_TM16XX_SPI=m CONFIG_LINEDISP=m modules make[1]: Entering directory '/usr/src/linux-headers-6.17.2-edge-sunxi64' make[2]: Entering directory '/home/bc/Soft/tm16xx-display/drivers/auxdisplay' CC [M] line-display.o CC [M] tm16xx_core.o tm16xx_core.c: In function ‘tm16xx_parse_fwnode’: tm16xx_core.c:285:17: error: implicit declaration of function ‘fwnode_for_each_available_child_node_scoped’; did you mean ‘fwnode_for_each_available_child_node’? [-Wimplicit-function-declaration] 285 | fwnode_for_each_available_child_node_scoped(digits_node, child) { | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | fwnode_for_each_available_child_node As i knew, fwnode_for_each_available_child_node_scoped was committed to kernel at 2024 year.. Thats my kernel Цитата bc@transpeed-8k618-t:~$ uname -a Linux transpeed-8k618-t 6.17.2-edge-sunxi64 #2 SMP PREEMPT Sun Oct 12 11:01:58 UTC 2025 aarch64 GNU/Linux Any ideas? 0 Quote
Jean-Francois Lessard Posted December 23, 2025 Author Posted December 23, 2025 @blackc fwnode_for_each_available_child_node_scoped has been mainstreamed in 6.18 (see Commit 448097b). When compiling out-of-tree from jefflessard/tm16xx-display, tm16xx_compat.h should provide backward compatibility (see Line 102). It looks like the Makefile is not picking up the include. You can try to manually add #include "tm16xx_compat.h" to tm16xx_core.c. 0 Quote
blackc Posted December 24, 2025 Posted December 24, 2025 (edited) Thanks!! I had compiled tm16xx, attach dtb overlay, and trying to load modules. dmesg: Цитата [ 161.778500] line_display: loading out-of-tree module taints kernel. [ 161.828311] tm16xx-i2c 3-0024: Failed to configure controller: -6 [ 161.828416] tm16xx-i2c 3-0024: error -ENXIO: Failed to initialize display my old dts overlay for openvfd: Цитата /dts-v1/; /plugin/; / { fragment@0 { target-path = "/"; __overlay__ { openvfd { compatible = "open,vfd"; dev_name = "openvfd"; status = "okay"; openvfd_gpio_clk = <&pio 8 11 1>; openvfd_gpio_dat = <&pio 8 12 1>; vfd_gpio_chip_name = "0300b000.pinctrl"; openvfd_chars = [02 04 03 02 01]; openvfd_dot_bits = [00 01 03 02 04 05 06]; openvfd_display_type = <0x03000001>; }; }; }; }; new dts overlay: Цитата /dts-v1/; /plugin/; #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/leds/common.h> &{/} { i2c-display { compatible = "i2c-gpio"; sda-gpios = <&pio 8 12 1>; /* PI12 */ scl-gpios = <&pio 8 11 1>; /* PI11 */ i2c-gpio,delay-us = <5>; #address-cells = <1>; #size-cells = <0>; display@24 { compatible = "fdhisi,fd650", "titanmec,tm1650"; reg = <0x24>; digits { #address-cells = <1>; #size-cells = <0>; digit@0 { reg = <0>; segments = <0 0>, <0 1>, <0 2>, <0 3>, <0 4>, <0 5>, <0 6>; }; digit@1 { reg = <1>; segments = <1 0>, <1 1>, <1 2>, <1 3>, <1 4>, <1 5>, <1 6>; }; digit@2 { reg = <2>; segments = <2 0>, <2 1>, <2 2>, <2 3>, <2 4>, <2 5>, <2 6>; }; digit@3 { reg = <3>; segments = ❤️ 0>, ❤️ 1>, ❤️ 2>, ❤️ 3>, ❤️ 4>, ❤️ 5>, ❤️ 6>; }; }; leds { #address-cells = <2>; #size-cells = <0>; led@1,7 { reg = <1 7>; function = "colon"; }; }; }; }; }; Configs looks equals in hardware config, but driver not loading... Edited December 24, 2025 by blackc errors 0 Quote
Jean-Francois Lessard Posted December 24, 2025 Author Posted December 24, 2025 11 minutes ago, blackc said: openvfd_gpio_clk = <&pio 8 11 1>; openvfd_gpio_dat = <&pio 8 12 1>; 11 minutes ago, blackc said: sda-gpios = <&pio 8 12 0>; /* PI12 */ scl-gpios = <&pio 8 11 0>; /* PI11 */ Have you tried setting the pin flag to 1 as in your open vfd config? sda-gpios = <&pio 8 12 1>; /* PI12 */ scl-gpios = <&pio 8 11 1>; /* PI11 */ 0 Quote
blackc Posted December 24, 2025 Posted December 24, 2025 Yes, i've tried pin flag 0 and 1 -- no effect 0 Quote
Jean-Francois Lessard Posted December 24, 2025 Author Posted December 24, 2025 May worth enabling dyndbg to see debug output: dmesg -C modprobe -r tm16xx && modprobe tm16xx dyndbg dmesg 0 Quote
Jean-Francois Lessard Posted December 24, 2025 Author Posted December 24, 2025 Looking at transpeed-8k618-t-allwinner-h6.dtso, you may need these flags instead of 0/1: (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) 0 Quote
blackc Posted December 24, 2025 Posted December 24, 2025 I was rechecked that openvfd works and get its config openvfd dtbo overlay fragment (decompiled on running system) Цитата openvfd { openvfd_display_type = <0x3000001>; dev_name = "openvfd"; openvfd_gpio_clk = <0x02 0x08 0x0b 0x01>; openvfd_dot_bits = [00 01 03 02 04 05 06]; vfd_gpio_chip_name = "0300b000.pinctrl"; compatible = "open,vfd"; status = "okay"; openvfd_gpio_dat = <0x02 0x08 0x0c 0x01>; openvfd_chars = [02 04 03 02 01]; }; It works, driver loaded and userspace software shows me current time on LED (some segments shows wrong, i think it result of wrong chars config) tm16xx: I've tried many values for GPIO line config, GPIO_ACTIVE_LOW (1), GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN (6), GPIO_ACTIVE_HIGH (0), GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN (7). It was no result at all, driver still says that cannot init controller. Also i was tried drivers fd6551, fd655 with different GPIO lines config. No success. I was rechecked LED controller chip on board, it is really FD6551. tm16xx dtbo overlay fragment (decompiled on running system) Цитата i2c-display { #address-cells = <0x01>; #size-cells = <0x00>; compatible = "i2c-gpio"; i2c-gpio,delay-us = <0x05>; scl-gpios = <0x02 0x08 0x0b 0x01>; sda-gpios = <0x02 0x08 0x0c 0x01>; display@24 { compatible = "fdhisi,fd6551"; reg = <0x24>; leds { #address-cells = <0x02>; #size-cells = <0x00>; led@1,7 { function = "colon"; reg = <0x01 0x07>; }; }; digits { #address-cells = <0x01>; #size-cells = <0x00>; digit@3 { segments = <0x03 0x00 0x03 0x01 0x03 0x02 0x03 0x03 0x03 0x04 0x03 0x05 0x03 0x06>; reg = <0x03>; }; digit@1 { segments = <0x01 0x00 0x01 0x01 0x01 0x02 0x01 0x03 0x01 0x04 0x01 0x05 0x01 0x06>; reg = <0x01>; }; digit@2 { segments = <0x02 0x00 0x02 0x01 0x02 0x02 0x02 0x03 0x02 0x04 0x02 0x05 0x02 0x06>; reg = <0x02>; }; digit@0 { segments = <0x00 0x00 0x00 0x01 0x00 0x02 0x00 0x03 0x00 0x04 0x00 0x05 0x00 0x06>; reg = <0x00>; }; }; }; }; I have no ideas what goes wrong. When i was configure openvfd device tree, pointing gpio chip as &gpio was not works. Only pointing as "0300b000.pinctrl" was successful. Maybe, its important... Maybe, some features/conflicts at controller init needs debugging 0 Quote
s100sic Posted January 22 Posted January 22 Hi Lessard can you please check this error (X88 PRO-B-RK3318-D4-V1.6)? root@GREEN:~/tm16xx-display# make module make EXTRA_CFLAGS="-DCONFIG_TM16XX -DCONFIG_TM16XX_KEYPAD -DCONFIG_TM16XX_I2C -DCONFIG_TM16XX_SPI -include /root/tm16xx-display/drivers/auxdisplay/tm16xx_compat.h -I/root/tm16xx-display/include/" -C /lib/modules/6.18.6-current-rockchip64/build M=/root/tm16xx-display/drivers/auxdisplay CONFIG_TM16XX=m CONFIG_TM16XX_KEYPAD=y CONFIG_TM16XX_I2C=m CONFIG_TM16XX_SPI=m CONFIG_LINEDISP=m modules make[1]: Entering directory '/usr/src/linux-headers-6.18.6-current-rockchip64' make[2]: Entering directory '/root/tm16xx-display/drivers/auxdisplay' CC [M] line-display.o CC [M] tm16xx_core.o CC [M] tm16xx_keypad.o tm16xx_keypad.c:81:6: error: redefinition of ‘tm16xx_set_key’ 81 | void tm16xx_set_key(const struct tm16xx_display *display, const int row, | ^~~~~~~~~~~~~~ In file included from tm16xx_keypad.c:18: tm16xx.h:189:20: note: previous definition of ‘tm16xx_set_key’ with type ‘void(const struct tm16xx_display *, const int, const int, const bool)’ {aka ‘void(const struct tm16xx_display *, const int, const int, const _Bool)’} 189 | static inline void tm16xx_set_key(const struct tm16xx_display *display, | ^~~~~~~~~~~~~~ tm16xx_keypad.c:135:5: error: redefinition of ‘tm16xx_keypad_probe’ 135 | int tm16xx_keypad_probe(struct tm16xx_display *display) | ^~~~~~~~~~~~~~~~~~~ tm16xx.h:184:19: note: previous definition of ‘tm16xx_keypad_probe’ with type ‘int(struct tm16xx_display *)’ 184 | static inline int tm16xx_keypad_probe(struct tm16xx_display *display) | ^~~~~~~~~~~~~~~~~~~ make[4]: *** [/usr/src/linux-headers-6.18.6-current-rockchip64/scripts/Makefile.build:290: tm16xx_keypad.o] Error 1 make[3]: *** [/usr/src/linux-headers-6.18.6-current-rockchip64/Makefile:2010: .] Error 2 make[2]: *** [/usr/src/linux-headers-6.18.6-current-rockchip64/Makefile:248: __sub-make] Error 2 make[2]: Leaving directory '/root/tm16xx-display/drivers/auxdisplay' make[1]: *** [Makefile:248: __sub-make] Error 2 make[1]: Leaving directory '/usr/src/linux-headers-6.18.6-current-rockchip64' make: *** [Makefile:50: module] Error 2 Thank you 0 Quote
arl_spb Posted February 3 Posted February 3 23.01.2026 в 02:55, s100sic сказал: Hi Lessard can you please check this error (X88 PRO-B-RK3318-D4-V1.6)? Edit the makefile: # keypad support CONFIG += CONFIG_TM16XX_KEYPAD=n #CCFLAGS += -DCONFIG_TM16XX_KEYPAD 0 Quote
sr4armbian Posted 58 minutes ago Posted 58 minutes ago Hi @Jean-Francois Lessard Thanks for sharing the new openvfd option for Armbian. I am using a Allwinner H618 Android 12 TV box that got FD6551 controller. I have verified the chip model by opening the box. The headers of respective version is also installed and I have double checked that. apt install -y linux-headers-edge-sunxi64 Reading package lists... Done Building dependency tree... Done Reading state information... Done linux-headers-edge-sunxi64 is already the newest version (25.11.2). From the Android dts file I can find the following. I have tried the configuration mentioned here as well but there is no VFD output. Is there any other configuration I have to check or modify for the VFD to work? leds { leds_clk = <0x23 0x08 0x0b 0x00>; leds_dat = <0x23 0x08 0x0c 0x00>; status = "okay"; }; fd655_para { device_type = "fd655_para"; compatible = "Ik,fd655_dev"; fd655_clk_io = <0x23 0x07 0x06 0x01>; fd655_dat_io = <0x23 0x07 0x07 0x01>; status = "okay"; }; ald-colorleds { compatible = "elebao,colorleds"; dev_name = "ald-colorleds"; pinctrl-0 = <0x70>; colorleds_data_gpio = <0x23 0x07 0x02 0x01>; status = "okay"; }; I tried to make the module as you have instructed, however I am getting the below given error messages. /tm16xx-display# make module make EXTRA_CFLAGS="-DCONFIG_TM16XX -DCONFIG_TM16XX_KEYPAD -DCONFIG_TM16XX_I2C -DCONFIG_TM16XX_SPI -include /root/tm16xx-display/drivers/auxdisplay/tm16xx_compat.h -I/root/tm16xx-display/include/" -C /lib/modules/6.12.11-edge-sunxi64/build M=/root/tm16xx-display/drivers/auxdisplay CONFIG_TM16XX=m CONFIG_TM16XX_KEYPAD=y CONFIG_TM16XX_I2C=m CONFIG_TM16XX_SPI=m CONFIG_LINEDISP=m modules make[1]: Entering directory '/usr/src/linux-headers-6.12.11-edge-sunxi64' CC [M] /root/tm16xx-display/drivers/auxdisplay/line-display.o CC [M] /root/tm16xx-display/drivers/auxdisplay/tm16xx_core.o CC [M] /root/tm16xx-display/drivers/auxdisplay/tm16xx_keypad.o LD [M] /root/tm16xx-display/drivers/auxdisplay/tm16xx.o CC [M] /root/tm16xx-display/drivers/auxdisplay/tm16xx_i2c.o CC [M] /root/tm16xx-display/drivers/auxdisplay/tm16xx_spi.o MODPOST /root/tm16xx-display/drivers/auxdisplay/Module.symvers CC [M] /root/tm16xx-display/drivers/auxdisplay/line-display.mod.o In file included from /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:2: /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:13:41: error: expected ‘)’ before ‘LINEDISP’ 13 | KSYMTAB_FUNC(linedisp_attach, "_gpl", ""LINEDISP""); | ^~~~~~~~ ./include/linux/export-internal.h:45:28: note: in definition of macro ‘__KSYMTAB’ 45 | " .asciz \"" ns "\"" "\n" \ | ^~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:13:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 13 | KSYMTAB_FUNC(linedisp_attach, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ ./include/linux/export-internal.h:41:12: note: to match this ‘(’ 41 | asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1" "\n" \ | ^ ./include/linux/export-internal.h:62:41: note: in expansion of macro ‘__KSYMTAB’ 62 | #define KSYMTAB_FUNC(name, sec, ns) __KSYMTAB(name, KSYM_FUNC(name), sec, ns) | ^~~~~~~~~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:13:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 13 | KSYMTAB_FUNC(linedisp_attach, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:14:41: error: expected ‘)’ before ‘LINEDISP’ 14 | KSYMTAB_FUNC(linedisp_detach, "_gpl", ""LINEDISP""); | ^~~~~~~~ ./include/linux/export-internal.h:45:28: note: in definition of macro ‘__KSYMTAB’ 45 | " .asciz \"" ns "\"" "\n" \ | ^~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:14:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 14 | KSYMTAB_FUNC(linedisp_detach, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ ./include/linux/export-internal.h:41:12: note: to match this ‘(’ 41 | asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1" "\n" \ | ^ ./include/linux/export-internal.h:62:41: note: in expansion of macro ‘__KSYMTAB’ 62 | #define KSYMTAB_FUNC(name, sec, ns) __KSYMTAB(name, KSYM_FUNC(name), sec, ns) | ^~~~~~~~~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:14:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 14 | KSYMTAB_FUNC(linedisp_detach, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:15:43: error: expected ‘)’ before ‘LINEDISP’ 15 | KSYMTAB_FUNC(linedisp_register, "_gpl", ""LINEDISP""); | ^~~~~~~~ ./include/linux/export-internal.h:45:28: note: in definition of macro ‘__KSYMTAB’ 45 | " .asciz \"" ns "\"" "\n" \ | ^~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:15:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 15 | KSYMTAB_FUNC(linedisp_register, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ ./include/linux/export-internal.h:41:12: note: to match this ‘(’ 41 | asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1" "\n" \ | ^ ./include/linux/export-internal.h:62:41: note: in expansion of macro ‘__KSYMTAB’ 62 | #define KSYMTAB_FUNC(name, sec, ns) __KSYMTAB(name, KSYM_FUNC(name), sec, ns) | ^~~~~~~~~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:15:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 15 | KSYMTAB_FUNC(linedisp_register, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:16:45: error: expected ‘)’ before ‘LINEDISP’ 16 | KSYMTAB_FUNC(linedisp_unregister, "_gpl", ""LINEDISP""); | ^~~~~~~~ ./include/linux/export-internal.h:45:28: note: in definition of macro ‘__KSYMTAB’ 45 | " .asciz \"" ns "\"" "\n" \ | ^~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:16:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 16 | KSYMTAB_FUNC(linedisp_unregister, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ ./include/linux/export-internal.h:41:12: note: to match this ‘(’ 41 | asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1" "\n" \ | ^ ./include/linux/export-internal.h:62:41: note: in expansion of macro ‘__KSYMTAB’ 62 | #define KSYMTAB_FUNC(name, sec, ns) __KSYMTAB(name, KSYM_FUNC(name), sec, ns) | ^~~~~~~~~ /root/tm16xx-display/drivers/auxdisplay/line-display.mod.c:16:1: note: in expansion of macro ‘KSYMTAB_FUNC’ 16 | KSYMTAB_FUNC(linedisp_unregister, "_gpl", ""LINEDISP""); | ^~~~~~~~~~~~ make[3]: *** [scripts/Makefile.modfinal:31: /root/tm16xx-display/drivers/auxdisplay/line-display.mod.o] Error 1 make[2]: *** [/usr/src/linux-headers-6.12.11-edge-sunxi64/Makefile:1870: modules] Error 2 make[1]: *** [Makefile:224: __sub-make] Error 2 make[1]: Leaving directory '/usr/src/linux-headers-6.12.11-edge-sunxi64' make: *** [Makefile:50: module] Error 2 root@homeassistant2:~/tm16xx-display# make-module install make-module: command not found root@homeassistant2:~/tm16xx-display# make module-install make -C /lib/modules/6.12.11-edge-sunxi64/build M=/root/tm16xx-display/drivers/auxdisplay CONFIG_TM16XX=m CONFIG_TM16XX_KEYPAD=y CONFIG_TM16XX_I2C=m CONFIG_TM16XX_SPI=m CONFIG_LINEDISP=m modules_install INSTALL_MOD_PATH= make[1]: Entering directory '/usr/src/linux-headers-6.12.11-edge-sunxi64' DEPMOD /lib/modules/6.12.11-edge-sunxi64 Warning: modules_install: missing 'System.map' file. Skipping depmod. make[1]: Leaving directory '/usr/src/linux-headers-6.12.11-edge-sunxi64' root@homeassistant2:~/tm16xx-display# make service-install modprobe tm16xx modprobe: ERROR: could not insert 'tm16xx': Exec format error make: *** [Makefile:60: service-install] Error 1 0 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.