Android 8.0 基于MTK平台 客制化/增加一个物理按键

前言:经过前三篇文章的学习,我们对Input子系统,按键的处理流程有个一个较为深刻的认识,那本篇文章就来学以致用吧。
主要解决以下工作任务:

在H6 医疗项目中,只有一个power键和添加了一个物理按键,
该按键功能是用于接听或者挂断电话,那么应该如何去客制化呢?
H6
1.查看GPIO对照表,配置DWS文件
GPIO对照表

一般来说,我们的按键需要通过col和raw来确定一个按键的位置,但也有另一种,就是raw接地了,只需配置col即可。
找硬件工程师拿到GPIO对照表和硬件原理图,从上表中可以看出需要客制化的GPIO引脚为84,对应的列COL0,GPIO81对应的ROW0为NC,也就是不需要设置行,另外,从硬件原理图中看出,按键的另一个引脚是接地的,因此不需要配置RAW。

路径:kernel-3.18/drivers/misc/mediatek/dws/mt6735/miki8735b_h6.dws
GPIO配置
2.Keypad_YuSu.cmp中添加新键,如CALLCONTROL快捷键
路径:kernel-3.18/tools/dct/old_dct/Keypad_YuSu.cmp
[Key_definition]
KEY_NONE
.
.
.
KEY_Y
KEY_Z
KEY_CALLCONTROL [添加新按键]
[Key_code]
0
228
.
.
.
21
44
254 [添加新按键对应的值 不要重复即可]
[Key_code_linux]
0
102
.
.
.
21
44
254 [添加新按键对应的值 不要重复即可]

[Power_Key_definition]
KEY_POWER

在[Key_definition]中最后的位置 添加 KEY_CALLCONTROL
然后[Key_code]和[Key_code_linux]最后的位置分别添加对应的值254
(这个值可以随便取,只要不和原生代码中的值重复即可,一般我们取原始值中最大的值+1即可)

3.打开DWS文件 在keypad矩阵中在相应定义的按键位中添加新按键
DWS文件修改

使用DrvGen.exe工具打开dws文件,在column0中添加CALLCONTROL,点击保存

除了kernel层,还要修改lk层和pl层,按照以上的步骤,修改以下所有文件

[kernel层]
kernel-3.18/tools/dct/old_dct/Keypad_YuSu.cmp
kernel-3.18/drivers/misc/mediatek/dws/mt6735/miki8735b_h6.dws

[preload层]
vendor/mediatek/proprietary/bootable/bootloader/preloader
                         /tools/dct/old_dct/Keypad_YuSu.cmp
vendor/mediatek/proprietary/bootable/bootloader/preloader
                         /custom/miki8735b_h6/dct/dct/codegen.dws

[lk层]
vendor/mediatek/proprietary/bootable/bootloader/lk
                        /scripts/dct/old_dct/Keypad_YuSu.cmp
vendor/mediatek/proprietary/bootable/bootloader/lk
                        /target/miki8735b_h6/dct/dct/codegen.dws

4.增加keypad layout文件键盘映射,linux和android key映射

android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件
关于kl文件更多资料:android kl文件

路径:
7.0:device/mikimobile/{$project}/mtk-kpd.kl
8.0:device/mediateksample/{项目名}/mtk-kpd.kl
//这里省略一些源码
key 165   MEDIA_PREVIOUS
key 168   MEDIA_REWIND
key 159   MEDIA_FAST_FORWARD

key 254   CALL_CONTROL [这里添加linux和android key的映射]

其中254 是linux键码,CALL_CONTROL 是android识别key值 如果是需要唤醒系统,还需要增加WAKE

5.修改Java识别keycode
frameworks/native/include/android/keycodes.h
/**
 * Key codes.
 */
enum {
    /** Unknown key code. */
    AKEYCODE_UNKNOWN         = 0,
    //省略不跟源码
    AKEYCODE_GESTURE_Z = 301,
    AKEYCODE_GESTURE_HOME = 302 
    // NOTE: If you add a new keycode here 
    //you must also add it to several other files.
    AKEYCODE_CALL_CONTROL = 303,    //添加
};

