资讯详情

嵌入式Linux下矩阵键盘应用

ByToradex胡珊逢

1).简介

触摸屏广泛应用于嵌入式领域,无论是电阻式还是电容式。设计精良GUI,它能给用户带来良好的体验。大多数情况下,触摸屏在使用前需要校准,当外部温度发生变化时,可能需要重新校准。电容器屏幕也会受到静电的干扰。因此,矩阵键盘仍被广泛应用于工业设备中,以确保输入的准确性。

通过轮询矩阵键盘的行列控制器GPIO获取按钮。Linux多任务非实时操作系统,其它任务的执行会影响矩阵键盘轮询,导致按键识别错误。本文所演示的嵌入式平台基于NXP iMX6SoC,带键盘控制器KPP,除实现轮询矩阵键盘外,还支持自带上拉电阻、抖动、多键识别、长按等功能。直接用户GPIO无需添加电阻和二极管电阻和二极管。如果使用二极管,还可以支持更多的按键组合。默认的KPP最大支持8*8矩阵键盘。

Toradex的iMX根据不同系列的支持部分按钮,计算机模块,ColibriiMX6为5*5,ApalisiMX6为7*6.下面我们将以ColibriiMX6 Linux 4.1.以41为例,介绍矩阵键盘的应用。

本文演示的平台来自ToradexColibriiMX6嵌入式平台,支持5个最大矩阵键盘*5,而Toradex另一个产品系列Apalis该系列最大支持7*6。

2).准备

a).iMX6核心版配合载板,将调试串口连接到开发主机,具体操作方法可参考。

b).ColibriiMX6使用操作系统ToradexLinux Release V2.7b请参考下载和更新方法。

3).配置KPP驱动并测试

a).默认配置下,KPP驱动尚未打开,需要修改imx6dl-colibri-eval-v3.dts和imx6qdl-colibri.dtsi device tree文件。您可以直接使用以下补丁来修改矩阵键盘的配置。

b).然后重生dtb并更新文件ColibriiMX6后重启。

--------------------------------

$ make imx6dl-colibri-eval-v3.dtb

--------------------------------

c).在启动日志中可以看到KPP驱动被加载

--------------------------------

root@colibri-imx6:/dev/input#dmesg|grepkpp

[1.551426] input: 20b8000.kpp as /devices/soc0/soc/2000000.AIps-bus/20b8000.kpp/input/input0

--------------------------------

d). Linux输入设备识别KPP

--------------------------------

root@colibri-imx6:~#xinput

?Virtual core pointerid=2[masterpointer(3)]

??Virtual core XTEST pointerid=4[slavepointer(2)]

??stmpe-tsid=8[slavepointer(2)]

?Virtual core keyboardid=3[master keyboard (2)]

?Virtual core XTEST keyboardid=5[slavekeyboard(3)]

?gpio-keysid=6[slavekeyboard(3)]

?20b8000.kppid=7[slavekeyboard(3)]

--------------------------------

e).根据在device tree中的GPIO配置,短接任一对ROW和KEY按钮可以模拟引脚。

--------------------------------

pinctrl_kpp:kppgrp{

fsl,pins= <

MX6QDL_PAD_KEY_ROW2__KEY_ROW2 0x1b010/*SODIMM 186*/

MX6QDL_PAD_KEY_ROW4__KEY_ROW4 0x1b010/*SODIMM188*/

MX6QDL_PAD_CSI0_DAT5__KEY_ROW5 0x1b010/*SODIMM155*/

MX6QDL_PAD_GPIO_2__KEY_ROW6 0x1b010/*SODIMM180*/

MX6QDL_PAD_GPIO_5__KEY_ROW7 0x1b010/*SODIMM176*/

MX6QDL_PAD_KEY_COL2__KEY_COL2 0x110b0/*SODIMM184*/

MX6QDL_PAD_KEY_COL4__KEY_COL4 0x110b0/*SODIMM178*/

MX6QDL_PAD_GPIO_19__KEY_COL5 0x110b0/*SODIMM168*/

MX6QDL_PAD_CSI0_DAT6__KEY_COL6 0x110b0/*SODIMM157*/

MX6QDL_PAD_GPIO_4__KEY_COL7 0x110b0/*SODIMM174*/

>;

--------------------------------

f).通过evtest命令,查看按键值,以及是否属于长按等信息。

--------------------------------

root@colibri-imx6:~#evtest

No device specified, trying to scan all of /dev/input/event*

Available devices:

/dev/input/event0:20b8000.kpp

/dev/input/event1:stmpe-ts

/dev/input/event2:gpio-keys

Select the device event number [0-2]: 0

Input driver version is 1.0.1

Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0

Input device name: "20b8000.kpp"

...

Testing ... (interrupt to exit)

Event: time 1502961213.623148, type 4 (EV_MSC), code 4 (MSC_SCAN), value 12

Event: time 1502961213.623148, type 1 (EV_KEY), code 2 (KEY_1), value 1

Event: time 1502961213.623148, -------------- SYN_REPORT ------------

Event: time 1502961213.873096, type 1 (EV_KEY), code 2 (KEY_1), value 2

Event: time 1502961213.873096, -------------- SYN_REPORT ------------

Event: time 1502961213.913117, type 1 (EV_KEY), code 2 (KEY_1), value 2

Event: time 1502961213.913117, -------------- SYN_REPORT ------------

Event: time 1502961213.953088, type 1 (EV_KEY), code 2 (KEY_1), value 2

Event: time 1502961213.953088, -------------- SYN_REPORT ------------

Event: time 1502961213.963156, type 4 (EV_MSC), code 4 (MSC_SCAN), value 12

Event: time 1502961213.963156, type 1 (EV_KEY), code 2 (KEY_1), value 0

--------------------------------

4). KPP应用程序开发示例

a).在应用程序中使用structinput_event读取按钮信息。

--------------------------------

structinput_event{

structtimevaltime;

__u16 type;//类型

__u16 code;//键值

__s32 value;//按下或释放

};

--------------------------------

b).请参考以下源码

//input_event按键值,按键,保持,释放动作。

-------------------------------

root@colibri-imx6:~# ./maxtrix_keypad_test

25 keys.

Press any key.

Key press

Code: 7

Key release

Code: 7

Key press

Code: 7

Key hold

Code: 7

Key hold

Code: 7

Key hold

Code: 7

Key hold

Code: 7

Key hold

Code: 7

Key release

Code: 7

--------------------------------

5).总结

KPP还具有其他功能,利于识别组合键、消除ghost key等,矩阵键盘电路也需要做一些修改,如使用二极管,具体的参考IMX6SDLRM文档中Chapter 39Keypad Port (KPP)章节。

标签: dts二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台