这两天因为项目需求,需要在android系统增加两个物理按键(WIFI/RESET (
Pin Hole
)).下面以WIFI键为例,我们开始分析Android系统增加按键流程:
说明:本篇文章主要分析Android 内核部分
在介绍Android系统添加键值以前,先介绍INPUT子系统的流程.精简流程图如下
1.linux键值上报
1>linux-3.4/drivers/input/keyboard/sunxi-keyboard.c
->static irqreturn_t sunxi_isr_key(int irq, void *dummy)
从方法 input_report_key(sunxikbd_dev, sunxi_scankeycodes[scancode], 0) ,我们可以看到上报的值 sunxi_scankeycodes[scancode]
2>linux-3.4/drivers/input/keyboard/sunxi-keyboard.c
查看sunxi-keyboard.c源码,我们可以看到scancode的值为 数组keypad_mapindex[64]中的值,对于该数组中0-7的理解:硬件上物理按键按下,电压变换通过模数转换,变成数字电压,我们将这里的电压变换范围分成64份,每一份对应一个电压值,假设每一份电压值为0.2,那么可以认为0-1.4之间电压变化时,我们就认为 key1 按下.
3>linux-3.4/drivers/input/keyboard/sun8i-keyboard.h
在 sunxi_scankeycodes[KEY_MAX_CNT] 数组中定义了内核需要上报给系统的值,但是这些可以上报的值(比如:KEY_VOLUMEUP )定义在哪里呢?我们继续查看 sun8i-keyboard.h 源码
3>linux-3.4/include/linux/input.h
为了不让篇幅过长,这里只截取了部分
至此, linux层按键上报流程就分析了.
总结一下:
1.linux内核通过扫码,将硬件上按键按下电压变换转为数字电压并且映射到数组下标
2.通过 keypad_mapindex[64], sunxi_scankeycodes[KEY_MAX_CNT] 两个数组关系转化将按键映射到内核中预定义的键值
3.最终linux内核上报给上层的就是一个 整形值
Android物理按键输入事件(二)