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