auxdisplay: Add TM16xx and compatible LED display controllers driver
Subsystems (3)
cover auxdisplay: Add TM16xx and compatible LED display controllers driver
This patch series introduces a new auxiliary display driver for the TM16xx family of LED controllers and compatible chips, widely used in TV boxes and embedded devices.
Many consumer devices, particularly TV boxes, use auxiliary displays based on TM16xx LED controllers to show status information such as time, network connectivity, and system state. Currently, there is no mainline kernel support for these displays, forcing users to rely on out-of-tree drivers or userspace solutions that directly manipulate GPIO pins.
This driver provides a unified interface for TM16xx-based auxiliary displays through the Linux LED subsystem. It supports both I2C and SPI communication protocols and integrates with the existing LED class framework, allowing displays to be controlled via standard sysfs interfaces and LED triggers.
Upstreaming this driver will eliminate reliance on out-of-tree drivers and enable standardized auxiliary display support across devices using these controllers.
It is compatible with multiple LED controller families:
- Titan Micro Electronics: TM1618, TM1620, TM1628, TM1650
- FUDA HISI Microelectronics: FD620, FD628, FD650, FD655, FD6551
- i-Core Electronics: AiP650, AiP1618, AiP1628
- Princeton Technology: PT6964
- Winrise Technology: HBS658
Key features:
- Write-only display support: This initial submission implements display output functionality. Most devices do not wire key scanning lines for input, so key input is left for potential future extensions if needed.
- 7-segment display support: Full integration with kernel segment mapping helpers for driving standard 7-segment digit displays.
- Flexible display configuration: Device tree bindings allow board-specific configuration of digit grids, segment mappings, and matrix orientation to accommodate different PCB layouts and wiring designs.
- LED subsystem integration: Individual display elements (icons) are exposed as LED devices, enabling use of LED triggers for automatic control based on system events (network activity, USB connections, etc.).
- Dual protocol support: Supports both I2C and SPI communication, with the protocol selected based on device tree configuration.
The device tree bindings provide properties to describe board-specific wiring and display layout, as the controller itself is agnostic to the display configuration:
- tm16xx,digits: Array defining which controller grids drive digit displays.
- tm16xx,segment-mapping: Mapping of 7-segment display elements to controller outputs.
- tm16xx,transposed: Flag for displays with swapped grid/segment orientation.
- Individual LED definitions for icons and status indicators.
Tested platforms:
- Multiple TV boxes with Amlogic, Rockchip and Allwinner SoCs.
- Various display configurations and controller variants.
- Both I2C and SPI communication modes.
- LED trigger integration for automatic status indication.
Dependencies:
- Requires CONFIG_NEW_LEDS=y and CONFIG_LEDS_CLASS=y
Optional LED trigger modules for advanced functionality:
- CONFIG_LEDS_TRIGGER_TIMER for blinking elements.
- CONFIG_LEDS_TRIGGER_NETDEV for network activity indication.
- CONFIG_USB_LEDS_TRIGGER_USBPORT for USB activity indication.
User space clients, including display-service and display-utils for testing and integration, are available at: https://github.com/jefflessard/tm16xx-display
Andreas Färber (2):
dt-bindings: vendor-prefixes: Add Fuda Hisi Microelectronics
dt-bindings: vendor-prefixes: Add Titan Micro Electronics
Jean-François Lessard (6):
dt-bindings: vendor-prefixes: Add Princeton Technology Corp
dt-bindings: vendor-prefixes: Add Winrise Technology
dt-bindings: vendor-prefixes: Add Wuxi i-Core Electronics
dt-bindings: auxdisplay: add Titan Micro Electronics TM16XX
auxdisplay: Add support for Titanmec TM16xx 7 segment display
controller
MAINTAINERS: Add entry for TM16xx driver
.../bindings/auxdisplay/tm16xx.yaml | 153 ++ .../devicetree/bindings/vendor-prefixes.yaml | 10 + MAINTAINERS | 6 + drivers/auxdisplay/Kconfig | 18 + drivers/auxdisplay/Makefile | 1 + drivers/auxdisplay/tm16xx.c | 1305 +++++++++++++++++ 6 files changed, 1493 insertions(+) create mode 100644 Documentation/devicetree/bindings/auxdisplay/tm16xx.yaml create mode 100644 drivers/auxdisplay/tm16xx.c
Signature · 1 line
2.43.0
PATCH 1/8 dt-bindings: vendor-prefixes: Add Fuda Hisi Microelectronics
From: Andreas Färber <[email protected]>
Assign vendor prefix "fdhisi", based on their domain name.
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -531,6 +531,8 @@ patternProperties: description: Fastrax Oy "^fcs,.*": description: Fairchild Semiconductor + "^fdhisi,.*": + description: Fuzhou Fuda Hisi Microelectronics Co., Ltd. "^feixin,.*": description: Shenzhen Feixin Photoelectic Co., Ltd "^feiyang,.*":
Signature · 1 line
2.43.0
PATCH 2/8 dt-bindings: vendor-prefixes: Add Titan Micro Electronics
In reply to Jean-François LessardFrom: Andreas Färber <[email protected]>
Assign vendor prefix "titanmec", matching their domain name.
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -1550,6 +1550,8 @@ patternProperties: description: Texas Instruments "^tianma,.*": description: Tianma Micro-electronics Co., Ltd. + "^titanmec,.*": + description: Shenzhen Titan Micro Electronics Co., Ltd. "^tlm,.*": description: Trusted Logic Mobility "^tmt,.*":
Signature · 1 line
2.43.0
PATCH 3/8 dt-bindings: vendor-prefixes: Add Princeton Technology Corp
In reply to Jean-François LessardAssign vendor prefix "princeton", based on their domain name.
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -1218,6 +1218,8 @@ patternProperties: description: Prime View International (PVI) "^primux,.*": description: Primux Trading, S.L. + "^princeton,.*": + description: Princeton Technology Corp. "^probox2,.*": description: PROBOX2 (by W2COMP Co., Ltd.) "^pri,.*":
Signature · 1 line
2.43.0
PATCH 4/8 dt-bindings: vendor-prefixes: Add Winrise Technology
In reply to Jean-François LessardAssign vendor prefix "winrise", matching their domain name.
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -1711,6 +1711,8 @@ patternProperties: description: Wingtech Technology Co., Ltd. "^winlink,.*": description: WinLink Co., Ltd + "^winrise,.*": + description: Shenzhen Winrise Technology Co., Ltd. "^winsen,.*": description: Winsen Corp. "^winstar,.*":
Signature · 1 line
2.43.0
PATCH 5/8 dt-bindings: vendor-prefixes: Add Wuxi i-Core Electronics
In reply to Jean-François LessardAssign vendor prefix "icore", based on their domain name.
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -694,6 +694,8 @@ patternProperties: description: International Business Machines (IBM) "^ibm,.*": description: International Business Machines (IBM) + "^icore,.*": + description: Wuxi i-Core Electronics Co., Ltd. "^icplus,.*": description: IC Plus Corp. "^idt,.*":
Signature · 1 line
2.43.0
PATCH 6/8 dt-bindings: auxdisplay: add Titan Micro Electronics TM16XX
In reply to Jean-François LessardAdd documentation for TM16XX and compatible LED display controllers.
This patch is inspired by previous work from Andreas Färber and Heiner Kallweit.
--- .../bindings/auxdisplay/tm16xx.yaml | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 Documentation/devicetree/bindings/auxdisplay/tm16xx.yaml
Documentation/devicetree/bindings/auxdisplay/tm16xx.yaml new file +153 -0
@@ -0,0 +1,153 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/auxdisplay/tm16xx.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Auxiliary displays based on TM16xx and compatible LED controllers + +maintainers: + - Jean-François Lessard <[email protected]> + +description: | + TM16xx controllers manage a matrix of LEDs organized in grids (rows) and segments (columns). + Each grid or segment can be wired to drive either a digit or individual icons, depending on the + board design. + + Typical display example: + + --- --- --- --- + WIFI | | | | - | | | | USB PLAY + --- --- --- --- + LAN | | | | - | | | | BT PAUSE + --- --- --- --- + + The controller itself is agnostic of the display layout. The specific arrangement + (which grids and segments drive which digits or icons) is determined by the board-level + wiring. Therefore, these bindings describe hardware configuration at the PCB level + to enable support of multiple display implementations using these LED controllers. + +properties: + compatible: + enum: + - titanmec,tm1618 + - titanmec,tm1620 + - titanmec,tm1628 + - titanmec,tm1650 + - fdhisi,fd620 + - fdhisi,fd628 + - fdhisi,fd650 + - fdhisi,fd6551 + - fdhisi,fd655 + - icore,aip650 + - icore,aip1618 + - icore,aip1628 + - princeton,pt6964 + - winrise,hbs658 + + reg: + maxItems: 1 + + tm16xx,digits: + description: | + Array of grid (row) indexes corresponding to specific wiring of digits in the display matrix. + Defines which grid lines are connected to digit elements. + $ref: /schemas/types.yaml#/definitions/uint8-array + items: + minimum: 0 + maximum: 7 + minItems: 1 + maxItems: 8 + + tm16xx,segment-mapping: + description: | + Array of segment (column) indexes specifying the hardware layout mapping used for digit display. + Each entry gives the segment index corresponding to a standard 7-segment element (a-g). + $ref: /schemas/types.yaml#/definitions/uint8-array + items: + minimum: 0 + maximum: 7 + minItems: 7 + maxItems: 7 + + tm16xx,transposed: + description: | + Optional flag indicating if grids and segments are swapped compared to standard matrix orientation. + This accommodates devices where segments are wired to rows and grids to columns. + $ref: /schemas/types.yaml#/definitions/flag + + "#address-cells": + const: 2 + + "#size-cells": + const: 0 + +patternProperties: + "^led@[0-7],[0-7]$": + $ref: /schemas/leds/common.yaml# + properties: + reg: + description: Grid (row) and segment (column) index in the matrix of this individual LED icon + required: + - reg + +required: + - compatible + - reg + - tm16xx,digits + - tm16xx,segment-mapping + +additionalProperties: true + +examples: + - | + display_client: i2c { + #address-cells = <1>; + #size-cells = <0>; + + display@24 { + compatible = "titanmec,tm1650"; + reg = <0x24>; + tm16xx,digits = /bits/ 8 <0 1 2 3>; + tm16xx,segment-mapping = /bits/ 8 <0 1 2 3 4 5 6>; + + #address-cells = <2>; + #size-cells = <0>; + + led@4,0 { + reg = <4 0>; + function = "lan"; + }; + + led@4,1 { + reg = <4 1>; + function = "wlan"; + }; + }; + }; + - | + display_client: spi { + #address-cells = <1>; + #size-cells = <0>; + + display@0 { + compatible = "titanmec,tm1628"; + reg = <0>; + tm16xx,transposed; + tm16xx,digits = /bits/ 8 <1 2 3 4>; + tm16xx,segment-mapping = /bits/ 8 <0 1 2 3 4 5 6>; + + #address-cells = <2>; + #size-cells = <0>; + + led@0,2 { + reg = <0 2>; + function = "usb"; + }; + + led@0,3 { + reg = <0 3>; + function = "power"; + }; + }; + };
Signature · 1 line
2.43.0
Rob Herring (Arm)
maintainerRe: [PATCH 6/8] dt-bindings: auxdisplay: add Titan Micro Electronics TM16XX
Quoted 4 lines · Jean-François Lessard
Add documentation for TM16XX and compatible LED display controllers.
This patch is inspired by previous work from Andreas Färber and Heiner Kallweit.
Quoted 8 lines
Co-developed-by Andreas Färber <[email protected]>Co-developed-by Heiner Kallweit <[email protected]>Signed-off-by Jean-François Lessard <[email protected]>--- .../bindings/auxdisplay/tm16xx.yaml | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 Documentation/devicetree/bindings/auxdisplay/tm16xx.yaml
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
Documentation/devicetree/bindings/auxdisplay/tm16xx.example.dts:59.29-83.11: ERROR (duplicate_label): /example-1/spi: Duplicate label 'display_client' on /example-1/spi and /example-0/i2c
ERROR: Input tree has errors, aborting (use -f to force output)
make[2]: *** [scripts/Makefile.dtbs:131: Documentation/devicetree/bindings/auxdisplay/tm16xx.example.dtb] Error 2
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [/builds/robherring/dt-review-ci/linux/Makefile:1519: dt_binding_check] Error 2
make: *** [Makefile:248: __sub-make] Error 2
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/[email protected]
The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note that DT_SCHEMA_FILES can be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema.
Re: [PATCH 6/8] dt-bindings: auxdisplay: add Titan Micro Electronics TM16XX
Quoted 20 lines · Rob Herring (Arm)
Quoted 4 lines · Jean-François Lessard
Add documentation for TM16XX and compatible LED display controllers.
This patch is inspired by previous work from Andreas Färber and Heiner Kallweit.
Quoted 8 lines
Co-developed-by Andreas Färber <[email protected]>Co-developed-by Heiner Kallweit <[email protected]>Signed-off-by Jean-François Lessard <[email protected]>--- .../bindings/auxdisplay/tm16xx.yaml | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 Documentation/devicetree/bindings/auxdisplay/tm16xx.yamlMy bot found errors running 'make
dt_binding_check' on your patch:yamllint warnings/errors:
Quoted 8 lines
dtschema/dtc warnings/errors:
Documentation/devicetree/bindings/auxdisplay/tm16xx.example.dts:59.29-83.11: ERROR (duplicate_label): /example-1/spi: Duplicate label 'display_client' on /example-1/spi and /example-0/i2c
ERROR: Input tree has errors, aborting (use -f to force output)
make[2]: *** [scripts/Makefile.dtbs:131:Documentation/devicetree/bindings/auxdisplay/tm16xx.example.dtb] Error 2
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [/builds/robherring/dt-review-ci/linux/Makefile:1519:dt_binding_check] Error 2
make: *** [Makefile:248: __sub-make] Error 2
Thank you for the dt_binding_check feedback – I’ll prepare v2 shortly fixing the duplicate label issue.
Quoted 11 lines
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/[email protected]
The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch.
If you already ran 'make
dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date:
Quoted 6 lines
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note that
DT_SCHEMA_FILEScan be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema.
Before I send v2, I’d like your guidance on one specific design question:
Currently, the binding uses a 'tm16xx,' prefix for properties describing hardware layout (e.g. tm16xx,digits). TM16xx being the family name for these compatible controllers (Titanmec, Fuda Hisi, Princeton, Winrise, i-Core).
1. Is using 'tm16xx,' as a class prefix appropriate here, or should I instead use a vendor-specific prefix (e.g. 'titanmec,') despite multiple vendors implementing this hardware design?
2. Should 'tm16xx' also be formally added to vendor-prefixes.yaml or handled differently?
Your advice will ensure the next revision aligns with DT conventions.
Thanks again for your review and guidance.
PATCH 7/8 auxdisplay: Add support for Titanmec TM16xx 7 segment display controller
In reply to Jean-François LessardThis patch introduces a new auxiliary display driver for TM16XX family LED controllers and compatible chips:
- Shenzhen Titan Micro Electronics: TM1618, TM1620, TM1628, TM1650
- Fuzhou Fuda Hisi Microelectronics: FD620, FD628, FD650, FD655, FD6551
- Wuxi i-Core Electronics: AiP650, AiP1618, AiP1628
- Princeton Technology: PT6964
- Shenzhen Winrise Technology: HBS658
Known to be successfully tested on:
- H96 Max (I2C, rockchip XY_RK3328)
- Magicsee N5 (I2C, amlogic s905x)
- Tanix TX3 Mini (SPI, amlogic s905w)
- Tanix TX6 (I2C, allwinner h6)
- X92 (SPI)
- X96 Max (SPI, amlogic s905x2)
--- drivers/auxdisplay/Kconfig | 18 + drivers/auxdisplay/Makefile | 1 + drivers/auxdisplay/tm16xx.c | 1305 +++++++++++++++++++++++++++++++++++ 3 files changed, 1324 insertions(+) create mode 100644 drivers/auxdisplay/tm16xx.c
drivers/auxdisplay/Kconfig +18 -0
@@ -526,6 +526,24 @@ config SEG_LED_GPIO This driver can also be built as a module. If so, the module will be called seg-led-gpio. +config TM16XX + tristate "TM16XX-compatible LED controllers display" + depends on SPI || I2C + select NEW_LEDS + select LEDS_CLASS + select LEDS_TRIGGERS + help + This driver supports the following TM16XX compatible + (I2C and SPI 7-Segment LED display controller) chips: + - Titanmec: TM1618, TM1620, TM1628, TM1650 + - Fuda Hisi: FD620, FD628, FD650, FD655, FD6551 + - i-Core: AiP650, AiP1618, AiP1628 + - Princeton: PT6964 + - Winrise: HBS658 + + This driver can also be built as a module. If so, the module + will be called tm16xx. + # # Character LCD with non-conforming interface section #
drivers/auxdisplay/Makefile +1 -0
@@ -16,3 +16,4 @@ obj-$(CONFIG_LINEDISP) += line-display.o obj-$(CONFIG_MAX6959) += max6959.o obj-$(CONFIG_PARPORT_PANEL) += panel.o obj-$(CONFIG_SEG_LED_GPIO) += seg-led-gpio.o +obj-$(CONFIG_TM16XX) += tm16xx.o
drivers/auxdisplay/tm16xx.c new file +1305 -0
1,305 lines not on this page · raw message
Signature · 1 line
2.43.0
PATCH 8/8 MAINTAINERS: Add entry for TM16xx driver
In reply to Jean-François Lessard--- MAINTAINERS | 6 ++++++ 1 file changed, 6 insertions(+)
MAINTAINERS +6 -0
@@ -25047,6 +25047,12 @@ F: mm/memfd.c F: mm/shmem.c F: mm/shmem_quota.c +TM16XX-COMPATIBLE LED CONTROLLERS DISPLAY DRIVER +M: Jean-François Lessard <[email protected]> +S: Maintained +F: drivers/auxdisplay/tm16xx.c +F: Documentation/devicetree/bindings/auxdisplay/tm16xx.yaml + TOMOYO SECURITY MODULE M: Kentaro Takeda <[email protected]> M: Tetsuo Handa <[email protected]>
Signature · 1 line
2.43.0