以下是原始答案

以下是原始答案

我使用的是无线 Logitech 键盘,其中 Logitech Unifying 接收器插入 KVM 切换器。我创建了一个 systemd 挂起快捷方式来挂起笔记本电脑,即联想 IdeaPad。笔记本电脑的盖子始终处于关闭状态。除非我掀开笔记本电脑的盖子,否则我无法唤醒联想的挂起状态。一旦掀开盖子,笔记本电脑就会唤醒。我希望能够在不掀开盖子的情况下唤醒笔记本电脑。我不确定该怎么做。

我尝试了两种方法,但都没有奏效。首先,我启用了 Logitech Unifying Receiver 的唤醒文件 (proc/acpi/wakeup)。当我使用键盘时,它确实唤醒了笔记本电脑。问题是笔记本电脑在大约五分钟内就唤醒了,而我没有任何输入。键盘或其他任何东西都没有活动。其次,我尝试了如何使用无线 USB 键盘唤醒 Ubuntu 13.10? 与第一个问题相同——笔记本电脑似乎自行在不可预测的时间唤醒。

当我使用 lsinput 查看设备时,我可以看到 Logitech 键盘。它的物理地址为 usb-0000:00:14.0-3.1.1:1。当我查看 proc/acpi/wakeup 时,我看到 pci:0000:00:14.0。没有 3.1.1 扩展。如果我查看 /sys/bus/usb/devices/1-3.1.1,我会发现它是 Logitech Unifying Receiver。

以下是唤醒事件期间 cat syslog 的结果: 笔记本电脑唤醒的系统日志

我如何将所有这些组合在一起以通过键盘输入唤醒,但抑制其他唤醒事件?

几天后,我发现了这一点——“与嵌入式控制器的交互是真正难以诊断问题的地方。嵌入式控制器 (EC) 包含用于控制外围设备的专有代码。”来自https://wiki.ubuntu.com/Kernel/Reference/ACPITricksAndTips

可以这么说,这看起来相当困难,而且很可能只针对我的联想。

答案1

从:通过 USB 红外远程唤醒

我遇到了同样的问题,也为我的 USB 没有出现在 /proc/acpi/wakeup 中而困惑。然而,最后,尽管许多解决方案都表明这是必需的,但我并不需要在 ACPI 中启用 USB。

相反,启用我的红外设备所连接的 USB 端口上的唤醒功能就足够了。

查找您的设备 ID:

$ lsusb

总线 002 设备 002:ID 8087:8001 Intel 公司
总线 002 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器
总线 001 设备 002:ID 8087:8009 Intel 公司
总线 001 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器 总线
004 设备 001:ID 1d6b:0003 Linux Foundation 3.0 根集线器
总线 003 设备 003:ID 13ba:0018 PCPlay 条形码 PCP-BCG4209
总线 003 设备 002:ID 1934:5168 Feature Integration Technology Inc. (Fintek) F71610A 或 F71612A 消费类红外接收器/收发器
总线 003 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器

在上面的例子中,我的设备 ID 是5168

Grep /sys/bus/usb 找到你的设备插入的端口:

$ grep 5168 /sys/bus/usb/devices/*/idProduct  

/sys/bus/usb/devices/3-13/idProduct:5168

这表明我的设备已插入总线 3、端口 13。

确认端口正确:

$lsusb -t

/:总线 04.端口 1:Dev 1,Class=root_hub,驱动程序=xhci_hcd/6p,5000M
/:总线 03。端口 1:Dev 1,Class=root_hub,驱动程序=xhci_hcd/14p,480M
|__ 端口 13:Dev 2,如果为 0,Class=供应商特定类,驱动程序=mceusb,12M

|__ 端口 14:设备 3,如果为 0,则类 = 人机接口设备,驱动程序 = usbhid,1.5M
|__ 端口 14:设备 3,如果为 1,则类 = 人机接口设备,驱动程序 = usbhid,1.5M
/:总线 02。端口 1:设备 1,类 = root_hub,驱动程序 = ehci-pci/2p,480M |__ 端口 1:设备 2,如果为 0,则类 = Hub,驱动程序 = hub/8p,480M
/:总线 01。端口 1:设备 1,类 = root_hub,驱动程序 = ehci-pci/2p,480M
|__ 端口 1:设备 2,如果为 0,则类 = Hub,驱动程序 = hub/6p,480M

总线 3,端口 13 与 grep (3-13) 返回的总线/端口匹配

检查唤醒是否已启用:

$ cat /sys/bus/usb/devices/3-13/power/wakeup  

已禁用

启用端口唤醒:

$ sudo sh -c 'echo "enabled" > /sys/bus/usb/devices/3-13/power/wakeup'

检查唤醒是否已启用:

$ cat /sys/bus/usb/devices/3-13/power/wakeup  

已启用

测试您的设备,它能唤醒系统吗?

使此更改在重新启动后仍然有效:

$ sudo nano /etc/rc.local

在注释之后和“exit 0”之前添加以下几行

# Enable Wake on IR for USB bus 3 port 13.  
echo enabled > /sys/bus/usb/devices/3-13/power/wakeup

现在高兴地从 USB 设备唤醒您的 PC。

限制
这种方法的一个问题是,如果插入 IR 设备的 USB 端口发生变化,则专门启用该端口则无济于事。

这个帖子有一种方法可以使用 Udev 规则根据插入到 IR 端口的设备启用该端口。

参考
Kodi、MCE Remote 和 Ubuntu
使用键盘或鼠标从挂起状态唤醒
使用 Udev 规则启用 IR 设备


以下是原始答案

这个问题有三个答案可能对你有用:使用无线 USB 键盘或鼠标从挂起状态唤醒(适用于任何 Linux 发行版)


答案 1 (15 票赞同)

在终端中点击:

grep . /sys/bus/usb/devices/*/power/wakeup

