| # 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 */ | |
| >; | |
| }; |