IMX6UL上添加支持矩阵按键

一般按键驱动有两种,一种是矩阵键盘驱动,一个是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
			>;
		};

原理图
IMX6UL上添加支持矩阵按键_第1张图片
IMX6UL上添加支持矩阵按键_第2张图片
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 —按按键查看按键扫描码
IMX6UL上添加支持矩阵按键_第3张图片
这里另外有一个矩阵按键的测试程序,可以打印按下弹起状态及查看键值
IMX6UL上添加支持矩阵按键_第4张图片
到此可验证矩阵键盘正常使用。
调试坑坑:
a.一般先将使用到的IO口设为普通IO,验证可控
b.gpio-activelow;参数如果不加上会在时输出一堆乱码
c.0x00030067 //KEY_UP 103
0x00 03 0067 代表第0行第3列,0067是KEY_UP的键值【在input.h可以查询,可根据自己情况选择按键】103的十进制是67
d.行列io注意不能反

你可能感兴趣的:(linux)