在按键定义项增加 AKEYCODE_CALL_CONTROL = 303

frameworks/native/include/input/InputEventLabels.h
static const InputEventLabel KEYCODES[] = {
    DEFINE_KEYCODE(GESTURE_HOME),
    DEFINE_KEYCODE(HALL_ON),
    DEFINE_KEYCODE(HALL_OFF),
    DEFINE_KEYCODE(CALL_CONTROL),    //Added 
}

在KEYCODES数组中添加DEFINE_KEYCODE(CALL_CONTROL)

6.修改Java 键盘事件
frameworks/base/core/java/android/view/KeyEvent.java
public class KeyEvent extends InputEvent implements Parcelable {
    public static final int KEYCODE_GESTURE_HOME = 300;
    /** @hide */
    public static final int KEYCODE_HALL_ON = 301;
    /** @hide */
    public static final int KEYCODE_HALL_OFF = 302;
      /** @hide */
    public static final int KEYCODE_CALL_CONTROL = 303; //Added 

    private static final int LAST_KEYCODE = KEYCODE_CALL_CONTROL;//modified

    // NOTE: If you add a new keycode here you must also add it to:
     //如果在这里添加了一个新的key,还必须将它添加到
    //  isSystem()
    //  isWakeKey()
    //  frameworks/native/include/android/keycodes.h
    //  frameworks/native/include/input/InputEventLabels.h
    //  frameworks/base/core/res/res/values/attrs.xml
    //  emulator?
    //  LAST_KEYCODE
    //
}

public static final int KEYCODE_CALL_CONTROL = 303;

最后的按键为新增的
private static final int LAST_KEYCODE =KEYCODE_CALL_CONTROLS;

ps:
以上/**/注释的code是android 非开放API或变量定义的时候,需要添加Java Doc的识别,否则要运行make update-api才能build通过

如果是系统按键,修改frameworks/base/core/java/android/view/KeyEvent.java
isSystemKey()增加case KEYCODE_CALL_CONTROLS:


KeyEvent.java

如果是wake按键,修改
frameworks/base/core/java/android/view/KeyEvent.java
isWakeKey()增加case KEYCODE_CALL_CONTROLS:


KeyEvent.java
7.修改XML文件描述符framework/base/core/res/res/values/attr.xml
frameworks/base/core/res/res/values/attrs.xml
    <attr name="keycode">
      <enum name="KEYCODE_UNKNOWN" value="0" />
        .
        .
        .
        //添加以下代码
      <enum name=" KEYCODE_CALL_CONTROL" value="303" />

<enum name=" KEYCODE_CALL_CONTROL" value="303" />

修改到这里,当我们点击电话按键时,就可以向上层上报数据了
使用adb命令查看


点击按键

这里的0xfe是十六进制->十进制为:254(linux code)
如果有上报这个值,说明我们添加新的按键成功了
最后就需要添加点击按键后去做什么事情的逻辑了

8.添加按键事件逻辑
frameworks/base/services/core/java/com/android
        /server/policy/PhoneWindowManager.java
public long interceptKeyBeforeDispatching(WindowState win, 
            KeyEvent event, int policyFlags) {
//省略...代码

//Added  for call_control begin
            //在这里添加你的逻辑
            case KeyEvent.KEYCODE_CALL_CONTROL: {
                if (down) {/ / 判断按键按下
                        / /获取电话服务
                    TelecomManager telecomManager = getTelecommService();
                    if (telecomManager != null) {/ /服务不为空
                         / /如果电话响起
                        if (telecomManager.isRinging()) {
                            //接听电话
                            telecomManager.acceptRingingCall();
                            result &= ~ACTION_PASS_TO_USER;
                        }else if(telecomManager.isInCall()){
                            //如果正在通话 挂断电话
                            telecomManager.endCall();
                            result &= ~ACTION_PASS_TO_USER;
                        }
                    }
                }
                break;
            }
  //end Added  for call_control 
case KeyEvent.KEYCODE_VOICE_ASSIST: {
//省略代码
}

到此,我们新增按键的客制化就完成了。

Stay hungry,Stay foolish!
荆轲刺秦王

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容