109 lines
3.4 KiB
YAML
109 lines
3.4 KiB
YAML
# 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 */
|
|
>;
|
|
};
|