2年3个月后询问,我想我终于让它工作了!

2年3个月后询问,我想我终于让它工作了!

我有一台安装了 Windows 10 的联想 ThinkPad E15。我添加了 Ubuntu 22.04.1 作为选项(双启动)。

每当笔记本电脑进入睡眠状态(进入“挂起”状态)然后我将其唤醒时,罗技无线鼠标滚轮均不工作。(“罗技 MK270 无线键盘和鼠标组合”,但唯一不起作用的是滚轮。)

我已经问过这个问题了,我悬赏了回答这帮助我取得了进展,但并没有完全解决问题。

目前的结果是:cat /etc/systemd/system/[email protected]

[Unit]
Description="Reset a USB device after system resume"
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

[Service]
Type=simple
ExecStart=/usr/bin/usbreset %i
User=root
Group=root

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

当我唤醒计算机时,鼠标滚轮不工作。

我跑过去sudo systemctl status reset-usb-upon-wake@046d:c534.service一看:

○ reset-usb-upon-wake@046d:c534.service - "Reset a USB device after system resume"
     Loaded: loaded (/etc/systemd/system/[email protected]; disabled; vendor preset: enabled)
     Active: inactive (dead)

然后我运行sudo systemctl start reset-usb-upon-wake@046d:c534.service,结果是:

  • 它会无限地向终端打印一堆空的换行符,直到我取消该命令。

答案1

如何检测可重置的 USB 设备?

只需运行usbreset它就会告诉您它能做什么以及如何做...例如像这样:

$ usbreset 
Usage: # <=== This is how to do it (reset devices)
  usbreset PPPP:VVVV - reset by product and vendor id
  usbreset BBB/DDD   - reset by bus and device number
  usbreset "Product" - reset by product name

Devices: # <=== These are the devices that it sees and can reset
  Number 001/002  ID 8087:0a3a  
  Number 001/005  ID 05ac:14a7  iPhone
  Number 001/003  ID 0bda:55ea  EasyCamera

那么,如何在系统从睡眠状态唤醒时自动执行?

一种简单但非常可靠的方法是创建一个脚本,/lib/systemd/system-sleep/读取位置参数$1并相应地运行命令。

该目录中的可执行文件将在系统睡眠/挂起、休眠或混合睡眠之前和之后运行,并向它们传递两个位置参数...$1将保存prepost并将$2保存操作sleep,即hibernate...等。

该过程如下:

  • 创建脚本文件并打开进行编辑...例如像这样:

    sudo nano /lib/systemd/system-sleep/fix-my-mouse-wheel
    
  • 在文件中使用此模板...即将其复制/粘贴到文件中,然后修改它以在正确的部分添加命令,然后保存文件:

    #!/bin/sh
    
    case "${1}" in
      pre)
        # Command(s)/script(s) "each on a newline" to be executed before system goes to sleep/hibernate
          ;;
      post)
        sleep 5 # You most likely will need this sleep call. Leave it alone.
        # Command(s)/script(s) "each on a newline" to be executed after system wakes up from sleep/hibernate
        # e.g. usbreset 05ac:14a7
          ;;
    esac
    
  • 使其可执行如下:

    sudo chmod +x /lib/systemd/system-sleep/fix-my-mouse-wheel
    
  • 完毕。

答案2

我遇到了同样的问题一段时间(在最近的 ubuntu 安装中),并且我看到的任何地方都没有可以作为解决方案的脚本对我有用。

最后 modprobe 成功了,但是这里有一个问题:

如果你lsmod | grep usbhid

您可能会看到 usbhid 被其他东西“使用”(第二列)。就我而言,我经常画画,所以我看到那里列出了“wacom”。这意味着在暂停后我必须执行(顺序很重要):

sudo rmmod wacom && sudo rmmod usbhid && sudo modprobe usbhid && sudo modprobe wacom

如果我rmmod usbhid在“wacom”之前输入,它会出错,并且进程不会没有什么因为依赖性问题。如果是干净启动,我只需在 usbhid 上执行 rmmod/modprobe 组合即可。

现在,我的设备是 Msoft 键盘/鼠标组合,它仅使用 usbhid,罗技设备可能有所不同,我在另一篇文章中看到您声称它hid_logitech_dj也使用,但您也说 modprobing 不起作用。问题是您从哪里得到这个名字的,您是否像图中那样使用 lsmod 找到它多于? 如果你弄清楚了你的意思,我不明白为什么 modprobing 不起作用实际上必须在您的特定系统中卸载/重新加载。

不要链接命令,而是尝试一次执行一个命令,看看其中是否有任何命令返回错误。

你的情况可能属于特殊情况,谁知道呢。遗憾的是 Canonical 没有调查过这个问题,这就像某个花了数年时间才修复的旧暂停错误。

希望这对你有所帮助,即使你又遇到了死胡同,也不要放弃。如上所述,原则上,这个问题并非无法解决。

编辑:

该问题似乎与实现花哨鼠标支持的 Linux Kernel 5 新功能有关。

对于某些 Logitech 和其他鼠标,由于鼠标滚轮的精度/灵敏度较高,简单地循环模块可能不起作用。根据 Solaar 的帖子,用户必须重置鼠标滚轮才能使其正常工作,否则它会处于活动状态但似乎处于非活动状态或慢的

有用的链接:

1.另一篇有类似解决方案的帖子。

2.Launchpad 有类似问题的帖子

3.Logitech 固件错误报告

4.太阳能问题 (Solaar 是 Logitech 设备的 Linux 设备管理器)

5.Linux内核bug报告

答案3

23个月后询问,我想我终于让它工作了!

答案4

[Unit]                                                                                                                                                       
Description="Reset a USB device after system resume"                                                                                                         
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target                                                                      
                                                                                                                                                             
[Service]                                                                                                                                                    
Type=simple                                                                                                                                                  
ExecStart=/usr/bin/usbreset 046d:c534                                                                                                                  
User=root                                                                                                                                                    
Group=input                                                                                                                                                  
[Install]                                                                                                                                                    
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target                                 

我认为在这种情况下 udev 将不起作用。

sudo systemctl enable reset-usb-upon-wake@046d:c534.service

然后让 systemd 知道发生了一些变化。

sudo systemctl daemon-reload

相关内容