我的新伙伴,HP 暗影精灵7,因为N卡毕竟太好用了,而且可以支持独显直出,在外接屏幕了以后拿来当作“台式机”了。

但是既然作为笔记本,内置显示器虽然关掉了但睡眠唤醒一直以来还是依赖于掀起屏幕来进行的,但是 Windows 11 上却能够通过点按鼠标进行唤醒,看来原生策略上外接设备唤醒也是被考虑进去了的。因此为了提升在 Linux 下的体验还是很有必要稍微改改配置。

目标

目标非常简单:

  • 和windows上的策略保持一致,通过鼠标按键点按唤醒
  • 可以的话配置持久化

前者非常简单,只要简单的更改一下设备的电源的控制策略即可,后者稍微麻烦一点,至少得去看一下 udev 规则怎么写才能实现。

施行

根据上面的目标,我们分解任务,首先找到外接鼠标的设备电源控制。

1
ls /dev/input/

差不多能看到我这边有三个设备被识别为鼠标设备:

1
... mouse1 mouse2 mouse0

其中 mouse1 , mouse2 , mouse0 可以查看一下设备信息来确认具体都是哪个。

1
udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/input/mouse0)

运气比较好,我这边的 mouse0 直接就是 g102 鼠标,输出如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/0003:046D:C092.0004/input/input8/mouse0':
    KERNEL=="mouse0"
    SUBSYSTEM=="input"
    DRIVER==""
    ATTR{power/async}=="disabled"
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_kids}=="0"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_enabled}=="disabled"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"
    ATTR{power/runtime_usage}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/0003:046D:C092.0004/input/input8':
    KERNELS=="input8"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{capabilities/abs}=="0"
    ATTRS{capabilities/ev}=="17"
    ATTRS{capabilities/ff}=="0"
    ATTRS{capabilities/key}=="ffff0000 0 0 0 0"
    ATTRS{capabilities/led}=="0"
    ATTRS{capabilities/msc}=="10"
    ATTRS{capabilities/rel}=="1943"
    ATTRS{capabilities/snd}=="0"
    ATTRS{capabilities/sw}=="0"
    ATTRS{id/bustype}=="0003"
    ATTRS{id/product}=="c092"
    ATTRS{id/vendor}=="046d"
    ATTRS{id/version}=="0111"
    ATTRS{inhibited}=="0"
    ATTRS{name}=="Logitech G102 LIGHTSYNC Gaming Mouse"
    ATTRS{phys}=="usb-0000:00:14.0-2/input0"
    ATTRS{power/async}=="disabled"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_kids}=="0"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_enabled}=="disabled"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/runtime_usage}=="0"
    ATTRS{properties}=="0"
    ATTRS{uniq}=="2073305B4B32"

这样的话顺带着就有 vendor idproduct id 了,先记下来:

1
2
product id: c092
vendor id: 046d

然后输入斜线搜索一下wakeup,找到供电唤醒相关选项,默认来看的话应该是如下:

1
ATTRS{power/wakeup}=="disabled"

先记一下对应设备父节点,然后我们直接手动去改一下对应设备接口:

1
2
3
# 形如:/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/0003:046D:C092.0004/input/input8/mouse0
# 截取到usb3/3-2即可,为该usb设备设备对应接口
sudo sh -c "echo enabled > '/sys/devices/pci0000:00/0000:00:14.0/usb3/3-2/power/wakeup'"

这时候重新查询一下设备应该能看到 power/wakeupenabled 状态,这时候休眠一下设备,然后点按鼠标查看一下是否正常唤醒,第一步完成。

然后我们来更改udev规则,如果上一步操作成功了的话应该可以在acpi里看到唤醒状态:

1
2
3
cat /proc/acpi/wakeup | grep -i enabled

# XHCI      S3    *enabled   pci:0000:00:14.0

然后看一下pci总线里的USB:

1
lspci | grep -i USB
1
2
0000:00:0d.0 USB controller: Intel Corporation Tiger Lake-H Thunderbolt 4 USB Controller (rev 05)
0000:00:14.0 USB controller: Intel Corporation Tiger Lake-H USB 3.2 Gen 2x1 xHCI Host Controller (rev 11)

我这里能看到 0000:00:14.0 对应的是笔记本上的三个 USB 3.2 接口,目前允许从该端口进行唤醒。然后开始写规则。

1
2
3
# /etc/udev/ruled.d/50-wake-on-mouse.rules

SUBSYSTEM=="usb",DRIVERS="usb",ATTRS{idVendor}=="o46d",ATTRS{idProduct}=="c092",ATTR{power/wakeup}="enabled",ATTR{driver/3-2/power/wakeup}="enabled"

然后测试一下新的规则

1
sudo udevadm test (udevadm info --query=path --name=/dev/input/mouse0) 2>&1

如果规则正常载入的话应该能够在输出中看到诸如:

1
Reading rules file: /etc/udev/rules.d/51-wake-on-usb.rules

但是由于初期完全照抄了 Archwiki,现在有个很大的问题就是似乎现在udev对则认不到DEVICES这个参数,因此可以慢慢调试,如果所有方法均不能生效的话,可以直接在后面接上我们上一步运行的指令来进行更改,虽然脏但是可以生效。

1
RUN+="/bin/sh -c 'echo enabled > /sys$env{DEVPATH}/../power/wakeup;'"