IMS:EventHub 设备添加和InputDevice转化

IMS:EventHub 设备添加和InputDevice转化

android11-release
IMS:InputReader线程获取输入事件 已经讲到过EventHub::getEvents读取事件/dev/input


EventHub 设备添加

IMS:键盘鼠标接入判断 已经讲到EventHub添加外界设备,以及classes和sources码相关转换标识


frameworks\native\services\inputflinger\reader\EventHub.cpp
frameworks\native\services\inputflinger\reader\include\EventHub.h

添加到EventHub中mDevices

EventHub::getEvents读取事件/dev/input时,EventHub::scanDevicesLocked() -> EventHub::scanDirLocked -> EventHub::openDeviceLocked转化为Device并保存到KeyedVector<int32_t, Device*> mDevices;
在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 1、打开设备文件int fd = open(devicePath, O_RDWR | O_CLOEXEC | O_NONBLOCK);
    在这里插入图片描述
  • 2、获取设备名ioctl(fd, EVIOCGNAME(sizeof(buffer) - 1), &buffer)
    在这里插入图片描述
  • 3、获取设备版本和标识符。ioctl(fd, EVIOCGID, &inputId)
    在这里插入图片描述
  • 4、获取设备物理地址ioctl(fd, EVIOCGPHYS(sizeof(buffer) - 1), &buffer)
    在这里插入图片描述
  • 5、获取设备唯一idioctl(fd, EVIOCGUNIQ(sizeof(buffer) - 1), &buffer)
    在这里插入图片描述
    6、创建Device对象,分配设备对象内存new Device(fd, deviceId, devicePath, identifier)
    在这里插入图片描述
    7、计算device->classes,并最终添加到EventHub的mDevices中
    在这里插入图片描述
    在这里插入图片描述
举例Moko-atic Keyboard 设备classes

从日志看到name=‘Moko-atic Keyboard’, classes=0x80000003,上面第7步计算device->classes都是|或运算计算标志位,再对照下边截图
在这里插入图片描述
可知该设备是外接带字符Q键盘

  • 键盘: INPUT_DEVICE_CLASS_KEYBOARD
    在这里插入图片描述
  • 带字符Q:INPUT_DEVICE_CLASS_ALPHAKEY
    在这里插入图片描述
  • 外接设备:INPUT_DEVICE_CLASS_EXTERNAL
    在这里插入图片描述

将mDevices中的Device转化为InputDevice

EventHub::getEvents读取事件/dev/input时,设置rawEvent->typeDEVICE_ADDEDDEVICE_REMOVEDFINISHED_DEVICE_SCAN;之后经过InputReader::processEventsLocked 通过 rawEvent->type为EventHubInterface::DEVICE_ADDED 添加设备并转化为InputDevice。(这里注意:device->configure更新最终获取到InputDevice中mSources)

frameworks\native\services\inputflinger\reader\InputReader.cpp

在这里插入图片描述在这里插入图片描述

InputDevice::addEventHubDevice主要创建对应设备的InputMapper
frameworks\native\services\inputflinger\reader\InputDevice.cpp

在这里插入图片描述

device->configure更新最终获取到InputDevice中mSources
frameworks\native\services\inputflinger\reader\InputDevice.cpp
void InputDevice::configure(nsecs_t when, const InputReaderConfiguration* config,
                            uint32_t changes) {
    // ... ... ... ...
    mIsExternal = !!(mClasses & INPUT_DEVICE_CLASS_EXTERNAL);
    mHasMic = !!(mClasses & INPUT_DEVICE_CLASS_MIC);

    if (!isIgnored()) {
        // ... ... ... ...
        for_each_mapper([this, when, config, changes](InputMapper& mapper) {
            mapper.configure(when, config, changes);
            mSources |= mapper.getSources();
        });
        // ... ... ... ...
    }
}

mSources |= mapper.getSources();这里看到该设备对应所有 InputMapper 中 mSource 或运算得到。
这看到使用 mSources 判断主要是InputMapper上报事件的区别,并没有明确的外部设备区分flag标志;但可判断mIsExternal、mHasMic (即isExternal()hasMic()
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xhBruce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值