現在的普通按鍵也集成到Linux Input子系統中了,只需要把按鍵對應的IO端口配置好,按鍵就可以工作了。所以一般提供的BSP(或者叫作解決方案)中,已經完善了按鍵驅動。關鍵是快速的了解按鍵的映射。所以這裡不作源碼級分析。源碼分析可以參考這裡:《基於S3C2440的Linux-3.6.6移植——按鍵驅動》 http://www.linuxidc.com/Linux/2013-10/91993p3.htm
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)是無法去檢測和控制這個“按鍵”的。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11