一般按键驱动有两种,一种是矩阵键盘驱动,一个是GPIO接口键盘驱动
矩阵键盘路径:drivers/input/keyboard/matrix_keypad.c(一般用于多按键情况)
GPIO接口键盘路径:kernel/driers/input/keyboard/gpio_keys.c(一般用于少按键情况)
这里使用的平台和内核版本是TQIMX6UL+Linux-4.1.4
1、使用内核自带矩阵键盘驱动需要在linux内核配置里选上相关的配置。在内核源码目录下:
#make menuconfig ARCH=arm
Device Drivers --->
Input device support --->
[*] Keyboards --->
<*> GPIO driven matrix keypad support
选上配置之后重新编译会将drivers/input/keyboard/matrix_keypad.c编译成.o,重新烧写内核文件启动ARM板
2、修改设备树,添加4*4矩阵按键
&kpp {
compatible = "gpio-matrix-keypad";//矩阵按键驱动名字
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_key>; //按键IO配置
debounce-delay-ms = <20>; //消抖
col-scan-delay-us = <20>; //扫描延时
/*4行*/
row-gpios = <&gpio1 27 GPIO_ACTIVE_LOW
&gpio1 23 GPIO_ACTIVE_LOW
&gpio5 4 GPIO_ACTIVE_LOW
&gpio4 22 GPIO_ACTIVE_LOW>;
/*4列*/
col-gpios = <&gpio4 27 GPIO_ACTIVE_LOW
&gpio1 22 GPIO_ACTIVE_LOW
&gpio5 8 GPIO_ACTIVE_LOW
&gpio5 7 GPIO_ACTIVE_LOW>;
linux,keymap = <0x00000002
0x00010003 //KEY_2 3
0x00020004 //KEY_3 4
0x00030067 //KEY_UP 103
0x01000005 //KEY_4 5
0x01010006 //KEY_5 6
0x01020007 //KEY_6 7
0x0103004C //KEY_DOWN 108
0x02000008 //KEY_7 8
0x02010009 //KEY_8 9
0x0202000A //KEY_9 10
0x02030069 //KEY_LEFT 105
0x03000005 //KEY_ESC 5
0x0301000B //KEY_0 11
0x0302001C //KEY_ENTER 28
0x0303006A //KEY_RIGHT 106
>;
gpio-activelow; //这个一定要加上,不然测试时按键会一直挂起
status = "okay";
};
配置
pinctrl_key: kpp_grp{
fsl,pins = <
/*row*/
MX6UL_PAD_CSI_DATA06__GPIO4_IO27 0xb0b1
MX6UL_PAD_UART2_CTS_B__GPIO1_IO22 0xb0b1
MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0xb0b1
MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0xb0b1
/*col */
MX6UL_PAD_UART3_RTS_B__GPIO1_IO27 0x70a1
MX6UL_PAD_UART2_RTS_B__GPIO1_IO23 0x70a1
MX6UL_PAD_SNVS_TAMPER4__GPIO5_IO04 0x70a1
MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0x70a1
>;
};
原理图
3、添加矩阵按键驱动、修改设备树之后,接下来就是调试
查看输入设备,event0是矩阵按键设备,event1是普通按键设备,event2 是电阻屏触摸设备
[root@Embedsky ]# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="20b8000.kpp"
P: Phys=
S: Sysfs=/devices/platform/soc/2000000.aips-bus/20b8000.kpp/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=100013
B: KEY=680 1000 0 10000ffc
B: MSC=10
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio-keys"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/platform/gpio-keys/input/input2
U: Uniq=
H: Handlers=kbd event1
B: PROP=0
B: EV=3
B: KEY=e
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="Resistive_ts"
P: Phys=
S: Sysfs=/devices/platform/soc/2000000.aips-bus/2040000.tsc/input/input3
U: Uniq=
H: Handlers=mouse0 event2
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=3
[root@Embedsky ]#
//hexdump命令一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件
hexdump /dev/input/event0 —按按键查看按键扫描码
这里另外有一个矩阵按键的测试程序,可以打印按下弹起状态及查看键值
到此可验证矩阵键盘正常使用。
调试坑坑:
a.一般先将使用到的IO口设为普通IO,验证可控
b.gpio-activelow;参数如果不加上会在<hexdump /dev/input/event0 —按按键查看按键扫描码>时输出一堆乱码
c.0x00030067 //KEY_UP 103
0x00 03 0067 代表第0行第3列,0067是KEY_UP的键值【在input.h可以查询,可根据自己情况选择按键】103的十进制是67
d.行列io注意不能反