http://blog.sina.com.cn/s/blog_602f87700101he9v.html

(2013-11-26 10:11:09) 转载
标签:

kl

keylayout

a20

it

分类:Android
作者: Sam (甄峰)   sam_code@hotmail.com
最近需要在全志A20上添加红外遥控器。并使其中一些红外按键和例如"Home","Menu",音量增加降低等功能联系起来。
Sam之前只知道Android在 /system/usr/keylayout/ 下会有.kl文件。 其中注明了底层键值和Android上层的功能联系起来。
例如: key 64   BACK            WAKE_DROPPED key 4   MENU            WAKE_DROPPED key 85    DPAD_CENTER      WAKE_DROPPED key 22   DPAD_DOWN        WAKE_DROPPED key 70   DPAD_UP          WAKE_DROPPED key 71    DPAD_LEFT        WAKE_DROPPED key 21   DPAD_RIGHT       WAKE_DROPPED key 20  VOLUME_UP        WAKE key 16   VOLUME_DOWN       WAKE key 92   MUTE             WAKE #key 24   POWER            WAKE key 13   MOUSE   WAKE #key 66   PROG_RED         WAKE key 66   BUTTON_16         WAKE #key 69   PROG_GREEN        WAKE key 155   PROG_GREEN        WAKE key 104   PROG_YELLOW       WAKE key 98   PROG_BLUE        WAKE key 9    SETTINGS         WAKE key 152   HOME             WAKE key 90   0               WAKE key 26   1               WAKE key 1    2               WAKE key 69   3               WAKE key 89   4               WAKE key 77   5               WAKE key 197   6               WAKE key 82   7               WAKE key 83   8               WAKE key 65   9               WAKE

这其中,WAKE 表示唤醒(激活屏幕)并发送请求

WAKE_DROPPED 表示唤醒(激活屏幕)而不发送请求 


底层Driver应该有个列表来对应红外按键和KeyCode。


当前我们就从底层开始,一步步把红外遥控器的Firmware Key Code与 Android 底层 InputDevice中读取的Code 以及 Android 上层功能联系起来。



0. 让红外遥控器被A20所识别:

红外遥控器有很多,他们针对不同的设备,设备如何知道哪个红外遥控器发送的红外码是传给它的呢?

我们知道,NEC码有客户码。 当红外信号中的客户码和设备所需的客户码相同时,则设备认为此码是发给它的。

这个地址码在:

A20-Homlet-V1.0_ss/lichee/linux-3.3/drivers/input/keyboard/ir-keymap.h

因为Sam所用遥控器用户(系统)码为:0x7F80. 

所以:

#define IR_ADDR_CODE             (0x7f80)





1. 红外遥控器 Firmware Key Code 与 Android Linux Input Device Key Code的联系:

 1.1: 寻找红外Driver:

#lsmod

可以看到sun7i-ir. 通过它,Sam找到 Linux Kernel 中driver/input/keyboard/sun7i-ir.c

1.2: Firmware中的红外码:

例如:某键发送码:AC 53

 

1.3: Driver 中的处理:

在中端处理程序中,Driver得到码值: ir_code. 并利用ir_keycodes列表中的对应项作为发给Input子系统的KeyCode。

 

input_report_key(ir_dev,ir_keycodes[(ir_code>>16)&0xff],0);

input_sync(ir_dev);


所以:按键 AC 53. 则发送: ir_keycodes[0x53] . 这个值为83. 也就是说:它向Input子系统中发送的KeyCode= 83。



2. Input子系统的KeyCode与Android功能的对应:

代码稍后分析:

只需要看kl文件中:

83对应的是 8。 则说明按下这个键后。 Android认为有人按下了8 这个Key。


如需要修改,可以修改:

A20-Homlet-V1.0_ss/android/device/softwinner/sugar-xbh_bst/sun7i-ir.kl

最终,这个文件会被copy到Image中,烧入系统; 

/system/usr/keylayout/sun7i-ir.kl

更多相关文章

  1. android input子系统--InputReader EventHub::getevents之mNeedT
  2. 调用C++底层 Thread & Mutex 的注意事项
  3. 分享:用 NDK C++做底层开发的Android 浏览器,纯免费,无广告
  4. Google应用在Android上的Push机制以及C2DM框架的底层实现
  5. Android:图文解析带你快速了解RxJava的底层原理
  6. FirefoxOS 系统进程初步分析 底层系统继承自 android
  7. Android 开机底层优化
  8. android 遥控器配置
  9. Linux/Android——输入子系统input_event传递 (二)

随机推荐

  1. 一个很有深度的Android Blog
  2. Android 新手入门指导
  3. android 签名
  4. Android studio生成APK打包,修改生成APK的
  5. Android 支持的文件类型
  6. Android控件属性大全
  7. Step Detector and Step Counter Sensors
  8. Android——PopupWindow
  9. lua学习笔记 1 android 调用Lua, Lua脚本
  10. AM335X Starter Kit Android 开发环境搭