xref: /linux/Documentation/devicetree/bindings/input/gpio-charlieplex-keypad.yaml (revision 429e6c7f90d12a8551b3eaa9faca7cfaefd99b1d)
1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2%YAML 1.2
3---
4
5$id: http://devicetree.org/schemas/input/gpio-charlieplex-keypad.yaml#
6$schema: http://devicetree.org/meta-schemas/core.yaml#
7
8title: GPIO charlieplex keypad
9
10maintainers:
11  - Hugo Villeneuve <hvilleneuve@dimonoff.com>
12
13description: |
14  The charlieplex keypad supports N^2)-N different key combinations (where N is
15  the number of I/O lines). Key presses and releases are detected by configuring
16  only one line as output at a time, and reading other line states. This process
17  is repeated for each line. Diodes are required to ensure current flows in only
18  one direction between any pair of pins, as well as pull-up or pull-down
19  resistors on all I/O lines.
20  This mechanism doesn't allow to detect simultaneous key presses.
21
22  Wiring example for 3 lines keyboard with 6 switches and 3 diodes (pull-up/down
23  resistors not shown but needed on L0, L1 and L2):
24
25  L0  --+---------------------+----------------------+
26        |                     |                      |
27  L1  -------+-----------+---------------------+     |
28        |    |           |    |                |     |
29  L2  -------------+----------------+-----+    |     |
30        |    |     |     |    |     |     |    |     |
31        |    |     |     |    |     |     |    |     |
32        |  S1 \  S2 \    |  S3 \  S4 \    |  S5 \  S6 \
33        |    |     |     |    |     |     |    |     |
34        |    +--+--+     |    +--+--+     |    +--+--+
35        |       |        |       |        |       |
36        |    D1 v        |    D2 v        |    D3 v
37        |       - (k)    |       - (k)    |       - (k)
38        |       |        |       |        |       |
39        +-------+        +-------+        +-------+
40
41  L: GPIO line
42  S: switch
43  D: diode (k indicates cathode)
44
45allOf:
46  - $ref: input.yaml#
47  - $ref: /schemas/input/matrix-keymap.yaml#
48
49properties:
50  compatible:
51    const: gpio-charlieplex-keypad
52
53  autorepeat: true
54
55  debounce-delay-ms:
56    default: 5
57
58  line-gpios:
59    description:
60      List of GPIOs used as lines. The gpio specifier for this property
61      depends on the gpio controller to which these lines are connected.
62
63  linux,keymap: true
64
65  poll-interval: true
66
67  settling-time-us: true
68
69  wakeup-source: true
70
71required:
72  - compatible
73  - line-gpios
74  - linux,keymap
75  - poll-interval
76
77additionalProperties: false
78
79examples:
80  - |
81    #include <dt-bindings/gpio/gpio.h>
82    #include <dt-bindings/input/input.h>
83
84    keyboard {
85        compatible = "gpio-charlieplex-keypad";
86        debounce-delay-ms = <20>;
87        poll-interval = <5>;
88        settling-time-us = <2>;
89
90        line-gpios = <&gpio2 25 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)
91                      &gpio2 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)
92                      &gpio2 27 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>;
93
94        /* MATRIX_KEY(output, input, key-code) */
95        linux,keymap = <
96            /*
97             * According to wiring diagram above, if L1 is configured as
98             * output and HIGH, and we detect a HIGH level on input L0,
99             * then it means S1 is pressed: MATRIX_KEY(L1, L0, KEY...)
100             */
101            MATRIX_KEY(1, 0, KEY_F1) /* S1 */
102            MATRIX_KEY(2, 0, KEY_F2) /* S2 */
103            MATRIX_KEY(0, 1, KEY_F3) /* S3 */
104            MATRIX_KEY(2, 1, KEY_F4) /* S4 */
105            MATRIX_KEY(1, 2, KEY_F5) /* S5 */
106            MATRIX_KEY(0, 2, KEY_F6) /* S6 */
107        >;
108    };
109