Jump to content

Recommended Posts

Posted
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.

Posted

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?

Posted (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 by blackc
errors
Posted
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 */

Posted

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

Posted

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
 

Posted
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

Posted

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

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...

Important Information

Terms of Use - Privacy Policy - Guidelines