Отключите и включите снова USB-устройство в терминале

В течение многих лет я имел дело с этой ошибкой Ubuntu, где мои замораживания мыши вскоре после начальной загрузки и затем периодически замораживаются после этого. Для фиксации его я должен физически отключить приемопередатчик usb для мыши и разъема, это въезжает задним ходом. От моего исследования эта ошибка происходит с беспроводными мышами Windows USB когда двойная загрузка Linux и Windows.

Существует ли способ, которым я могу программно (от терминала), отключают приемопередатчик USB вместо того, чтобы делать его физически? Я хочу достигнуть этого в своем сценарии удара запуска.

Я использую Ubuntu 16.04

Править: Я решил свою проблему, но она действительно не касается моего вопроса.

В файле..

/etc/laptop-mode/conf.d/runtime-pm.conf

Я должен был сделать

CONTROL_RUNTIME_AUTOSUSPEND=0

Это исправляет ошибку мыши, которую я испытывал в течение многих лет.

6
задан 10 December 2018 в 21:13

2 ответа

Я записал сценарий, чтобы показать, как я сделаю это:

#!/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, заносят статью в блог.

4
ответ дан 23 November 2019 в 07:59
#!/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 ядра и заставляет устройство полностью перенумероваться.

5
ответ дан 14 August 2020 в 15:34

Другие вопросы по тегам:

Похожие вопросы: