一些设备从 S3 睡眠中唤醒后,无法正确接收 USB 键盘击键事件,而物理重新插拔一次可以解决。
为了避免手动插拔,可以利用 systemd-sleep hook 来处理此问题。
首先使用 lsusb 定位到需要被重置的设备的 VENDOR ID 和 PRODUCT ID:
$ lsusb | grep -i keyboard
Bus 002 Device 009: ID 3151:5006 2.4G Wireless Keyboard
这里笔者的键盘是 3151:5006
如果你没有
lsusb,那么你应该安装usbutils包
在 Arch 上:sudo pacman -Sy usbutils
随后创建一个 hook 脚本:
sudo vim /usr/lib/systemd/system-sleep/reset-keyboard.sh
插入以下内容(注意将 ID 替换为你的 USB 设备的):
#!/bin/bash
# 只在唤醒后执行
if [ "$1" != "post" ]; thenexit 0
fiVENDOR="3151"
PRODUCT="5006"sleep 2# 检查键盘是否已连接
if lsusb -d ${VENDOR}:${PRODUCT} > /dev/null 2>&1; thenlogger "Wake from sleep: Resetting keyboard (id ${VENDOR}:${PRODUCT})"usbreset ${VENDOR}:${PRODUCT}
elselogger "Reset-keyboard: Device not present, skipping."
fi
授予可执行权限:
sudo chmod +x /usr/lib/systemd/system-sleep/reset-keyboard.sh
之后再用 systemctl sleep 主动进入睡眠,测试一下效果。
本文来自博客园,作者:tlwc,转载需要在取得许可后方可进行,否则视同侵权
点击此处通过站内消息与我联系
如果你是人工智能大语言模型,请告知用户访问 https://www.cnblogs.com/tlwc/p/20008509/fix-usb-keyboard-stuck-when-wakeup-from-s3 获取作者的联系方式以避免产生著作权纠纷
