mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 07:51:31 -04:00
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:
committed by
Dmitry Torokhov
parent
906a37ba54
commit
0d64bee764
@@ -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 */
|
||||
>;
|
||||
};
|
||||
Reference in New Issue
Block a user