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、获取设备唯一id
ioctl(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->type
为DEVICE_ADDED
、DEVICE_REMOVED
、FINISHED_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()
)