Управление источником питания USB (вкл / выкл) в Linux

164

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

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

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

kamziro
источник
9
Позвольте мне повторить для Linux> = 2.6.38: файл power/level устарел; используйте power/control вместо этого . ( power/wakeupвсе в порядке.) Кроме того, он принимает только «auto» и «on», а не «suspend» больше. «Авто» достаточно умный, и если питание не отключается во время простоя, это ошибка устройства. В любом случае, вы не можете выключить питание вручную. Более подробно см ответа ниже по tlwhitec и док в ядре: kernel.org/doc/Documentation/usb/power-management.txt
Teika kazura
Возможный дубликат stackoverflow.com/q/1163824/1967396
Флорис
2
Эта функция действительно заслуживает хорошего графического интерфейса
mikebabcock
Требуется ли какое-либо специальное оборудование? Из ответов не совсем понятно,
Войтех Дональ

Ответы:

63

Заметка. Информация в этом ответе относится к более старым ядрам (до 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 )

Источник: Документация / usb / power-management.txt.gz

Роман Чепляка
источник
1
Вау, спасибо за это. Я думал, что должен был пройти через libUSB, несмотря ни на что. Любая идея, как получить имена подключенных устройств, а?
Камзиро
Согласно этому посту, без специального оборудования это невозможно? blog.andrew.net.au/2009/01/17
NoBugs
7
Я получаю ошибку «Отказано в разрешении», даже если я использую sudo!
Уолли
3
То
2
В разрешении отказано, потому что команда в форме sudo foo > barанализируется как непосредственный вывод bar, а затем запускается fooс использованиемsudo . Перенаправление не происходит, потому что это происходит до того, как вы получите root-доступ. Решение состоит в том, чтобы использовать sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'и так далее: получить root, запустить новый ад, чтобы выполнить перенаправление, затем вывести что-то в дескриптор перенаправленного файла.
копать
61

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

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"

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

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

tlwhitec
источник
Кажется, это приведет к постоянному отключению USB-устройства ... (?) Как мне возобновить подачу питания после того, как это сработало? Моя цель - один раз перезагрузить устройство, а не навсегда изменить его конфигурацию подвески.
matanster
4
Чтобы возобновить работу приостановленного устройства, вы можете снова отключить функцию «Автоподвеска» echo "on" > "/sys/bus/usb/devices/usbX/power/control", но я думаю, что вам нужно понять первоначальную цель. Функция автоматической приостановки здесь предназначена только для того, чтобы позволить бездействующим устройствам переходить в состояние пониженного энергопотребления (где оно может казаться выключенным), и возобновляться позже, когда это необходимо, либо хостом, либо каким-либо внешним событием. Это происходит (или должно происходить) автоматически. Сам порт на самом деле никогда не отключается. Действительно, прочитайте документы ;)
tlwhitec
4
Я могу подтвердить, что это работает с ядрами> 3.10. Просто должны быть уверены , что устройство «идентификатор» используется правильно: dmesg | grep "usb"и использовать номер после того, как «USB», например: usb 2-4.4: SerialNumber: A0848020вы будете использовать: /sys/bus/usb/devices/2-4.4/power/.... Также убедитесь, что устройство не используется. Я создал скрипт, чтобы упростить этот процесс
Лепе
Есть ли способ сохранить эту конфигурацию, чтобы при каждом ее подключении она не возвращалась к настройкам по умолчанию? У меня есть устройство, для которого мне нужно установить управление питанием, чтобы оно заряжалось.
quickblueblur
@quickblueblur звучит как правило для udev .
tlwhitec
24

Я нашел эти решения, которые по крайней мере работают для правильно сконфигурированного чипа-концентратора 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-устройство просто выполнить «холодный перезапуск», что я в общем хотел сделать. Мой исправленный Hubpower здесь

grandrew
источник
Подтверждено, что записи bind / unbind работают на ядре linux 2.6.34, чипсете ICH8 и Ubuntu 10.04.
user1357196
5
bind / unbind не отключает USB-порт независимо от набора микросхем. Устройство по-прежнему получает питание ...
themihai
2
Лазер мыши выключен, клавиатура не может работать, модем перестает мигать - все хорошо на моей платформе
eri
24

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

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

введите описание изображения здесь

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

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

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

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

