美文网首页Android开发
Android物理按键输入事件(一)

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

作者: 天空汁橙 | 来源:发表于2017-02-21 13:40 被阅读2823次

    这两天因为项目需求,需要在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物理按键输入事件(二)

    相关文章

      网友评论

        本文标题:Android物理按键输入事件(一)

        本文链接:https://www.haomeiwen.com/subject/bfiywttx.html