Керування джерелом живлення USB (включення / вимкнення) за допомогою Linux


164

Чи можливо вмикати / вимикати джерела живлення з USB вручну за допомогою Linux?

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

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


9
Дозвольте мені резюмувати для Linux> = 2.6.38: Файл power/level застарілий; використовувати power/control замість цього . ( power/wakeupнормально.) Крім того, він приймає лише "авто" та "увімкнено", більше не "призупиняє". "auto" досить розумний, і якщо живлення не вимикається в режимі очікування, це несправність пристрою. У будь-якому разі ви не можете вимкнути живлення вручну. Докладніше див . Відповідь нижче від tlwhitec та doc ядра: kernel.org/doc/Documentation/usb/power-management.txt
teika kazura

Можливий дублікат stackoverflow.com/q/1163824/1967396
Флоріс,

2
Ця функція справді заслуговує на хороший графічний інтерфейс
mikebabcock

Чи потрібне якесь спеціальне обладнання? З відповідей це не зовсім зрозуміло,
Vojtěch Dohnal

Відповіді:


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 незалежно від того. Будь-яка ідея, як отримати імена доданих пристроїв?
kamziro

Згідно з цим дописом, без спеціального обладнання неможливо? blog.andrew.net.au/2009/01/17
NoBugs

7
Я отримую дозвіл відмовлено в помилці, навіть якщо використовую sudo!
Уоллі

3
той же для мене "дозвіл відмовлено" навіть після використання
судо

2
У дозволі відмовлено, оскільки команда у формі sudo foo > barаналізується як прямий вихід на bar, а потім запускається з fooвикористаннямsudo . Перенаправлення не вдається, оскільки це відбувається до отримання доступу до кореня. Рішення полягає у використанні sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'тощо: отримати root, запустити новий пекло для виконання переадресації, а потім вивести щось у дескриптор перенаправленого файлу.
копати

60

Згідно з документами , в управлінні живленням USB через декілька ядер 2.6.32 відбулося декілька змін , які, здається, узгоджуються в 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"

Це буквально означає, призупиніть роботу в той момент, коли пристрій стане непрацюючим.

Тож якщо ваш вентилятор не є чимось "розумним", яке можна розглядати як пристрій і керувати драйвером, ви, мабуть, не матимете великої долі в поточних ядрах.


Здається, це призведе до того, що 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

Я знайшов такі рішення, які принаймні працюють для правильно налаштованого мікросхема концентратора USB Terminus FE 1.1:

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-пристрій просто робить «холодний перезапуск», саме це я взагалі хотіли зробити. Моя виправлена ​​потужність тут


Підтверджено, що записи прив'язки / відключення працюють на ядрах Linux 2.6.34, чіпсеті ICH8 та Ubuntu 10.04.
користувач1357196

5
bind / unbind не переробляє USB-порт незалежно від чіпсета. Пристрій все ще отримує потужність ...
themihai

1
миша лазер вимкнений, клавіатура типу косяк, модем припиняє блимати - все добре на моїй платформі
Ері

24

PowerTOP від Intel дозволяє перемикати такі пристрої, як периферія USB, у режимі реального часу. Вони називаються "перехідними".

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

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

Зауважте, що Bad означає, що пристрій завжди увімкнено. Якщо перейти на Good , вимкніть пристрій після встановленого неактивного часу економії (за замовчуванням - 2000 мс).

Докладніше про те, як зробити ці зміни постійними, перегляньте документи PowerTOP .
Він генерує для вас конфігураційні сценарії (майже так, як описано іншими плакатами в цій темі).

ПРИМІТКА. Ці скрипти не впливають на живлення штифтів USB (що завжди увімкнено).
Вони надсилають протокол драйверів лише для активації та деактивації пристрою.

Якщо ви хочете керувати контактом живлення, ви можете використовувати або підтримуваний розумний концентратор USB, а ще краще мікроконтролер .


2
Дивовижно! : DI думаю, що це полегшений користувачеві спосіб (хоча на низькому рівні це робить ті ж операції, що і в інших відповідях. Дякую, і ваша відповідь може досягти вершини;)
Матяш

1
Дякую за вашу відповідь. Де я повинен почати копати, щоб змінити встановлений неактивний час економії?
mikezter

Як згадувалося в попередніх плакатах, документи з ядра тут: kernel.org/doc/Documentation/usb/power-management.txt
Домінік Серісано

10

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


чудовий інструмент на 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


1
ВАС - ТІЛЬКИ РІШЕННЯ, ЯКІ РОБОТИ НА МОЄМУ СЛУЧАЙ. Я використовую ноутбук Acer make 12.04LTS Ubuntu.
RicoRicochet

1
Не переробляє пристрій, лише видаляє його зі списку пристроїв. Як я можу живити USB-порт?
іржа

1
Це також єдине рішення, яке працювало для мене, щоб вимкнути планшет Wacom Intuos5 touch M, не відключаючи його від мережі (на Fedora 28)
користувач1738984

2

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

Іншими словами, поєднання цього підручника з комутацією та цього підручника щодо спілкування через Serial Libary до Arduino підключено через USB.


2

Причина, через яку люди ставлять такі запитання, пов’язана з жахливою справді " 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 - НЕ потрібно редагувати окремі " autosuspend_delay_ms файли ".

Той же документ , пов'язаний вище станів значення «0» ВКЛЮЧЕНИЙ і негативне значення DISABLED :

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: значення автоматичного використання до і після глобального редагування

Сподіваємось, це робить вимкнення автоматичної зупинки через USB трохи простішим та більш чітким сценарієм -


1

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

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.