问题描述
请详细描述您所遇到的问题:
设备为 Microsoft Surface Pro 7+,使用原装 Microsoft Surface Type Cover,USB VID/PID 为:
045e:09c0
Microsoft Surface Type Cover
在 Type Cover 已连接时,实体键盘、触控板和中文输入法均可正常使用。
但在系统运行过程中直接拔下 Type Cover 后,会出现以下问题:
- FydeOS 能够正常切换到平板模式;
- Type Cover 的触控板等输入设备能够正常消失;
- 但系统仍然认为存在实体键盘;
- 因此点击 Chromium、Android 应用等位置的文本输入框时,屏幕虚拟键盘不会自动弹出;
- 此时右下角输入法菜单中仍然存在“显示虚拟键盘”的选项,手动点击后虚拟键盘可以正常使用。
如果执行:
chrome://restart
重新启动 Chromium/Ash,在不重新连接 Type Cover 的情况下,屏幕键盘会立即恢复正常:
拔下 Type Cover
→ 屏幕键盘无法自动出现
chrome://restart
→ Type Cover 仍保持拔出
→ 点击输入框
→ 屏幕键盘恢复正常自动弹出
因此初步判断不是触摸屏、虚拟键盘本身或平板模式识别异常,而是 Type Cover 热拔出后,Chromium/Ash 内部仍残留“external keyboard present”的状态。
我进一步检查了 Linux input / udev:
拔出 Type Cover 时,内核能够正常检测 USB disconnect,并且 keyboard 对应的 evdev 设备能够正常收到 remove:
ACTION=remove
SUBSYSTEM=input
ID_INPUT=1
ID_INPUT_KEY=1
ID_INPUT_KEYBOARD=1
ID_VENDOR=Microsoft
ID_VENDOR_ID=045e
ID_MODEL=Surface_Type_Cover
ID_MODEL_ID=09c0
Type Cover 的 Mouse、Touchpad 以及其他 HID collection 也都会正常收到 remove 事件。
另外进行了以下测试:
udevadm trigger --action=change --subsystem-match=input
无法恢复虚拟键盘,因此不像是单纯漏掉了一次 udev change event。
曾尝试将 045e:09c0 在 Chromium USB input device classification 中临时分类为 internal device。该修改确实会改变 Type Cover 行为,说明 Chromium 的 internal/external input device classification 与该问题有关;但这种方式会造成新的副作用,例如 Chrome 启动时已经连接的 Type Cover 可能无法使用,必须重新插拔后才恢复,因此这不是可接受的解决方案。
目前最稳定的复现步骤为:
1. 启动 FydeOS,并连接 Surface Type Cover
2. 确认键盘、触控板正常
3. 在系统运行过程中拔下 Type Cover
4. FydeOS 正常进入平板模式
5. 点击任意输入框
6. 屏幕键盘不会自动出现
7. 执行 chrome://restart
8. 再点击输入框,屏幕键盘立即恢复正常
期望行为:
连接 Type Cover
→ 使用实体键盘
→ 屏幕键盘不自动弹出
拔下 Type Cover
→ 进入平板模式
→ 点击输入框时自动弹出屏幕键盘
重新连接 Type Cover
→ 恢复实体键盘模式
怀疑问题可能位于以下状态更新链路之一:
udev REMOVE
→ Chromium/Ozone evdev device removal
→ DeviceDataManager keyboard device list update
→ Ash input-device configuration notification
→ VirtualKeyboardController external-keyboard state refresh
目前看来,Linux/udev 侧已经正确移除了设备,但 Ash 的 external keyboard 状态可能没有在 Type Cover hot-unplug 后正确失效。
系统与设备信息
-
硬件与系统配置:
- 设备型号:Microsoft Surface Pro 7+
- 处理器:11th Gen Intel(R) Core™ i5-1135G7 @ 2.40GHz
- 显卡:我猜是未识别
- RAM(运行内存):8 GB
- 存储容量:128 GB
- FydeOS版本:v22.1, 16503.20.22.9
- Type Cover:Microsoft Surface Type Cover
- Type Cover USB VID/PID:
045e:09c0
-
相关系统日志:
/var/log/messages的日志有点太长了,下面是用shell抓的一小部分设备日志
usb 3-9: USB disconnect
UDEV remove ... Microsoft Surface Type Cover Keyboard
ACTION=remove
SUBSYSTEM=input
ID_INPUT_KEYBOARD=1
ID_VENDOR_ID=045e
ID_MODEL_ID=09c0
ID_MODEL=Surface_Type_Cover