使用 USB 设备从挂起状态唤醒

使用 USB 设备从挂起状态唤醒

我花了几个小时甚至更多时间寻找解决方案,终于找到了。我想与大家分享。这样,在谷歌上搜索这个问题会更容易,从而更快地找到解决方案。所以,正如标题所说,下面是解决方案。

PCI 设备相关问题

答案1

在终端:

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

除了上述指南之外,我还想添加此信息,因为我最近发现,一些无线 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

上述答案对我都没有帮助。这就是为什么我在这里发布我自己的答案。

启用/禁用 USB 设备从挂起状态唤醒

在基于 Ubuntu 18.04 的 KDE neon 5.16.2 中测试,但应该可以在任何发行版中运行。

  1. 显示 USB 设备列表以识别您想要启用/禁用的设备:

    grep . /sys/bus/usb/devices/*/product
    

    你应该得到如下结果:

    /sys/bus/usb/devices/3-3/product:Cord Optical Mouse
    /sys/bus/usb/devices/3-4.3/product:802.11n WLAN Adapter
    /sys/bus/usb/devices/3-4.4/product:USB Receiver
    /sys/bus/usb/devices/3-4/product:USB2.0 Hub
    /sys/bus/usb/devices/4-4/product:USB3.0 Hub
    /sys/bus/usb/devices/usb1/product:EHCI Host Controller
    /sys/bus/usb/devices/usb2/product:EHCI Host Controller
    /sys/bus/usb/devices/usb3/product:xHCI Host Controller
    /sys/bus/usb/devices/usb4/product:xHCI Host Controller
    
  2. 检查所有 USB 设备的唤醒状态:

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

    结果应该是这样的:

    /sys/bus/usb/devices/1-1/power/wakeup:disabled
    /sys/bus/usb/devices/2-1/power/wakeup:disabled
    /sys/bus/usb/devices/3-11/power/wakeup:disabled
    /sys/bus/usb/devices/3-3/power/wakeup:enabled
    /sys/bus/usb/devices/3-4.4/power/wakeup:disabled
    /sys/bus/usb/devices/3-4/power/wakeup:disabled
    /sys/bus/usb/devices/4-4/power/wakeup:disabled
    /sys/bus/usb/devices/usb1/power/wakeup:disabled
    /sys/bus/usb/devices/usb2/power/wakeup:disabled
    /sys/bus/usb/devices/usb3/power/wakeup:disabled
    /sys/bus/usb/devices/usb4/power/wakeup:disabled
    

    就我而言,仅为 USB 设备 3-3 启用唤醒功能,根据前面的列表,该设备是“有线光电鼠标”。

    我想仅为无线键盘启用从挂起状态唤醒功能,并禁用其余键盘。键盘 USB 接收器连接到 HUB,与上一个列表中的 3-4.4(“USB 接收器”)相对应。

  3. 创建一个完成该工作的脚本:

    要获得 root 权限:

     sudo su
    

    然后我们为脚本创建文件(该文件可以命名为“usbwakeup”或任何你想要的描述性名称):

     nano /etc/init.d/usbwakeup 
    

    文件内容。只需更改“脚本操作”部分即可使其适应您的需求(我喜欢在脚本中添加注释,以便知道如果我某天再次打开它们时它们实际上会做什么):

    #!/bin/bash
    #
    #######################
    # GENERAL INFORMATION #
    #######################
    #
    # - This script enables / disables wake up from suspend# for USB devices.
    #
    # - The script needs execution permissions.
    #
    # - For this script to be executed when the system starts, there must be
    #   a symbolic link to it in /etc/rc3.d/ with priority S01
    #   (for example: /etc/rc3.d/S01usbwakeup)
    #
    ###########################
    # RELATED USEFUL COMMANDS #
    ###########################
    #
    # - Identify USB devices:
    #   grep . /sys/bus/usb/devices/*/product
    #
    # - Check the status of "wake up of the suspension" of USB devices:
    #   grep . /sys/bus/usb/devices/*/power/wakeup
    #
    #
    ##################
    # SCRIPT ACTIONS #
    ##################
    #
    # Disables wake up from suspend for optical mouse
    echo disabled > /sys/bus/usb/devices/3-3/power/wakeup
    #
    # Enables wake up from suspend for the wireless keyboard
    that I have connected to a USB 3.0 HUB in the USB port nr.4
    echo enabled > /sys/bus/usb/devices/3-4.4/power/wakeup
    
  4. 赋予其执行权限:

    chmod +x /etc/init.d/usbwakeup
    
  5. 在 /etc/rc3.d/ 中创建一个符号链接,以便它在启动时启动:

    sudo ln -s /etc/init.d/usbwakeup /etc/rc3.d/S01usbwakeup
    

通过重新启动系统,一切都应按脚本中指定的方式工作。更改将持久化,因为它们将在每次系统启动时执行。

参考

答案4

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

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

相关内容