轉載:https://blog.csdn.net/weixin_43854010/article/details/94390803
Android 添加鍵值並上報從驅動到上層
平台 :RK3288
OS:Android7.1
kernel部分添加鍵值:
1.在dts中(kernel/arch/arm/boot/dts/rk3288-android.dtsi)添加鍵值屬性,可以仿照power按鍵配置
因我們使用的鍵值操作是通過gpio觸發的,則配置成gpio-key。
linux,code 鍵碼可以查看內核自定義鍵碼來選擇。定義在kernel/include/uapi/linux/input-event-codes.h下。
因鍵值較多,就只列一部分出來,在定義鍵碼的時候,注意不要與現正在使用的鍵碼重復。如不確認哪些鍵碼是已經使用的,可以在該文件中添加自定義鍵碼。
在dts中添加鍵值屬性后,需要在驅動(我的是在/kernel/drivers/input/keyboard/rk_reys.c)里,做dts解析:
如該按鍵需要以中斷的方式觸發,則可以為這個按鍵申請中斷:
鍵值上報:
1.注冊input事件:
通過input_register_device()函數來向內核注冊input事件。
2.input事件上報:
input事件上報是通過input_event()或input_report_key()函數上報。
input_event()函數簡介:
函數原型:
參數介紹:
struct input_dev *dev:需要上報的事件
unsigned int type:上報的事件類型(在前面的input-event-codes.h文件中有定義)
unsigned int code:上報的鍵碼
int value :上報的鍵值
使用實例:
注意:input_event()上報按鍵事件必須先上報1(意為按下),再上報0(意為彈起),不能單獨上報1,或者上報0。
kernel部分添加完成后,可通過getevent命令來確認事件有無上報成功。
內核部分確認調試成功后,需要將鍵值上報至上層:
1.修改按鍵布局映射文件,都是以.kl結尾的文件,可通過
cat bus/input/devices 命令來查看我們系統目前正在使用的布局文件是哪個。
我使用的是/device/rockchip/common/rk29-keypad.kl布局文件
在這后面添加key 117 F1 則表示內核上報的117鍵值映射到系統的鍵值為F1
系統的鍵值定義在frameworks/base/core/java/android/view/KeyEvent.java下。
添加完成后可以在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java里添加打印信息,查看鍵值是否上報成功。
上層APK可通過調用frameworks/base/core/java/android/view/KeyEvent.java中的接口去攔截鍵值