dt-bindings: input: add GPIO charlieplex keypad

Add DT bindings for GPIO charlieplex keypad.

Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
Link: https://patch.msgid.link/20260312180304.3865850-4-hugo@hugovil.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
Hugo Villeneuve
2026-04-18 22:18:30 -07:00
committed by Dmitry Torokhov
parent 906a37ba54
commit 0d64bee764

View File

@@ -0,0 +1,108 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/input/gpio-charlieplex-keypad.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: GPIO charlieplex keypad
maintainers:
- Hugo Villeneuve <hvilleneuve@dimonoff.com>
description: |
The charlieplex keypad supports N^2)-N different key combinations (where N is
the number of I/O lines). Key presses and releases are detected by configuring
only one line as output at a time, and reading other line states. This process
is repeated for each line. Diodes are required to ensure current flows in only
one direction between any pair of pins, as well as pull-up or pull-down
resistors on all I/O lines.
This mechanism doesn't allow to detect simultaneous key presses.
Wiring example for 3 lines keyboard with 6 switches and 3 diodes (pull-up/down
resistors not shown but needed on L0, L1 and L2):
L0 --+---------------------+----------------------+
| | |
L1 -------+-----------+---------------------+ |
| | | | | |
L2 -------------+----------------+-----+ | |
| | | | | | | | |
| | | | | | | | |
| S1 \ S2 \ | S3 \ S4 \ | S5 \ S6 \
| | | | | | | | |
| +--+--+ | +--+--+ | +--+--+
| | | | | |
| D1 v | D2 v | D3 v
| - (k) | - (k) | - (k)
| | | | | |
+-------+ +-------+ +-------+
L: GPIO line
S: switch
D: diode (k indicates cathode)
allOf:
- $ref: input.yaml#
- $ref: /schemas/input/matrix-keymap.yaml#
properties:
compatible:
const: gpio-charlieplex-keypad
autorepeat: true
debounce-delay-ms:
default: 5
line-gpios:
description:
List of GPIOs used as lines. The gpio specifier for this property
depends on the gpio controller to which these lines are connected.
linux,keymap: true
poll-interval: true
settling-time-us: true
wakeup-source: true
required:
- compatible
- line-gpios
- linux,keymap
- poll-interval
additionalProperties: false
examples:
- |
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
keyboard {
compatible = "gpio-charlieplex-keypad";
debounce-delay-ms = <20>;
poll-interval = <5>;
settling-time-us = <2>;
line-gpios = <&gpio2 25 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)
&gpio2 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)
&gpio2 27 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>;
/* MATRIX_KEY(output, input, key-code) */
linux,keymap = <
/*
* According to wiring diagram above, if L1 is configured as
* output and HIGH, and we detect a HIGH level on input L0,
* then it means S1 is pressed: MATRIX_KEY(L1, L0, KEY...)
*/
MATRIX_KEY(1, 0, KEY_F1) /* S1 */
MATRIX_KEY(2, 0, KEY_F2) /* S2 */
MATRIX_KEY(0, 1, KEY_F3) /* S3 */
MATRIX_KEY(2, 1, KEY_F4) /* S4 */
MATRIX_KEY(1, 2, KEY_F5) /* S5 */
MATRIX_KEY(0, 2, KEY_F6) /* S6 */
>;
};