Android物理按键输入事件(一)

这两天因为项目需求,需要在android系统增加两个物理按键(WIFI/RESET ( Pin Hole )).下面以WIFI键为例,我们开始分析Android系统增加按键流程:

Android物理按键输入事件(一)_第1张图片

说明:本篇文章主要分析Android 内核部分


在介绍Android系统添加键值以前,先介绍INPUT子系统的流程.精简流程图如下

Android物理按键输入事件(一)_第2张图片

1.linux键值上报

1>linux-3.4/drivers/input/keyboard/sunxi-keyboard.c                                                                         

  ->static irqreturn_t sunxi_isr_key(int irq, void *dummy)

Android物理按键输入事件(一)_第3张图片

从方法 input_report_key(sunxikbd_dev, sunxi_scankeycodes[scancode], 0) ,我们可以看到上报的值 sunxi_scankeycodes[scancode]

2>linux-3.4/drivers/input/keyboard/sunxi-keyboard.c

Android物理按键输入事件(一)_第4张图片

查看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

Android物理按键输入事件(一)_第5张图片

sunxi_scankeycodes[KEY_MAX_CNT] 数组中定义了内核需要上报给系统的值,但是这些可以上报的值(比如:KEY_VOLUMEUP )定义在哪里呢?我们继续查看 sun8i-keyboard.h 源码

3>linux-3.4/include/linux/input.h

Android物理按键输入事件(一)_第6张图片

为了不让篇幅过长,这里只截取了部分


至此, linux层按键上报流程就分析了.                                                                                                    

总结一下:

1.linux内核通过扫码,将硬件上按键按下电压变换转为数字电压并且映射到数组下标             

2.通过 keypad_mapindex[64], sunxi_scankeycodes[KEY_MAX_CNT] 两个数组关系转化将按键映射到内核中预定义的键值                                                                                                       

3.最终linux内核上报给上层的就是一个 整形值

Android物理按键输入事件(二)

你可能感兴趣的:(Android物理按键输入事件(一))