Touch---load kl文件的过程

本文主要探讨了Linux系统中Touch事件处理的关键步骤——加载kl文件(keylayout文件)。kl文件用于将硬件扫描到的scancode转换为keycode。加载过程始于EventHub.cpp,位于frameworks/native/services/inputflinger目录。代码分析揭示了系统如何打开设备并执行这一转换。作者强调学习过程中总结方法和专注的重要性,并提到参考了相关外部资源。
摘要由CSDN通过智能技术生成

1.kl文件

kl文件,就是keylayout文件,它的作用是将scancode转换为keycode。scancode就是硬件直接扫描到的数字,而这些数字会通过这个kl文件对应到字符串,也就是keycode。

2.load kl 文件的过程

直接进入主题,过程是从在EventHub.cpp中开始的。EventHub.cpp的路径是frameworks/native/services/inputflinger。这个里面从打开设备入手。也就是下面这个函数。这里是部分代码。

status_t EventHub::openDeviceLocked(const char *devicePath) {
    char buffer[80];

    ALOGV("Opening device: %s", devicePath);

    int fd = open(devicePath, O_RDWR | O_CLOEXEC);
    if(fd < 0) {
        ALOGE("could not open %s, %s\n", devicePath, strerror(errno));
        return -1;
    }

在这个函数的中间,会有下面这段代码。很显然,这就是开始load kl 文件了。

// Load the key map.
    // We need to do this for joysticks too because the key layout may specify axes.
    status_t keyMapStatus = NAME_NOT_FOUND;
    if (device->classes & (INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_JOYSTICK)) {
        // Load the keymap for the device.
        keyMapStatus = loadKeyMapLocked(device);
    }
接下来,就看看函数loadKeyMapLocked()。这个函数的实现如下:

status_t EventHub::loadKeyMapLocked(Device* device) {
    return device->keyMap.load(device->identifier, device->configuration);
}

接着看函数keyMap.load()。这个函数的实现是在如下。在没有丢log之前,一直以为,函数运行是走的是if (deviceConfiguration)这个路线。并且为了找出tryGetProperty(String8("keyboard.layout")函数所表达的意义纠结了很久。这个函数的实现是在system文件夹下面的core/libutils/PropertyMap.cpp中 。这个函数并不是传统的获取property,因为后面这个字符串在getprop之后没有找到。实际上是在初始化的时候创建了一个全局的类似链表还是数组结构,然后可以根据字符串对应上它的值。

status_t KeyMap::load(const InputDeviceIdentifier& deviceIdenfifier,
        const PropertyMap* de
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值