Как отключить питание USB-порта?

3

Я использую Lubuntu 16.04. У меня есть аналоговые динамики, которые берут свое питание от USB-разъема. Я бы хотел, чтобы они отключились, когда я выключил компьютер и приостановил его. Я думал, что это будет довольно легко, но я потратил много времени на поиски в Google и до сих пор не имею решения.

Моя лучшая ставка, кажется, uhubctl , поскольку это, похоже, работает на моем оборудовании (автор предупреждает, что не все поддерживающие hubcontrollers поддерживают функциональность). Я верю в это, потому что я успешно отключил USB-клавиатуру.

Итак, теперь мне нужно знать, что указывать, чтобы отключить питание на USB-разъем для динамиков. Это связано с некоторыми догадками, поскольку они не являются настоящими USB-устройствами и не будут отображаться в lsusb. Глядя на заднюю панель и руководство по материнской плате, я вижу, что группа из четырех разъемов, в которую подключены громкоговорители, описывается как порты USB 2.0 7-10. Моя мышь и веб-камера подключены к одной группе сокетов.

Запуск uhubctl без аргументов дает:

Current status for hub 2-1 [8087:8002, USB 2.00, 8 ports]
Port 1: 0100 power
Port 2: 0100 power
Port 3: 0100 power
Port 4: 0100 power
Port 5: 0100 power
Port 6: 0100 power
Port 7: 0100 power
Port 8: 0100 power
Current status for hub 1-1 [8087:800a, USB 2.00, 6 ports]
Port 1: 0100 power
Port 2: 0100 power
Port 3: 0100 power
Port 4: 0100 power
Port 5: 0100 power
Port 6: 0100 power
Current status for hub 4-5 [174c:3074 ASUS TEK. ASM107x, USB 3.00, 4 ports]
Port 1: 02a0 power 5gbps Rx.Detect
Port 2: 02a0 power 5gbps Rx.Detect
Port 3: 02a0 power 5gbps Rx.Detect
Port 4: 02a0 power 5gbps Rx.Detect
Current status for hub 3-9 [174c:2074 ASUS TEK. ASM107x, USB 2.10, 4 ports]
Port 1: 0100 power
Port 2: 0303 power lowspeed enable connect [047d:2043 NOVATEK Kensington U+P Keyboard]
Port 3: 0100 power
Port 4: 0100 power

Это не слишком полезно. Моя клавиатура появляется, но все мои другие USB-устройства - мышь, Seagate HDD, веб-камера - не упоминаются.

Я пробовал различные команды:

uhubctl -a off -p 2 -l 3-9     #Turns off keyboard as expected
uhubctl -a off -p 2 -l 4-5     #ALSO turns off keyboard. Why ?

uhubctl -a off -p 12345678 -l 2-1 #Does not turn anything off
uhubctl -a off -p 123456   -l 1-1 #Does not turn anything off
uhubctl -a off -p 134      -l 4-5 #Does not turn anything off.

Поэтому я могу отключить клавиатуру. Никакое другое устройство USB не указано (хотя они есть), и они не могут быть отключены.

Я понятия не имею, какие имена хабов представляют, например, 2-1, 1-1, 4-5, 3-9. Также нет никакого способа вывести имена узлов из lsusb.

lsusb дает:

Bus 002 Device 002: ID 8087:8002 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:800a Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hub
Bus 004 Device 002: ID 0bc2:ab24 Seagate RSS LLC 
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 007: ID 047d:2043 Kensington 
Bus 003 Device 003: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
Bus 003 Device 002: ID 0f62:1001 Acrox Technologies Co., Ltd Targus Mini Trackball Optical Mouse
Bus 003 Device 006: ID 046d:0994 Logitech, Inc. QuickCam Orbit/Sphere AF
Bus 003 Device 004: ID 0b05:180a ASUSTek Computer, Inc. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

lsusb -t дает:

/:  Bus 08.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/:  Bus 07.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M
    |__ Port 5: Dev 3, If 0, Class=Hub, Driver=hub/4p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/15p, 480M
    |__ Port 5: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 9: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 2: Dev 7, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 2: Dev 7, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 10: Dev 4, If 1, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 10: Dev 4, If 2, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 10: Dev 4, If 0, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 10: Dev 4, If 3, Class=Application Specific Interface, Driver=, 12M
    |__ Port 14: Dev 6, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 14: Dev 6, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 14: Dev 6, If 2, Class=Audio, Driver=snd-usb-audio, 480M
    |__ Port 14: Dev 6, If 3, Class=Audio, Driver=snd-usb-audio, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M

Я вижу, что между именами узлов и номерами шин / портов существует некоторая взаимосвязь, но я не могу придумать правило.

