Управление питанием 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-