专栏中心

EEPW首页 > 专栏 > 嵌入式Linux下矩阵键盘应用

嵌入式Linux下矩阵键盘应用

发布人:toradex 时间:2017-08-23 来源:工程师 发布文章

By Toradex 胡珊逢

1). 简介

触摸屏,无论是电阻式还是电容式,在嵌入式领域有着广泛的使用。配合设计优秀的 GUI,能够给用户带来很好的体验。很多时候,触摸屏在使用之前都需要进行校准,并且当外界的温度发生变化时,可能需要重新校准。对于电容屏还会受到静电的干扰。因此在工业设备上,为了保证输入的准确性,矩阵键盘仍被广泛地使用。

 

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

Toradex  iMX6计算机模块,根据不同的系列支持部分按键,Colibri iMX6  5*5Apalis iMX67*6。下面我们将以Colibri iMX6 Linux 4.1.41为例,介绍矩阵键盘的应用。

 

本文所演示的平台来自于Toradex Colibri iMX6嵌入式平台,其支持的最大矩阵键盘为5*5,而Toradex另一个产品系列Apalis系列则最大支持7*6

 

2). 准备

a).Colibri iMX6 ARM核心版配合Colibri Evaluation Board载板,连接调试串口到开发主机,具体操作方法可以参考这里

b).Colibri iMX6操作系统使用Toradex Linux Release V2.7b3,下载和更新方法请参考这里

 

3). 配置KPP驱动并测试

a). 默认配置下,KPP 驱动并没有开启,需要修改imx6dl-colibri-eval-v3.dtsimx6qdl-colibri.dtsi device tree 文件。你可以直接使用下面的补丁,修改矩阵键盘的配置。

ftp://ftp.toradex.cn/Documents/ApplicationNote/resources/matrix_keypad.patch

 

b). 然后重新生成dtb文件,并更新到Colibri iMX6后重启。

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

$ 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 pointer                           id=2 [master pointer  (3)]

?? Virtual core XTEST pointer                  id=4 [slave  pointer  (2)]

??stmpe-ts     id=8 [slave  pointer  (2)]

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

? Virtual core XTEST keyboard                    id=5 [slave  keyboard (3)]

?gpio-keys                               id=6 [slave  keyboard (3)]

?20b8000.kpp         id=7 [slave  keyboard (3)]

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

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

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

pinctrl_kppkppgrp {

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 {

structtimeval time;

__u16 type;//类型

__u16 code;//键值

__s32 value;//按下还是释放

};

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

b). 具体请参考下面的源码

ftp://ftp.toradex.cn/Documents/ApplicationNote/resources/maxtrix_keypad_test.c

 

// 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)章节。


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

AT91M63200 ARM7处理器

AT91M40X ARM7处理器

ASIC大军强袭 黄仁勋一招NVLink Fusion化敌为友

AT91M40400 ARM7处理器

意法半导体推出内置边缘AI的超低功耗工业级加速度计,面向免维护智能感测应用

联发科技校园软件大赛——不知营养差不多

视频 2011-01-04

联发科技校园软件大赛——八月的天空

视频 2011-01-04

川崎机器人:百年技术赋能中国智造

投资“人形机器人”前的五个问题

AT91M55800A ARM7处理器

光电异质集成公司「英伟芯科技」获中科创星数千万元天使轮独家投资

联发科技校园软件大赛——千机变

视频 2011-01-04

稳压二极管应用电路

英伟达将于第三季度推出下一代 GB300 人工智能系统

案例+图文 | 轻松搞定DC-DC升压原理

联发科技校园软件大赛——无名

视频 2011-01-04

AT91M42800A ARM7处理器

电路板GND与外壳GND之间接一个电阻一个电容,为什么?

EDA/PCB 2025-05-19

瑞萨电子推出RZ/A3M,面向经济型高性能HMI解决方案扩展RZ/A MPU产品线

嵌入式系统 2025-05-19

联发科技校园软件大赛——低调XD

视频 2011-01-04
更多 培训课堂
更多 焦点
更多 视频

技术专区