Я заметил из lsusb, что устройства USB 2.0, похоже, используют контроллер Intel, тогда как устройства USB 3.0 и 2.1, похоже, используют контроллер ASUS. Я задавался вопросом, могут ли чипы Intel не поддерживать контроль мощности, поэтому я попробовал динамики в гнезде USB 2.1, которые я могу отключить, когда он подключен к клавиатуре. Не повезло.

Кто-нибудь знает, почему uhubctrl ведет себя так, как он?

Может быть, uhubctl - красная селедка и не собирается работать. Я знаю, что есть другие способы переключения питания в Ubuntu, но они, похоже, зависят от возможности определять каталог, представляющий разъем USB. Это я понятия не имею, как это сделать.

    
задан user1759557 27.04.2018 в 21:34
источник

2 ответа

4
  • uhubctl использует тот же метод адресации для USB-устройств, что и ядро ​​Linux: b-x.y.z , где b - номер шины USB, затем x , y , z - номера портов цепочки узлов, начиная с корня USB-концентратор для данной шины. Эта адресация является полустабильной - она ​​не изменится, если вы отключите и подключите USB-устройства обратно к одному и тому же физическому порту.
  • Чтобы ответить на второй вопрос, мне нужно процитировать этого от uhubctl README:
      

    Если у вас есть совместимый концентратор USB 3.0, подключенный к восходящему порту USB3, он будет обнаружен как два независимых виртуальных концентратора: USB2 и USB3, а ваши USB-устройства будут подключены к виртуальному концентратору USB2 или USB3 в зависимости от их возможностей и скорости соединения , Чтобы управлять мощностью для таких концентраторов, необходимо отключить / включить питание на виртуальных концентраторах USB2 и USB3, чтобы изменения вступили в силу. uhubctl попытается сделать это автоматически (если вы не отключите это поведение с помощью опции -e).

  • И, наконец, uhubctl будет перечислять только USB-концентраторы, которые утверждают, что поддерживают PPPS (переключение питания на один порт). Однако есть узлы, которые требуют поддержки, но на самом деле не работают (коммутационная схема физически отсутствует). Я поддерживаю список всех концентраторов, которые, как известно, работают .

Раскрытие информации: я автор uhubctl :) Не стесняйтесь открывать проблемы против uhubctl здесь .

    
ответ дан mvp 27.04.2018 в 23:31
1

Это старый ответ от октября 2016 года, который по-прежнему актуальен в апреле 2018 года для Ubuntu 16.04 LTS: Как отключить питание USB для мыши, когда я приостанавливаю ноутбук? .

Текущий блок преткновения с OP-ссылками, последующие комментарии и предлагаемые ответы - это идентификатор продукта static 1b1a:7001 , но номера шины и устройства продолжают меняться.

Решение

Создайте скрипт (любое имя, которое вы хотите) в каталоге /etc/pm/sleep.d/ и поместите в него следующее:

#!/bin/bash
ZeroBUS=$(lsusb | grep 174c:2074 | cut -c  5-7 )

# Strip leading zeros
BUS=$(echo $ZeroBUS | sed 's/^0*//')

# Build "usbX" usb number
USB=usb$BUS

case  in
     suspend|suspend_hybrid|hibernate)
     echo "Powering off: " $USB
        echo $USB | sudo tee /sys/bus/usb/drivers/usb/unbind
        ;;
     resume|thaw)
        # No need to do anything here, kernel unsuspends USB devices
        # Show how to power on for interest sake but since device is
        # powered off the usb number will be blank.
        echo "Powering on: " $USB
        echo $USB | sudo tee /sys/bus/usb/drivers/usb/bind
        ;;
esac

Отметьте файл как исполняемый с sudo chmod +x file_name , где "имя_файла" - это имя, которое вы выбрали.

Объяснение

Это решение отключает весь USB-концентратор, который в моем случае означает телефон, беспроводную мышь, беспроводную клавиатуру и т. д. При вызове сценария из командной строки необходимо ввести пароль sudo. Надеемся, что при вызове из systemd sudo полномочия наследуются. Я не мог проверить это, потому что у меня нет проводной мыши. Поэтому для sudo-мощностей может потребоваться дополнительное уточнение.

Питание не физически отключается, когда BIOS обеспечивает постоянный источник питания 5 В, а устройствам на шине говорят отключиться. В моем случае беспроводная клавиатура и мышь перестали работать и вынуждены были прибегать к клавиатуре ноутбука и сенсорной панели, чтобы вернуть питание.

Вы можете проверить это вручную, вызвав скрипт и передав параметры "suspend". Передача параметра "возобновление" не выполняет ничего, потому что устройство выключено, у него нет идентификатора устройства, чтобы включить его.

Извините за "copy & amp; paste" с незначительной ревизией, чтобы изменить имя устройства, но я сосредоточен на написании сценариев для тестирования Ubuntu 18.04 в этот период занятости.

    
ответ дан WinEunuuchs2Unix 28.04.2018 в 04:03