按键从Linux到Android <1>

按键从Linux到Android
 
  现在的普通按键也集成到Linux Input子系统中了,只需要把按键对应的IO端口配置好,按键就可以工作了。所以一般提供的BSP(或者叫作解决方案)中,已经完善了按键驱动。关键是快速的了解按键的映射。所以这里不作源码级分析。源码分析可以参考这里:《基于S3C2440的Linux-3.6.6移植——按键驱动
  

Linux按键的扫描码

  扫描码是Linux Input系统中规定的码值,好比PC键盘上每个键的键值。都是数字。
在设备上输入一下命令后,按键可以探测到得到每个按键的扫描码Code.
  root@android:/ # busybox hexdump /dev/input/event0 
  
  

Android 与 Linux分隔线

  Android也定义了一套码,叫作键盘码,通过一个/system/usr/keylayout/来将两套码对应起来。目前调试的是全志的A10的BSP包。这里用的是sun4i-keyboard.kl。(如果没有其它*.kl,则是默认的qwerty.kl
  
  Linux上传的Code是0x00d9对应10进制217,打开sun4i-keyboard.kl后可以看到映射关系:
  
  可以看出对应的是BRIGHTNESS_DOWN,Android中只认BRIGHTNESS_DOWN(这里成为字串),Linux中的Code至此为止。  (在Android源码中也能找到这个映射文件可以依名字搜索找到其位置)
  

Android源码中添加该按键

  如果Android中frameworks/base/core/java/android/view/KeyEvent.java有要添加的功能,比如HOME,则只修改*.kl映射按键即可修改或者添加映射。
  
  如果KeyEvent.java中本没有要添加按键的功能,就可以在KeyEvent.java的KeyEvent类最后依葫芦画瓢添加:
  
  如不知道功能的键盘码是多少可以到这里找到。
  
  然后根据KeyEvent类最后的添加键提示,每个文件都添加上:
    // NOTE: If you add a new keycode here you must also add it to:
    //  isSystem()
    //  frameworks/base/native/include/android/keycodes.h
    //  frameworks/base/include/ui/KeycodeLabels.h
    //  external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
    //  frameworks/base/core/res/res/values/attrs.xml
    //  emulator?
    //  LAST_KEYCODE
    //  KEYCODE_SYMBOLIC_NAMES
    //
    //  Also Android currently does not reserve code ranges for vendor-
    //  specific key codes.  If you have new key codes to have, you
    //  MUST contribute a patch to the open source project to define
    //  those new codes.  This is intended to maintain a consistent
  //  set of key code definitions across all Android devices.
  添加后,Android应用程序就可以通过onKeyDown检测到了检测到这个按键了。至于这个按键具体功能的实现比如这里的BRIGHTNESS_DOWN(亮度减)功能,要修改frameworks/base/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java。根据具体需求实现。
  

关于重启(Reset)键

  这个“按键”一般是通过直接连接CPU芯片上的复位实现重启功能的。这个直接操作的是CPU,Android(或者Linux)是无法去检测和控制这个“按键”的。
 

20140306更新:

今天再次遇到同样的问题,为Android添加按键。平台是rk30Android版本是4.2.2。遇到了一些新问题和新的挑战,花费一天时间添加完毕。且做了完整的规划。CAMERAOTHAER键为例。

 

1.确认内核层的键值码

     进入adb shell,使用toolbox中的getevent工具:type code value。主要看type1时的code值是多少。

2.确认*.kl文件

     确认方法是交换V+ V-的键值码,结果是:自定义:rk29-keypad.kl,一般键盘是:Generic.klqwerty.kl已经被Generic.kl取代。

3.确认如何修改*.kl起效

     重启后

4.确认两个kl区别

     从里边内容可以大概分别出来rk29-keypad.kl决定新添加的,Generic.kl包含了所有的键,优先级低于rk29-keypad.kl,也就是两个kl文件可以同定义一个键值,但会以rk29-keypad.kl首先为准(如果rk29-keypad.kl中定义了,但是字串Android层没有处理比如”key 114   FUCK”,”FUCK”上层并没有处理,还是会去处理Generic.kl中的对应键串),所以新添加的键值都添加到rk29-keypad.kl中,Generic.kl是建议不动的。

注意事项:kl定义的键串必须是Android层进行处理的,如果有出现没有处理的键串会导致整个键盘都不能使用。如果是键盘只会读Generic.kl,而不会读rk29-keypad.kl。所以如果是一个特殊的键盘,那么要动手修改Generic.kl。这个是实践结果,具体源码还没有找到。

5.先打通一个已经半通的CAMERA

    CAMERA是上层已经完善的,在kl文件将新按键映射到的CAMERA(key 132 CAMERA),然后用一个apk来验证接收。结果OK

6.打通整个通道-添加OTHER键值

    在添加过程中还参考了篇文章《Android4.1添加新的按键(3)》,这里记录4.2.2中具体修改了哪些文件:

    external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h

    frameworks/base/api/current.txt

    frameworks/base/core/java/android/view/KeyEvent.java (两处)

    frameworks/base/core/res/res/values/attrs.xml

    frameworks/base/data/keyboards/Generic.kl

    frameworks/base/include/androidfw/KeycodeLabels.h

    frameworks/base/libs/androidfw/Input.cpp

    frameworks/native/include/android/keycodes.h

其中current.txt是在添加其它文件后执行make update-api编译自动修改的结果。关于Android上层在哪里解析的这个两个kl文件,要等下次更新了。

20140315更新:
  很快又用到这里的信息,今天是添加一个红外遥控的键值,结果也得修改Generic.kl,修改rk**.kl不行。就简单的记录到这里。
 
 
后面的<2>,<3>均载自该博客主,请注明它的出处,不要标记此文的链接.
 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3731288.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值