Linux矩阵键盘

背景

  • Platform: M55S
  • OS: Linux
  • Kernel: 4

需求:

项目需要添加一个类似电话机的那种矩阵键盘,开始打算自己写个扫描算法,后面发现内核自带。

过程

matrix-keypad(内核自带驱动): drivers/input/keyboard/

matrix-keypad的GPIO口上拉:

Godshand -w -a 0xB3F000B0 -v 0x55555000
注: 这个需要根据自己的硬件平台添加, 这个很重要,可能会导致键值不对或乱码

内核menuconfig添加驱动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    DeviceDrivers --->
Inputdevice support --->
<*> Event interface
Keyboards --->
<*> GPIO driven matrix keypad support
```
### DTS配置
说明见下面注释,也可查看doc
```dts
matrix_keypad: matrix-keypad {
status = "disable";
compatible = "gpio-matrix-keypad";
keypad,num-rows = <4>;
keypad,num-columns = <4>;

/* 根据实际硬件配置引脚 */
col-gpios = <&gpio2 19 1
&gpio2 16 1
&gpio2 22 1
&gpio2 21 1
>;
row-gpios = <&gpio2 15 1
&gpio2 20 1
&gpio2 17 1
&gpio2 18 1
>;

/* sample keymap 键值 */
/* row << 24 | column << 16 | key-code */
linux,keymap = <
0x0000004f /* row 0, col 0, KEY_KP1 */
0x0001004b /* row 0, col 1, KEY_KP4 */
0x00020047 /* row 0, col 2, KEY_KP7*/
0x0003003c /* row 0, col 3, */
0x01000050 /* row 1, col 0, KEY_KP2 */
0x0101004c /* row 1, col 1, KEY_KP5*/
0x01020048 /* row 1, col 2, KEY_KP8*/
0x01030052 /* row 1, col 3, KEY_KP0*/
0x02000051 /* row 2, col 0, KEY_KP3 */
0x0201004d /* row 2, col 1, KEY_KP6 */
0x02020049 /* row 2, col 2, KEY_KP9*/
0x0203003b /* row 2, col 3, # */
0x0300001f /* row 3, col 0, S */
0x0301003e /* row 3, col 1, */
0x0302001e /* row 3, col 2, A */
0x03030013 /* row 3, col 3, R */
>;

gpio-activelow;
/*wakeup-source;*/
debounce-delay-ms = <30>;
col-scan-delay-us = <100>;
linux,no-autorepeat;
};

测试

  1. 自己写测试代码
  2. 使用input event事件分析工具: evtestgetevent(android中提取)
Donate comment here