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