JOURNAL  OF  D 爲爲赛益盖鑒爲OF  TECHNOLOGY  卅謀
第26卷第1期2019年2月
Android 平台矩阵键盘的设计与实现
张建民I 黄思育°*
*收稿日期:2018-11 -12
基金项目:泉州市科技计划项目(2014Z135)。
作者简介:张建民( 1975—),男,河南开封人,高级工程师,硕士,主要从事Linux 内核驱动及应用开发研究。
*通讯作者:黄思育(1976—),女,福建泉州人,实验师.硕士,主要从事前端技术与移动开发研究:Email : 70404342@qq
(1.深圳电器公司技术中心,广东深圳518000;
2.泉州师范学院数学与计算机科学学院,福建泉州362000)
摘要:随着终端智能化的快速发展,矩阵键盘在工控类终端中得到了广泛应用〉介绍了工控终端的软硬
件平台,使用I2C 接口的TCA8418芯片来扩展矩阵键盘,在Linux4. 4内核中对矩阵键盘驱动进行了适配,在
Android6. 0平台上实现了矩阵键盘的功能;通过功能测试验证了工控终端实体按键的功能:釆用的方法较好
地解决了嵌入式硬件平台扩展矩阵键盘的设计问题,为工控终端的实体按键设计提供了可靠的方法
关键词:Android;工控终端;矩阵键盘
中图分类号:TP39 文献标志码:A  文章编号:1009 - 0312 ( 2019 ) 01 -0057 - 06
随着终端智能化的快速发展,矩阵键盘在工控类终端中得到了广泛应用:「7;矩阵键盘作为一种人
机交互接口,便于用户快捷地操作终端,提高工作效率。Android 是一种基于Linux 的开源操作系
统主要用于智能手机、平板电脑、工控终端等产品;Android 系统自带虚拟键盘,但屏幕的大小
和触屏灵敏度直接影响虚拟键盘的使用效率和用户体验,一旦触摸屏失灵,虚拟键盘将不能使用。在稳
定性和可靠性较高的工业控制领域,虚拟键盘并不是最佳选择。
采用I2C 接口的TCA8418芯片来扩展矩阵键盘,在Linux4. 4内核中对矩阵键盘驱动进行了适配,
在Android6. 0平台上实现了矩阵键盘的功能,满足了工控终端高稳定性和高可靠性的要求。
1工控终端的软硬件平台
1. 1工控终端的硬件平台
工控终端矩阵键盘芯片采用美国TI 公司的TCA8418,该芯片是一款具有集成ESD 保护的8行10列
的键盘扫描器件,具有18个GPIO,这些GPIO 可通过I2C 接口支持多达80个按键;当按键按下时,
该芯片进行消抖处理,并存储按键按压和释放事件的10字节FIFO,该FIFO 借助溢出绕回功能可存储
多达10个按键事件。
工控终端硬件平台由瑞芯微RK3399六核ARM 处理器、2GB  LPDDR3内存、32GB  eMMC 闪存、5
英寸液晶屏/触摸屏、1300万像素摄像头、AP6356S  WIFI/BT 芯片、ALC5640音频芯片、RK808电源管
理芯片、USB/OTG 等部分组成;矩阵键盘芯片TCA8418通过12C 总线与RK3399处理器相连,工控终 端的硬件平台如图1所示。1.2工控终端的软件平台
工控终端软件平台采用Android6. 0系统,由Linux 内核、Android 运行时和库、应用程序框架、应
用程序四个层次组成9-"]o  Linux 内核已包括显示驱动、摄像头驱动、触摸屏驱动、音频驱动、USB 驱
动、WIFI/BT 驱动、电源管理等;Android 运行时和库包括界面管理器、媒体框架、SQLite 、WebKit 、 libc 、核心库、Dalvik 虚拟机等;应用程序框架包括活动管理器、窗口管理器、内容提供者、通知管理
器、位置管理器等;应用程序包括主程序、联系人、电话、浏览器、小部件等。工控终端的软件平台如
泉州师范学院58东莞理工学院学报2019年
LPDDR3内存EMMC闪存USB/OTG
USB
DDR3EMMC
5英寸液晶屏/
触摸屏n MIPI
I2C RK808
瑞芯微RK3399
六核ARM处理器
电源管理芯片
1300万像素
、MIP]I2S ALC5640"佞克摄像头I2C一音频芯片一丽器
SDIO UART I2C
AP6356S TCA8418
WIFI/BT芯片矩阵键盘芯片
图1工控终端的硬件平台
图2所示。
应用程序
iifi'Jr-联系人电话浏览器/卜部件|
活动管理器
应用程序框架
窗[1管理懸内容提供者通知管理器电话管理器位置管理器…
r
1Android运行时
界面管理器,媒体框架SQLite1
1
核心库
WebKit libc…1Dalvik虚拟机
Linux内核
显示驱动蓝牙驱动触摸屏驱动音频驱动电源管理
WIFI驱动摄像头驱动闪存驱动USB驱动...
图2工控终端的软件平台
2Android平台矩阵键盘的功能实现
工控终端采用Android6.0系统,具有4行3列的矩阵实体按键功能(数字0~数字9、星号、井号);矩阵
键盘芯片TCA8418的设备驱动在Linux4.4内核中进行适配,键值映射在Android6.0系统文件中进行配置。每部分的设计与实现简述如下。
2.1矩阵键盘Linux驱动适配
在Linux4.4内核中,采用设备树对硬件资源进行描述,设备树可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO 使用情况、Clock控制器和Clock使用情况等。
TCA8418芯片设备从地址为0x34;TCA8418芯片与RK3399处理器的I2C4控制器相连,总线时钟为100kHz。矩阵键盘芯片的硬件资源需在目录树源文件中进行描述,在Linux4.4源码中到arch/ ann64/boot/dts/rockchip/rk3399-android-6.0.dtsi文件,加入以下内容:
第1期张建民,等:Android平台矩阵键盘的设计与实现59
&i2c4|
status="okay";
clock-frequency=<100000>;
tca8418:tca8418@34|
compatible="ti,tca8418";
interrupt一parent=<&gpiol>;
interrupts=<23IRQ_TYPE_LEVEL_LOW>;
reg=<0x34>;
keypad,num一rows=<4>;
keypad, num-columns二<3>;
linux,keymap=<0x00000201
0x00010202
0x00020203
0x01000204
0x01010205
0x01020206
0x02000207
0x02010208
0x02020209
0x0300020a
0x03010200
0x0302020b>;
I;
I
Linux4.4内核源码中已包含TCA8418芯片的设备驱动,代码文件包括drivers/input/keyboard/ tca8418_
keypad,c和include/linux/input/tca8418_keypad,h;在arch/arm64/configs/rockchip_defconfig配置文件中加入CONFIG_KEYBOARD_TCA8418=y,TCA8418芯片设备树与设备驱动通过以下代码自动匹配:
#ifdef CONFIG.OF
static const struct of_devicetca8418_dt_ids[]=|
Ipatible="ti,tca8418",1,//和设备树中的compatible必须一致
I I
I;
MODULE_DEVICE_TABLE(of,tca8418_dt.ids);
#endif
static struct i2c_driver tca8418_keypad_driver二|
.driver=|
.name=TCA8418.NAME,
.of_match_table=of_match_ptr(tca8418_dt_ids),
I,
.probe=tca8418_keypad_probe,
.id.table=tca8418_id,
i;
2.2Android键值映射
Android6.0输入事件的源头是位于/dev/i叩ut/下的设备节点,而输入系统的终点是由WindowMan-agerService管理的某个窗口。最初的输入事件是Linux4.4内核生成的原始事件,而最终交付给窗口的则是KeyEvent或MotionEvent对象。因此Android6.0输入系统的主要工作是读取设备节点中的原始事件,
60东莞理工学院学报
2019 年
将其加工封装,然后派发给一个特定的窗口以及窗口中的控 件。
当按键被按下或释放时,Linux  Event 设备/dev/input/
eventX ,产生按键扫描码ScanCode  (整数类型);Android
framework 层通过按键布局文件(keylayout )将按键扫描码转
换成按键标签KeycodeLabel  (字符串);Android 应用层通过按
键码转化,将按键标签转化成相应的按键码keyCode  (整型
数)。键值上报的流程如图3所示。
矩阵键盘芯片TCA8418的Android 键值映射过程如下。1 )按键的扫描码在Linux4. 4驱动里面被映射为kernel/in- clude/ uapi/linux/input  - event  - codes, h  里面定义的某个键值,
但这个键值只在Linux 内核中使用,数字0〜数字9、星号、 井号的定义如下:
按键码KeyCode  (整型数)
图3键值上报流程
#define  KEY_NUMERIC_POUND  0x20b  / * 丼号 * /
#define  KEY_NUMERIC_00x200/*数字0
*/#define  KEY_NUMERIC_10x201/*数字1 */#define  KEY_NUMERIC_2
0x202/*数字2*
/#define  KEY_NUMERIC_30x203
/ *数字3 */#define  KEY_NUMERIC_40x204/ *数字4 */
#define  KEY_NUMERIC_5
0x205
/*数字5*
/#define  KEY_NUMER1C_60x206/ *数字6 */#define  KEY_NUMERIC_7
0x207/ *数字7 */
#define  KEY_NUMERIC_80x208
/*数字8 */
#define  KEY_NUMERIC_9
0x209
/ *数字9 */
#define  KEY_NUMER1C_STAR  0x20a  / * 星号 * /
2) Androi (16. 0 源码目录下的 device/rockchip/common/tca8418_keypad. kl  文件完成
Linux 键值到Android 系统键值的映射,tca8418_keypad. kl 配置文件内容如下:
key  0x200key  0x201key  0x202key  0x203key  0x204key  0x205key  0x206key  0x207key  0x208key  0x209
key  0x20a
key  0x20b
1
2
34
5
6
7
8
9
STAR
POUND
3) Android6. 0 源码目录下的 framework/native/include/input/InputEventLabels. h
文件定义了按键标签转化成相应的按键码keyCode,具体定义如下:
#define  DEFINE_KEYCODE( key ) | #key, AKEYCODE_##key  |
struct  InputEventLabel  |
const  char  * literal  ;int  value ;
I ;
static  const  InputEventLabel  KEYCODES [ ] = |
DEFINE_KEYCODE(0)
,
第1期张建民,等:Android平台矩阵键盘的设计与实现61
DEFINE_KEYCODE(1),
DEFINE_KEYCODE(2),
DEFINE_KEYC0DE(3),
DEFINE_KEYC0DE(4),
DEFINE_KEYC0DE(5),
DEFINE_KEYCODE(6),
DEFINE_KEYC0DE(7),
DEFINE_KEYC0DE(8),
DEFINE_KEYCODE(9),
DEFINE_KEYCODE(STAR),
DEFINE_KEYCODE(POUND),
Android6.0源码目录下的frameworks/native/include/android/keycodes.件定义了Android按键码keyCode的具体定义。
enum
AKEYCODE.O=7,
AKEYCODE_1=8,
AKEYCODE_2=9,
AKEYCODE_3=io.
AKEYCODE_4=H,
AKEYCODE_5=12,
AKEYCODE_6=13,
AKEYCODE_7=14,
AKEYC()DE_8=15,
AKEYCODE_9=16,
AKEYCODE.STAR=17,
AKEYCODE_POUND=18,
3功能测试
在Android开发的计算机平台上,编译工控终端定制的Android6.0系统,将编译好的系统镜像文件烧写到工控终端,重启工控终端加载Android6.0系统。在计算机上安装adb工具,通过micro usb调试线缆连接工控终端,在计算机上输入adb shell命令连接到工控终端,矩阵键盘芯片TCA8418在Linux4.4内核中对应的设备为/dev/input/eventO,如果设备eventO存在,则说明TCA8418芯片已被探测到,并且加载了其设备驱动;使用android系统中的getevent工具验证工控终端矩阵键盘功能是否正常。
在adb shell提示符"shell@gkzd:/#"下输入getevent-1/dev/input/eventO,当按下或释放数字0 ~数字9、星号、井号实体按键时,均能正确上报按键的事件类型、事件代码、事件值等信息;通过这些信息可得出实体按键扫描码、按键标签、按键码的对应关系,如表1所示。
表1实体按键扫描码、按键标签、按键码的对应关系
实体按键名称扫描码(整数)按键标签(字符串)按键码(整数)数字1KEY_NUMERIC,1(0x201)18
数字2KEY_NUMERIC.2(0x202)29
数字3KEY_NUMERIC.3(0x203)310
数字4KEY_NUMERIC.4(0x204)411
数字5KEY NUMERIC.5(0x205)512