Отключение питания на USB-порт. Или отключите питание всей подсистемы USB


28

У меня есть USB-лампа, которую я специально купил, чтобы программно выключить ее в определенное время, поэтому мне нужно отключить питание USB-порта.

Я думаю, что у меня есть USB-хаб на USB6. Лампа подключена к одному из портов в этом концентраторе:

#myhost$ lsusb 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
...
Bus 008 Device 006: ID 050d:0234 Belkin Components F5U234 USB 2.0 4-Port Hub

Вот что я попробовал:

Два решения здесь , первый предлагает:

echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 
echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off

но я получаю write error: Invalid argumentпри попытке написать /sys/bus/usb/devices/usb1/power/level:

$sudo bash -c 'echo disabled > /sys/bus/usb/devices/usb6/power/wakeup'
$echo suspend|sudo tee /sys/bus/usb/devices/usb6/power/level suspend
tee: /sys/bus/usb/devices/usb6/power/level: Invalid argument
$sudo bash -c 'echo suspend> /sys/bus/usb/devices/usb6/power/level'bash: line 0: echo: write error: Invalid argument

Второе решение:

sudo bash -c 'echo 0 > /sys/bus/usb/devices/usb6/power/autosuspend_delay_ms; echo auto > /sys/bus/usb/devices/usb6/power/control'

который отключает питание USB-концентратора.

Я также пытался следовать этому :

Но вывод lsusb -tпросто зависает:

$lsusb -t
4-1:0.0: No such file or directory
4-1:0.1: No such file or directory
^C

Что мешает мне использовать этот метод, чтобы получить часть '2-1.1' к этому:

echo '2-1.1' > /sys/bus/usb/drivers/usb/unbind

Есть ли альтернативный способ получения этой информации?

В качестве альтернативы, есть ли способ отключить питание всей подсистемы USB? Что то типа modprobe -r usb_etc?

Мое ядро:

$uname -r
3.2.0-4-amd64

какие синтаксические ошибки? в этом случае нет необходимости заключать в кавычки простые строки «suspend», «disabled». если у вас есть привычка цитировать, отлично подходит для вас, но в этом случае это не нужно.
user84207

Я попытался зафиксировать lsusb -tвызов и не нашел ничего полезного в то время, когда мне пришлось отлаживать его. У меня, честно говоря, сейчас нет времени, чтобы найти ошибки в lsub, и я даже не могу сейчас их воспроизвести, так что, вероятно, это зависит от подключенных устройств. Мне придется подождать, чтобы вернуться домой, чтобы попытаться воспроизведите это.
user84207

Ответы:


20

Вы можете использовать утилиту командной строки uhubctl для управления питанием USB на порт для совместимых концентраторов USB.

Он работает только на концентраторах, которые поддерживают переключение питания на порт, но учтите, что многие современные материнские платы имеют концентраторы USB, которые поддерживают эту функцию.

Скомпилировать:

git clone https://github.com/mvp/uhubctl
cd uhubctl
make

Чтобы вывести список состояний всех концентраторов, их местоположения и портов, которыми может управлять uhubctl:

uhubctl

Чтобы отключить питание порта 5 одного совместимого концентратора:

uhubctl -a 0 -p 5

Если у вас подключено более одного совместимого концентратора, используйте -lдля указания местоположения концентратора, чтобы управлять им:

uhubctl -a 0 -p 5 -l 3-1.2

Чтобы выключить и включить питание:

uhubctl -a 2 -p 5

Обратите внимание, что концентраторы USB 3.0 также поддерживаются, и довольно много новых концентраторов USB 3.0 действительно работают хорошо.

Узнайте больше здесь .

Раскрытие - я автор uhubctl.


Немного больше информации было бы неплохо. Тем более, что вы автор, и это не стандартный пакет примеров того, как его использовать, что, если какие-либо возможности / ограничения у него есть, риски, если таковые имеются, ответы только на ссылку не предпочтительны.
Захари Брэди

2
Ну, копирование / вставка всего файла README не кажется мне хорошей идеей. Все объяснения объяснены.
mvp

Нет, весь файл readme будет чрезмерным. Как вы можете использовать программу для решения проблемы, поставленной в вопросе. И если есть какие-то предостережения для этого конкретного случая использования, а не для всего приложения. Извините, если я не ясно в моем первом комментарии.
Захари Брэди

1
К сведению: этот метод работает для хост-контроллеров PCIe-USB семейства Renesas UPD720202. :) Благодарность.
Wossname

Спасибо @Wossname. Вы не против добавить его в качестве нового выпуска на github.com/mvp/uhubctl/issues ? Я обновлю список поддерживаемых устройств.
mvp

20

См. Управление питанием USB (вкл / выкл) с помощью linux , короткая версия, для более новых ядер «suspend» больше не работает:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"

Но он буквально не отключает питание, он сигнализирует о выключении устройства, это зависит от устройства, чтобы реализовать управление питанием и делать правильные вещи.

У вас есть много подробностей в официальной документации ядра, там объясняются различные файлы /sys/bus/usb/devices/.../power/и как управлять устройствами и портами.

Для вещей, которые не являются реальными USB-устройствами (ваша USB-лампа отображается в lsusb?) Вам не повезло, я попробовал себя с USB-лампой и GPS-регистратором, который заряжает аккумулятор и передает данные через USB, который показывает как cp210x USB к последовательному порту, и ни один не делает poweroff. Я могу «отключить» GPS с помощью echo '5-4.6' > /sys/bus/usb/drivers/usb/unbindи повторно подключить его, echo '5-4.6' > /sys/bus/usb/drivers/usb/bindно индикатор зарядки аккумулятора всегда включен.

Но похоже, что некоторые хабы делают это правильно .


0

Это НЕ нужно индивидуально редактировать « autosuspend_delay_ms файлы».

Автоподвеска USB может быть отключена ГЛОБАЛЬНО и ПРОСТОГО с помощью:

sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub

update-grub

systemctl reboot

Требуется всего несколько секунд, чтобы проверить предложенное исправление и проверить его правильность.

Ubuntu 18,04 аннотированный скриншот ниже иллюстрирует его модификацию , как вышеописанные , что приводит к хосту перезагрузки с ВСЕ настройками USB autosuspend инвалидов:

Демонстрация Ubuntu 18.04 с глобальным отключением автоспуска USB

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.