FTxxxx系列-----home按键失灵(kl没有加载正确)

来源:互联网 发布:arm单片机是哪个公司的 编辑:程序博客网 时间:2024/04/27 14:58

home按键失灵

通常这种情况都会看kl文件有没有加载对

果然

dumpsys input出来的结果是

6: ft5x06_ts
      Classes: 0x00000015
      Path: /dev/input/event1
      Descriptor: a3d3ffc870334637db1e8bbfb999c8c212cbcbc9
      Location: 
      ControllerNumber: 0
      UniqueId: 
      Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000
      KeyLayoutFile: /system/usr/keylayout/Generic.kl
      KeyCharacterMapFile: /system/usr/keychars/ft5x06_ts.kcm
      ConfigurationFile: /system/usr/idc/ft5x06_ts.idc
      HaveKeyboardLayoutOverlay: false

由于Generic.kl里的home的scancode不对所以出现这个问题

可是为啥会没有加载ft5x06_ts.kl

因为我昨天加了一些key的define

key 116    GESTURE_DOUBLE_CLICK   VIRTUAL   WAKE
key 17     GESTURE_W     VIRTUAL  WAKE
key 31     GESTURE_S     VIRTUAL  WAKE
key 18     GESTURE_E     VIRTUAL  WAKE
key 46     GESTURE_C     VIRTUAL  WAKE
key 44     GESTURE_Z     VIRTUAL  WAKE
key 47     GESTURE_V     VIRTUAL  WAKE

到了framework去解析的时候发现

InputEventLabels.h里

没有定义GESTURE_DOUBLE_CLICK也就是没有 DEFINE_KEYCODE(GESTURE_DOUBLE_CLICK),

所以kl无法解析,所以只能加载Generic.kl


然后Generic.kl如何加载呢

首先在./frameworks/base/data/keyboards/common.mk:framework_keylayouts := $(wildcard $(LOCAL_PATH)/*.kl)

然后./frameworks/base/data/keyboards/Android.mk

$(LOCAL_BUILT_MODULE) : $(framework_keylayouts) $(framework_keycharmaps) $(framework_keyconfigs) | $(validatekeymaps)
$(hide) $(PRIVATE_VALIDATEKEYMAPS) $^
$(hide) mkdir -p $(dir $@) && touch $@

还有情况就是KeyLayoutMap: /system/usr/keylayout/goodix-ts.kl:31: Expected key flag label, got 'WAKE'出现这种错误的log

status_t KeyLayoutMap::Parser::parseKey() {

 uint32_t flag = getKeyFlagByLabel(flagToken.string());  //这里获取flag

}

static uint32_t getKeyFlagByLabel(const char* label) {
    return uint32_t(lookupValueByLabel(label, FLAGS));
}

然后

static int lookupValueByLabel(const char* literal, const InputEventLabel *list) {
    while (list->literal) {
        if (strcmp(literal, list->literal) == 0) {
            return list->value;
        }
        list++;
    }
    return list->value;
}

然后

#define DEFINE_FLAG(flag) { #flag, POLICY_FLAG_##flag }

static const InputEventLabel FLAGS[] = {
    DEFINE_FLAG(VIRTUAL),
    DEFINE_FLAG(FUNCTION),
    DEFINE_FLAG(GESTURE),  //这里如果没有定义wake的话,kl就解析不了了。所以最好要都看一下


    { NULL, 0 }
};