web-dev-qa-db-ja.com

USB制御電源タップのUSB電源を無効にする

USBポートが1つあるUSB制御の電源タップがあります。

enter image description here

コンピューターの電源がオンになっていて、USB経由で電源タップに接続されている場合、電源タップはすべてのソケットに電力を供給します。電源タップに接続されているコンピューターのUSBポートへの電源をプログラムで無効にしたいのですが。

これは動作しません:

$ echo suspend > /sys/bus/usb/devices/usb*/power/level
-bash: echo: write error: Invalid argument

これを行う他の方法はありますか?他の場所からサーバーに接続し、電源ソケットに接続されているすべてのデバイスの電源をオフにしたいのですが。

6
axel22

電源タップは、接続されたUSBポートが提供する+ 5Vを読み取る以外のことをしますか? (アタッチするとdmesgに何かが表示されますか?差し込んだ後、lsusbの出力は変わりますか?)そうでない場合、カーネルは何もアタッチされていることを認識しません。デバイスがそれ自体を列挙しない場合、デバイスにサスペンドするように指示することはできません。デバイスは/ sys/bus/usb/devicesの下に表示されることはなく、USBを使用すると、ポートではなくデバイスをサスペンドします。

さらに、Documentation/usb/power-management.txtから:

 power/control

            This file contains one of two words: "on" or "auto".
            You can write those words to the file to change the
            device's setting.

            "on" means that the device should be resumed and
            autosuspend is not allowed.  (Of course, system
            suspends are still allowed.)

            "auto" is the normal state in which the kernel is
            allowed to autosuspend and autoresume the device.

            (In kernels up to 2.6.32, you could also specify
            "suspend", meaning that the device should remain
            suspended and autoresume was not allowed.  This
            setting is no longer supported.)

したがって、最後の小さな声明によると、2.6.32より新しいカーネルを使用している場合は、とにかくUSBデバイスを強制的にサスペンドすることはできないようです。

あなたが実際に望んでいた答えをあなたに与えることはできません。

8
Miles Strombach
# To enforce suspend immediately when device is unused:
echo -n "0" >$DEV_POWER_PATH"/power/autosuspend_delay_ms"
echo -n "auto" >$DEV_POWER_PATH"/power/control"
# Make the device was not used
rmmod drv_name # see result of lsmod

# Power on: 
echo -n "2000" >$DEV_POWER_PATH"/power/autosuspend_delay_ms"
echo -n "on" >$DEV_POWER_PATH"/power/control"
# Make the device was used.
modprobe drv_name
5
BorysO2

私も同じ問題を抱えていました。 ls -alは、rootのみが書き込みアクセス権を持っていることを示しました

-rw-r--r-- 1 root root 4.0K May  8 10:27 level

だから私はSudoで同じコマンドを実行しようとしましたが、それでも同じエラーが発生しました

それを機能させるために私が見つけた唯一の方法は、このファイルに対してchmodを実行してから、それに書き込むことでした。また。私の側では、制御とautosuspend_delay_msは十分ではありませんでした。本当に一時停止できるようにするには、バインドを解除する必要がありました。

Sudo chmod 777 /sys/bus/usb/devices/2-1.7/power/control
Sudo chmod 777 /sys/bus/usb/devices/2-1.7/power/autosuspend_delay_ms
Sudo chmod 777 /sys/bus/usb/drivers/usb/unbind
echo "auto" > "/sys/bus/usb/devices/2-1.7/power/control"
echo "0" > "/sys/bus/usb/devices/2-1.7/power/autosuspend_delay_ms"
echo -n "2-1.7" > /sys/bus/usb/drivers/usb/unbind
2

パトリスにあなたの解決策をありがとう、それは私のために働いた。私が抱えていた唯一の問題は、デバイスを再起動する方法がわからないことでした!でプロセスを逆にしようとしています

echo "on" > "/sys/bus/usb/devices/2-1.7/power/control"
echo "2000" > "/sys/bus/usb/devices/2-1.7/power/autosuspend_delay_ms"
echo -n "2-1.7" > /sys/bus/usb/drivers/usb/bind

動作しませんでした。最後に、Cコードioctl(fd、USBDEVFS_RESET、0)を使用してUSBバス全体をリセットすることだけが可能でしたが、これにより強制的に再起動するようです。これは、見つかったコードをコンパイルすることによって行われます ここ (つまり、gcc usbreset.c -o usbresetを使用)、この場合はバス#2で実行します。

usbreset /dev/bus/usb/002/001

これを行うことにより、バス2上のすべてのデバイスは、デフォルトのプロパティが設定された状態で戻ってくるように見えます。

2
Jeremyg

ハブを使用してそのハブへの電源を投入しないと、ハブには独自のpowerbrickが接続されなくなります。上記の投稿のいずれかに従ってデバイスのように動作する限り、ハブをオフにすることが可能であるはずです。

しかし、実際には(誤って)USBがストリップによって電力供給されている他のポートに接続されていると、それらが正しくマウント解除されないため、うんざりします。

コンピュータの電源をオフにして電源タップをオフにする方法があると便利な場合があります。しかし、今のところ良いシナリオは思いつきません。

2
Mikkel Breiler

これはどう:

for i in /sys/bus/usb/devices/usb* ; do echo "suspend" > $i/power/level; done

デバッグの目的で、どこかに「echo $ i」を追加して、どのデバイスがヒットしているかを知らせることができます。

1
Hack Saw