Управление источником питания USB (вкл / выкл) с Linux - PullRequest
152 голосов
/ 16 января 2011

Можно ли включать / выключать источники питания от USB вручную с помощью Linux?

Есть этот внешний USB-вентилятор (тот, который вы используете для охлаждения, а не ПК), и он будетПриятно иметь возможность управлять им из терминала, потому что я хочу расположить вентилятор где-то далеко.

Полагаю, это может быть полезно и для множества других вещей, потому что есть много USBигрушки там.Может быть, очистители воздуха и т. Д. (Я слышал, что они на самом деле не работают).

Ответы [ 9 ]

61 голосов
/ 16 января 2011

Примечание. Информация в этом ответе относится к более старым ядрам (до 2.6.32). См. ответ tlwhitec для получения информации о более новых ядрах.

# disable external wake-up; do this only once
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 

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

(Вам может потребоваться изменить usb1 на usb n )

Источник: Documentation / usb / power-management.txt.gz

57 голосов
/ 01 октября 2012

Согласно документам , в управлении питанием USB от ядра 2.6.32 было несколько изменений, которые, похоже, устанавливаются в 2.6 0,38 . Теперь вам нужно подождать, пока устройство не станет idle , которое определяется конкретным драйвером устройства. Драйвер должен поддерживать его, иначе устройство никогда не достигнет этого состояния. К сожалению, теперь у пользователя нет шансов форсировать это. Однако, если вам повезло, и ваше устройство может бездействовать, то чтобы отключить это, вам необходимо:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"

или, для ядер версии 2.6.38 и выше:

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

Это буквально означает: иди приостанови в тот момент, когда устройство бездействует.

Так что, если ваш вентилятор не является чем-то «интеллектуальным», который можно рассматривать как устройство и которым управляет драйвер, вам, вероятно, не повезет в современных ядрах.

21 голосов
/ 07 августа 2013

Я нашел эти решения, которые по крайней мере работают для правильно сконфигурированного чипа-концентратора Terminus FE 1.1 USB:

1.Чтобы отключить питание всех портов USB концентратора, вы можете отсоединить концентратор от ядра, используя:

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind

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

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind

2.Подключение питания на каждом порту в отдельности сложнее: я смог использовать hubpower для управления каждым портом - но это имеет и обратную сторону: hubpower сначала отключает usbdevfs, который вызывает все устройства USB отключиться от системы, хотя бы на ubuntu:

usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);

С отключенным ioctl я смог отключить питание отдельного порта, не отключая все устройства, но питание сразу же включается (возможно, из-за того, что ядро ​​видит неинициализированное устройство), что приводит к простому «холодному» подключению USB-устройства перезагрузка ", что я обычно хотел сделать. Моя исправленная мощь здесь 1016 *

18 голосов
/ 06 мая 2016

PowerTOP от Intel позволяет переключать устройства, такие как USB-периферия, в режиме реального времени. Они называются перестраиваемыми.

sudo apt install powertop
sudo powertop
  • Перейдите к «перестраиваемым».
  • Прокрутите вниз до своего устройства.
  • Нажмите Enter, чтобы переключить режим энергосбережения ( Хорошо / Плохо )

enter image description here

Обратите внимание, что Bad означает, что устройство всегда включено. Переключение на Хорошо выключит устройство после заданного неактивного времени сохранения (по умолчанию 2000 мс).

См. Документы PowerTOP для получения подробной информации о том, как сделать эти изменения постоянными.
Он генерирует скрипты конфигурации для вас (в значительной степени как описано другими авторами в этой теме).

ПРИМЕЧАНИЕ. Эти сценарии не влияют на питание контактов USB (которое всегда включено).
Они только отправляют протокол драйвера для активации и деактивации устройства.

Если вы хотите управлять питанием контактов, вы можете использовать либо поддерживаемый интеллектуальный USB-концентратор, либо, что еще лучше, микроконтроллер .

8 голосов
/ 08 ноября 2016

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

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

7 голосов
/ 20 мая 2012

Я хотел сделать это, и с моим USB-оборудованием я не смог. Я написал хакерский способ сделать это здесь: http://pintant.cat/2012/05/12/power-off-usb-device/. Коротко говоря: я использовал USB-реле для открытия / закрытия Vc другого USB-кабеля ...

5 голосов
/ 12 апреля 2014
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

работает для Ubuntu

3 голосов
/ 24 ноября 2016

USB 5 В всегда включен (даже когда компьютер выключен, на некоторых компьютерах и на некоторых портах). Вам, вероятно, потребуется запрограммировать Arduino с помощью какого-либо коммутатора и управлять им через последовательную библиотеку с подключенного USB к компьютеру.

Другими словами, комбинация этого учебного руководства по коммутатору и этого учебного пособия по связи через последовательную библиотеку с Arduino, подключенного через USB.

1 голос
/ 17 июля 2017

У меня была проблема при подключении телефона с Android, я не мог зарядить свой телефон, потому что питание включилось, а затем выключилось ... PowerTop позволил мне найти этот параметр и был полезен для устранения проблемы (автоматическое значение вызывало проблему):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...