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

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

Лучше всего сделать ставку на uhubctl, поскольку это, похоже, работает на моем оборудовании (автор предупреждает, что не все хаб-контроллеры поддерживают функциональность). Я верю в это, потому что я успешно отключил 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. Это я понятия не имею, как это сделать.

3
задан 27 April 2018 в 22:34

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 здесь.

4
ответ дан 17 July 2018 в 16:00

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

Текущий (d2)

Решение

Создайте сценарий (см. любое имя, которое вы хотите) в каталоге /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 $1 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». Передача параметра «возобновление» ничего не может сделать, потому что устройство выключено, у него нет идентификатора устройства, чтобы включить его.

Извините за «копировать и вставить» с незначительной ревизией для изменения имени устройства, но я сосредоточен на написании сценариев для тестирования Ubuntu 18.04 в этот период занятости.

1
ответ дан 17 July 2018 в 16:00
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 здесь.

4
ответ дан 23 July 2018 в 16:54
  • 1
    Спасибо за это, и я сожалею, что не видел роли о портах USB3, показывающих как USB2 и 3. Думаю, я наконец-то разработал, как связать имена и числа из lsusb, lsusb -t и uhubctl. К сожалению, мой вывод состоит в том, что только данные отключены. Мне не удалось отключить динамики. uhubctl - отличная небольшая программа. Я узнал много о USB от источника, спасибо, что поделился им. – user1759557 29 April 2018 в 17:08
  • 2
    @ user1759557: если вы можете найти / купить любой USB-концентратор из списка поддерживаемых uhubctl, вы можете подключить к нему динамики и контролировать питание. – mvp 29 April 2018 в 19:50

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

Текущий (d2)

Решение

Создайте сценарий (см. любое имя, которое вы хотите) в каталоге /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 $1 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». Передача параметра «возобновление» ничего не может сделать, потому что устройство выключено, у него нет идентификатора устройства, чтобы включить его.

Извините за «копировать и вставить» с незначительной ревизией для изменения имени устройства, но я сосредоточен на написании сценариев для тестирования Ubuntu 18.04 в этот период занятости.

1
ответ дан 23 July 2018 в 16:54
  • 1
    Спасибо. Я узнал кое-что из кода и попробовал его. К сожалению, похоже, что мое оборудование не отключает питание. – user1759557 29 April 2018 в 17:11

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

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