对我来说,结果是发现所有 USB 都被禁用了。因此,现在输入:

1.

sudo su

我们现在拥有 root 权限。

2.我有 8 个 USB 端口(你可以对你拥有的任意数量的 USB 端口执行此操作) ,所以:

echo enabled > /sys/bus/usb/devices/usb1/power/wakeup
echo enabled > /sys/bus/usb/devices/usb2/power/wakeup
echo enabled > /sys/bus/usb/devices/usb3/power/wakeup
echo enabled > /sys/bus/usb/devices/usb4/power/wakeup
echo enabled > /sys/bus/usb/devices/usb5/power/wakeup
echo enabled > /sys/bus/usb/devices/usb6/power/wakeup
echo enabled > /sys/bus/usb/devices/usb7/power/wakeup
echo enabled > /sys/bus/usb/devices/usb8/power/wakeup

继续测试。现在您可以从任何无线或有线 USB 键盘和鼠标唤醒。

那么,我们必须启用所有这些的原因是因为在下一步中,我们将在 rc.local 中写入这个以便在每次重启后执行命令,并且重启后一些 Linux 发行版(可能是全部)会更改 USB 端口。 我们不必担心启用所有这些功能会出现任何问题,因为 Linux 处于挂起或休眠状态,它无法使用 wifi 下载任何东西,所以如果我们不特意唤醒它,它就不会被唤醒。

下一步:

3.

sudo nano /etc/rc.local

然后将步骤 2 中的所有内容粘贴到那里(当然是在出口 0 之前)。

就是这样。从现在起,我们可以使用无线 USB 和鼠标从挂起状态唤醒。

我希望它对你们所有人都有用。本指南是在测试了互联网上所有其他可能的解决方案后编写的。


答案 2(7 票赞同)

除了上述指南之外,我还想添加此信息,因为我最近发现,一些无线 USB 设备从睡眠状态唤醒后会恢复为禁用状态。我再说一遍,只有一些 USB 设备会这样,不是全部。这就是为什么我没有在我的指南中添加这个小指南。

因此,您按照我上面的指示进行操作,并且您的电脑成功唤醒,但是当天晚些时候它突然就无法再唤醒了。

解决方案:

打开终端并执行以下操作:

lsusb

在您的键盘设备 ID 信息中,前 4 位数字是供应商 ID,后 4 位数字是产品 ID(见屏幕截图) 在此处输入图片描述

接下来做:

sudo nano /etc/udev/rules.d/10-wakeup.rules

在“wakeup”中输入您想要的脚本名称。如果您有许多其他 udev 规则,则数字 10 是优先级,数字越低的“规则”将先于其他规则执行。

复制粘贴此内容并用您自己的无线键盘供应商 ID 和产品 ID 替换供应商 ID 和产品 ID。

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="062a", ATTRS{idProduct}=="4101" RUN+="/bin/sh -c 'echo enabled > /sys/bus/usb/devices/usb8/power/wakeup'"

*USB8对我来说是我的无线键盘(您也可以在屏幕截图(Bus 008)中看到它),将其替换为您自己的。

Ctrl+O保存,Ctrl+X退出并重新启动。


答案 3

Pavlos Theodorou 的回答非常有帮助。我想补充一点,您可以通过管道找到启动时鼠标/键盘所连接的 USB 设备消息通过grep然后egrep一次,最后使用尾巴以确保它是最新的条目。

使用此方法,您必须启用唤醒全部USB 端口。

我将以下内容放入我的 /etc/rc.local 文件中,它每次都能找到我的罗技接收器,即使从一个 USB 端口移动到另一个。只需替换你的来自 dmesg 的键盘或鼠标代替“Logitech K270”

KB="$(dmesg | grep "Logitech K270 as" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup

这在启动时有效,但似乎无法在从挂起唤醒时运行,因此我不得不将一个脚本文件放在 /lib/systemd/system-sleep/ 中。创建它,将其设置为全局可执行文件,并为其指定一个以 00 到 99 之间的两位数开头的名称。我的脚本如下,再次替换你的来自 dmesg 的键盘/鼠标信息:

#!/bin/sh

# Action script to enable wake after suspend by keyboard or mouse

if [ $1 = post ]
    then
    KB="$(dmesg | grep "Logitech K270 as" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
    echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup
fi

if [ $1 = pre ]
    then
    KB="$(dmesg | grep "Logitech K270 as" | grep -o -P "usb.{0,5}" | egrep -o ".{0,3}$" | tail -1)"
    echo enabled > /sys/bus/usb/devices/${KB}/power/wakeup
fi

出于某种我无法解释的原因,“睡眠后”如果语句只在每次唤醒时有效……但“预”睡眠如果语句似乎每次都有效。

答案2

截至 2021 年 9 月 10 日,将启用状态设为永久状态对于 Ubuntu 18+ 上的少数设备不起作用。

@ 的精彩回答帕夫洛斯·特奥多鲁,也是答案2这里,解决了这个问题。链接至帖子这里

相关内容