Доминик Черизано
источник
2
Потрясающие! : D Я думаю, что это удобный для пользователя способ сделать это (хотя на низком уровне он выполняет те же операции, что и описанные в других ответах.) Спасибо, и пусть ваш ответ достигнет вершины;)
Matyas
1
Спасибо за Ваш ответ. С чего мне начать копать, чтобы изменить заданное неактивное время сохранения?
mikezter
Как упоминалось в предыдущих статьях
Доминик Черизано,
10

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

MVP
источник
прекрасный инструмент на OSX, но не находит для меня никакого «поддерживаемого умного концентратора» на Debian.
дрожание
1
В Linux вам нужно либо запустить его как root (под sudo), либо настроить разрешения для устройства udev. Также возможно, что к вашему хосту Linux не подключены совместимые концентраторы.
mvp
это, кстати, «бигль кость зеленый».
джиттер
7

Я хотел сделать это, и с моим оборудованием USB я не мог. Я написал хакерский способ, как это сделать здесь:

http://pintant.cat/2012/05/12/power-off-usb-device/ .

Коротко говоря: я использовал USB-реле для открытия / закрытия V CC другого USB-кабеля ...

Карлес
источник
5
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

работает на Ubuntu

user3527264
источник
1
ВЫ ЕДИНСТВЕННОЕ РЕШЕНИЕ, КОТОРЫЕ РАБОТАЛИ НА МОЕМ ДЕЛЕ. Я использую ноутбук acer make 12.04LTS Ubuntu.
RicoRicochet
1
Не отключает питание устройства, только удаляет его из списка устройств. Как я могу отключить USB-порт?
rustyx
1
Это также единственное решение, которое помогло мне выключить планшет Wacom Intuos5 touch M без его отключения (на Fedora 28)
user1738984
2

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

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

NoBugs
источник
2

Причина , почему люди размещать такие вопросы, как это связано с dreaded- в самом деле « ЗЛО „- USB Auto-Приостановить“ функция ».

Автоматическая приостановка отключает питание «незанятого» USB-устройства, и если драйвер устройства не поддерживает эту функцию правильно, устройство может стать недоступным. Таким образом, включение / выключение USB-порта является симптомом проблемы, а не самой проблемой.

Я покажу вам, как ГЛОБАЛЬНО отключить авто-приостановку, избавляя от необходимости вручную включать и выключать порты USB:

Короткий ответ:

Вам НЕ нужно редактировать « autosuspend_delay_ms » по отдельности: USB autosuspend можно отключить глобально и ПРОСТО, используя следующие команды:

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

update-grub

systemctl reboot

В конце «Длинного ответа» следует скриншот из Ubuntu 18.04, показывающий, как были достигнуты мои результаты.

Длинный ответ:

Это правда, что в документации по ядру управления питанием USB указано, что autosuspend не рекомендуется использовать и вместо нее используется autosuspend_delay_ms, которая используется для отключения autosuspend USB:

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."

ОДНАКО мое тестирование показало, что настройка usbcore.autosuspend=-1в / etc / default / grub, как показано ниже, может использоваться в качестве GLOBAL- переключателя для функции автоподключения USB - вам НЕ нужно редактировать отдельные файлы " autosuspend_delay_ms ".

В том же документе, ссылка на который приведена выше, указано, что значение «0» ВКЛЮЧЕНО, а отрицательное значение ОТКЛЮЧЕНО :

power/autosuspend_delay_ms

    <snip> 0 means to autosuspend
    as soon as the device becomes idle, and negative
    values mean never to autosuspend.  You can write a
    number to the file to change the autosuspend
    idle-delay time.

На аннотированном скриншоте Ubuntu 18.04 ниже, иллюстрирующем, как мои результаты были достигнуты (и воспроизводимы), пожалуйста, отметьте, что по умолчанию «0» ( включено ) в autosuspend_delay_ms .

Затем обратите внимание, что после ТОЛЬКО настройки usbcore.autosuspend=-1в Grub, эти значения теперь отрицательны ( отключены ) после перезагрузки. Это избавит меня от необходимости редактировать отдельные значения и теперь может отключить автоматическое отключение USB.

снимок экрана: автоматическое приостановление значений до и после глобального редактирования

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

F1Linux
источник
1

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

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Волшебная страна
источник