Управление питанием USB (вкл./Выкл.) С помощью linux

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

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

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

Ответ 1

Примечание. Информация в этом ответе актуальна для старых ядер (до 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

Ответ 2

В соответствии с docs было внесено несколько изменений в управление питанием USB из ядер 2.6.32, которые, по-видимому, оседают в 2.6.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"

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

Поэтому, если ваш вентилятор не является чем-то "интеллектуальным", который можно рассматривать как устройство и управляемым драйвером, вам, вероятно, не повезет с текущими ядрами.

Ответ 3

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

Ответ 4

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

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

enter image description here

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

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

Ответ 8

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

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

Ответ 9

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

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control

Ответ 10

Причина, по которой люди пишут такие вопросы, связана с тем, что dreaded- действительно "EVIL" - функция "Автоподвеска USB".

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

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

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

Вам НЕ нужно редактировать "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_delay_ms, используемая для отключения автоподвески 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 functionality-, которую вы НЕ нужно редактировать отдельные файлы "autosuspend_delay_ms".

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

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.

screengrab: autosuspend values Before and after globally editing

Надеюсь, что это делает отключение автоподвески USB немного легче и более scriptable-