web-dev-qa-db-ja.com

LinuxでのUSB電源の制御(オン/オフ)

Linuxを使用してUSBから電源を手動でオン/オフにすることはできますか?

この外部USB冷却ファン(PCではなく、自分自身を冷却するために使用する種類)があり、ファンを遠くのどこかに配置したいので、ターミナルから制御できるのはいいことです。

USBのおもちゃはたくさんあるので、これは他のさまざまなことにも役立つと思います。空気清浄機などかもしれません(実際には機能しないと聞きました)。

151
kamziro

注:この回答の情報は、古いカーネル(2.6.32まで)に関連しています。新しいカーネルの情報については、 tlwhitec's answer を参照してください。

# 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をusbnに変更する必要がある場合があります)

ソース:Documentation/usb/power-management.txt.gz

61
Roman Cheplyaka

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"

これは、文字通り、デバイスがアイドル状態になった瞬間にsuspendになることを意味します。

そのため、ファンがデバイスとして認識され、ドライバーによって制御される「インテリジェント」なものでない限り、おそらく現在のカーネルではあまり運がありません。

57
tlwhitec

少なくとも適切に構成された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は最初にすべてのUSBデバイスを切断するusbdevfsを切断しますシステムから、少なくともubuntuでは:

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

このioctlを無効にすると、すべてのデバイスを切り離さずに個々のポートの電源をオフにできましたが、電源がすぐにオンになり(おそらくカーネルが初期化されていないデバイスを認識したため)、USBデバイスは「コールドリスタート」を実行します私は一般的にやりたかった。私のパッチを適用したハブパワーは こちら です

21
grandrew

IntelのPowerTOPを使用すると、USB周辺機器などのデバイスをリアルタイムで切り替えることができます。これらは「チューナブル」と呼ばれます。

Sudo apt install powertop
Sudo powertop
  • 「チューナブル」に移動します。
  • デバイスまでスクロールダウンします。
  • Enterキーを押して、省電力モードを切り替えます(Good/Bad

enter image description here

Badは、デバイスが常にオンであることを意味します。 Goodに切り替えると、プリセットの非アクティブな保存時間(デフォルトは2000ms)後にデバイスの電源が切れます。

これらの変更を永続的にする方法の詳細については、PowerTOPのドキュメントを参照してください。
構成スクリプトを生成します(このスレッドの他の投稿者が説明したとおりです)。

注:これらのスクリプトは、USBピンの電源には影響しません(常にオンになっています)。
これらは、デバイスをアクティブ化および非アクティブ化するためにドライバプロトコルのみを送信します。

ピンの電力を制御する場合は、サポートされているスマートUSBハブを使用するか、さらに良いのは microcontroller です。

18

uhubctl -コマンドラインユーティリティを使用して、互換性のあるUSBハブのポートごとにUSB電力を制御できます。

開示-私はuhubctlの著者です。

8
mvp

これをやりたかったのですが、USBハードウェアではできませんでした。ここでそれを行う方法をハッキーな方法で書きました: http://pintant.cat/2012/05/12/power-off-usb-device/ 簡単に言うと、USBリレーを使用して別のUSBケーブルのVcを開閉しました...

6
Carles
echo '2-1' |Sudo tee /sys/bus/usb/drivers/usb/unbind

ubuntuで動作します

5
user3527264

USB 5v電源は常にオンになっています(コンピューターの電源がオフの場合、一部のコンピューターおよび一部のポートでも)。おそらく、何らかのスイッチを使用してArduinoをプログラムし、USBコンピューター。

言い換えれば、 this switch tutorialと this USBでプラグインされたArduinoへのシリアルライブラリ経由の通信に関するチュートリアルの組み合わせです。

3
NoBugs

Android電話を接続するときに問題が発生しました。電源をオンにしてからオフにしたため、電話を充電できませんでした...問題を引き起こしていました):

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

人々がこのような質問を投稿する理由は、恐ろしいためです-実際に「EVIL」-USB Auto-Suspend "feature」。

自動サスペンドは、「アイドル」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スクリーングラブは、「ロングアンサー」の最後に続き、私の結果を示しています達成されました。

長い答え:

SB Power Management Kernel Documentation は、自動サスペンドが非推奨であり、代わりに「autosuspend_delay_ms」を使用して、USBの自動サスペンドを無効にします。

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

しかし私のテストでは、/ etcにusbcore.autosuspend=-1を設定することが明らかになりました/ default/grubは以下のように使用できますGLOBALUSB自動サスペンドの切り替え機能性-あなたはではなく個々の「autosuspend_delay_ms)ファイル。

同じ ドキュメント 上記のリンクは、「0」の値はENABLEDおよびa負の値は無効

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」であることに注意してください(enabled)inautosuspend_delay_ms

次に、ONLYGrubでusbcore.autosuspend=-1を設定すると、これらの値は負(disabled)再起動後。これにより、個々の値を編集する手間が省け、USBの自動サスペンドを無効にするスクリプトを作成できます。

screengrab: autosuspend values Before and after globally editing

これにより、USBの自動サスペンドを無効にするのが少し簡単になり、スクリプト化が容易になることを願っています。

1
F1Linux