В течение многих лет я имел дело с этой ошибкой Ubuntu, где мои замораживания мыши вскоре после начальной загрузки и затем периодически замораживаются после этого. Для фиксации его я должен физически отключить приемопередатчик usb для мыши и разъема, это въезжает задним ходом. От моего исследования эта ошибка происходит с беспроводными мышами Windows USB когда двойная загрузка Linux и Windows.
Существует ли способ, которым я могу программно (от терминала), отключают приемопередатчик USB вместо того, чтобы делать его физически? Я хочу достигнуть этого в своем сценарии удара запуска.
Я использую Ubuntu 16.04
Править: Я решил свою проблему, но она действительно не касается моего вопроса.
В файле..
/etc/laptop-mode/conf.d/runtime-pm.conf
Я должен был сделать
CONTROL_RUNTIME_AUTOSUSPEND=0
Это исправляет ошибку мыши, которую я испытывал в течение многих лет.
Я записал сценарий, чтобы показать, как я сделаю это:
#!/bin/bash
port="1-1.1" # as shown by lsusb -t: {bus}-{port}(.{subport})
bind_usb() {
echo "$1" >/sys/bus/usb/drivers/usb/bind
}
unbind_usb() {
echo "$1" >/sys/bus/usb/drivers/usb/unbind
}
unbind_usb "$port"
# sleep 1 # enable delay here
bind_usb "$port"
Сначала необходимо получить номер шины и номер порта рассматриваемого USB-порта. Можно сделать это с lsusb
и любое устройство Вы распознаете в lsusb
вывод, я использую SanDisk pendrive здесь:
$ lsusb
Bus 001 Device 005: ID 04f2:b39a Chicony Electronics Co., Ltd
Bus 001 Device 112: ID 8087:07dc Intel Corp.
Bus 001 Device 019: ID 04d9:1603 Holtek Semiconductor, Inc. Keyboard
Bus 001 Device 018: ID 0424:2504 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 022: ID 0781:5567 SanDisk Corp. Cruzer Blade
Bus 001 Device 002: ID 8087:8000 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
|__ Port 1: Dev 22, If 0, Class=Mass Storage, Driver=usb-storage, 480M
|__ Port 2: Dev 18, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 1: Dev 19, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 1: Dev 19, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
|__ Port 7: Dev 112, If 0, Class=Wireless, Driver=btusb, 12M
|__ Port 7: Dev 112, If 1, Class=Wireless, Driver=btusb, 12M
|__ Port 8: Dev 5, If 1, Class=Video, Driver=uvcvideo, 480M
|__ Port 8: Dev 5, If 0, Class=Video, Driver=uvcvideo, 480M
От вывода lsusb
Вы получаете номер шины и номер устройства устройства, затем ищете это устройство в выводе lsusb -t
получить номер шины и номер порта (иногда с подпортами). Синтаксис:
1-2.3 # for Bus 1 Port 2 Subport 3 – strip leading zeroes!
Используйте это как port
в сценарии. Теперь просто необходимо сделать это исполняемым файлом с chmod +x /path/to/script
и выполненный это с корневыми полномочиями:
sudo /path/to/script
Мне не было нужно один для моего pendrive, но может быть необходимо для Вас добавить задержку между развязыванием и привязкой снова, это что прокомментированный sleep 1
строка для – можно экспериментировать со значениями, например. sleep 0.5
в течение половины секунды.
Обратите внимание, что этот подход показывает, как отключить и включить снова определенный USB-порт, если Вы хотите, чтобы определенное устройство было развязано и оживилось снова, необходимо будет использовать тот же USB-порт для этого для работы. Можно было думать о способе проанализировать lsusb
вывод для динамичного получения номера шины и номера порта определенного устройства каждый раз, когда сценарий называют это позволило бы Вам использовать любой USB-порт, но я чувствую, что это было бы излишеством здесь.
Предложения, взятые из этого linux.com, заносят статью в блог.
#!/bin/bash
port="usb1" # replace '1' with actual bus number as shown by lsusb -t: {bus}-{port}(.{subport})
bind_usb() {
echo "$1" >/sys/bus/usb/drivers/usb/bind
}
unbind_usb() {
echo "$1" >/sys/bus/usb/drivers/usb/unbind
}
unbind_usb "$port"
# sleep 1 # enable delay here
bind_usb "$port"
Как и в предыдущих ответах, это сбросит хаб. Если вы понаблюдаете за USB-трафиком в такой программе, как wireshark, вы увидите, что предыдущие ответы не приводят к повторному перечислению устройства, а просто перезапускают драйвер устройства. Перезапуск хаба немного углубляется в дерево usb ядра и заставляет устройство полностью перенумероваться.