美文网首页
Android 8.0 基于MTK平台 客制化/增加一个物理按键

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

作者: c枫_撸码的日子 | 来源:发表于2018-07-18 13:09 被阅读0次

    前言:经过前三篇文章的学习,我们对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!
    荆轲刺秦王

    相关文章

      网友评论

          本文标题:Android 8.0 基于MTK平台 客制化/增加一个物理按键

          本文链接:https://www.haomeiwen.com/subject/phgwpftx.html