Keiichi Ota
Posts: 2
Joined: Tue Jun 04, 2019 11:05 pm

USBの電源の制御

Tue Jun 04, 2019 11:18 pm

USBへ接続したデバイスのON,OFFをしたいため、Hub-Ctrl.cをダウンロード、コンパイルし、利用しています。
最近購入したPi3 Model B+では、思った通り動いたのですが、2年程前に購入したModel Bを使い、同じ手順で操作したところ、
思ったようには動きませんでした
何か対応方法をご存知の方居られましたら、お知恵を貸してください。

1)Model B+を使い、"hub-ctrl -b 1 -d 2 -P 2 -p 0"を実行すると、USBに接続したデバイスがOFFされた
2)Model Bで同じ操作をしたところ、一瞬、デバイスはOFFされるが、直ぐにONに戻る
3)Model B+に差したSDカードをModel Bへ差して操作したが、症状は同じであった

3)の点から、Model BとModel B+の違いの影響ではないかと勝手に判断しましたが、別の原因かもしれません
Hub_Ctrl.pyでも試しましたが、同じ症状でした
コンパイルの方法も色々試しましたが、変化はありませんでした

どうぞよろしくお願いします
ご検討に際し、不足する情報がありましたら、お知らせください

otani
Posts: 92
Joined: Fri Dec 13, 2013 4:18 am

Re: USBの電源の制御

Wed Jun 05, 2019 3:31 pm

(1) libusb-dev をインストールする。
$sudo apt-get -y install libusb-dev

(2) コンパイル
$ wget http://www.gniibe.org/oitoite/ac-power- ... b/hub-ctrl....
$ gcc -O2 -o hub-ctrl hub-ctrl.c -lusb
外していたらごめんなさい。

matoken
Posts: 62
Joined: Sat Jan 05, 2013 10:30 am
Location: kagoshima japan

Re: USBの電源の制御

Fri Jun 07, 2019 2:03 pm

手元の「Raspberry Pi Model B Rev 2」でちょっと確認してみました
外部USB port にKeyboard を接続した状態で `hub-ctrl -b 1 -d 2 -P 2 -p 0` を実行してみると自分の環境でも一旦Keyboard の電源が切れた後再接続されました.
このときの dmesg を見るとこのような感じです.

Code: Select all

[Jun 7 05:03] usb 1-1.2: USB disconnect, device number 10
[  +0.418297] usb 1-1.2: new low-speed USB device number 11 using dwc_otg
[  +0.206293] usb 1-1.2: New USB device found, idVendor=04d9, idProduct=3113
[  +0.000024] usb 1-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[  +0.000011] usb 1-1.2: Product: USB Keyboard
[  +0.050100] input: USB Keyboard as /devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/0003:04D9:3113.000F/input/input14                                              
[  +0.064821] hid-generic 0003:04D9:3113.000F: input,hidraw0: USB HID v1.10 Keyboard [USB Keyboard] on usb-20980000.usb-1.2/input0                                              
[  +0.093355] input: USB Keyboard as /devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.1/0003:04D9:3113.0010/input/input15                                              
[  +0.065883] hid-generic 0003:04D9:3113.0010: input,hidraw1: USB HID v1.10 Device [USB Keyboard] on usb-20980000.usb-1.2/input1
hub-ctrl をオプション無しで実行してみるとサポートされていないように見えます.

Code: Select all

$ ./hub-ctrl
Hub #0 at 001:000
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.
Hub #1 at 001:000
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.
恐らく電源の制御はサポートされていないので単体では出来ないように思います.
電源制御対応のUSB Hub を入手してその先に制御したいものを接続すればうまく行くのではないかと思います.(若しくは今動いているPiと同じものをもう一つ買う)
以下のページにいくつかの対応ハブのリストがあります.

以下余録

`lsusb -v` の出力結果の「Hub Descriptor」セクションの中に「Per-port power switching」がある場合電源の制御が出来るようです.

下のポートにデバイスを接続して確認

Code: Select all

$ sudo lsusb -v -s 1:4|grep "power switching"
上のポートにデバイスを接続して確認

Code: Select all

$ sudo lsusb -v -s 1:5|grep "power switching"
内蔵デバイスをそれぞれ確認

Code: Select all

$ sudo lsusb -v -s 1:3|grep "power switching"
$ sudo lsusb -v -s 1:2|grep "power switching"
    Per-port power switching
$ sudo lsusb -v -s 1:1|grep "power switching"
    Ganged power switching
内蔵の 1:2 が対応しているように見えます.
これは内蔵USBハブで,その下に外部USB port がぶら下がっているようです.

Code: Select all

$ lsusb -s 1:2
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. SMC9512/9514 USB Hub
$ lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/3p, 480M
        |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M
        |__ Port 2: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 2: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
これだけ見ると制御できそうなんですけど一旦電源が切れた後復帰制てしまうのは完全に対応していないのかもしれないですね.

確認に使ったRaspberry Pi

Code: Select all

$ cat /proc/device-tree/model ;echo
Raspberry Pi Model B Rev 2
Kagoshima Linux User Group : https://kagolug.org/
my site: https://matoken.org
my pi : 1B/1B+/1A/1A+/2B/3B/Zero/Zweo W

Keiichi Ota
Posts: 2
Joined: Tue Jun 04, 2019 11:05 pm

Re: USBの電源の制御

Sat Jun 22, 2019 11:56 pm

丁寧にご返信くださり、ありがとうございました。
参考にさせて頂き、以下のようで、ひとまず、対応しました。

①hub-ctrlのコンパイル
以下のようでコンパイルしました
gcc -O hub-ctrl hub-ctrl.c -lusb

②usbの電源供給停止
Pythonのスクリプト内でusbのon,offを記載していた関係上、以下のようでスクリプト内に記しました。
1)usbのoff
return do_command("echo -n '1-1.2' | sudo tee /sys/bus/usb/drivers/usb/unbind ; sudo hub-ctrl -b 1 -d 2 -P 2 -p 0")
2)usbのon
return do_command("sudo hub-ctrl -b 1 -d 2 -P 2 -p 1")

①は、オプションの指定の効果があったのかどうかは、実は、定かではありません。
②は、"unbind"と"hub-ctrl"を記載したところ、offになりましたので、結果よしとしました
on時は、"hub-ctrl"だけでよいみたいです

数時間、継続的に動かしたところ、問題なさそうでした
更に検証が必要かもしれませんが、ひとまず、上記のようで対応しました

もし何か他の知見がございましたら、よろしくお願いします

やはり利用するデバイスは、揃えた方がいいですね

Return to “日本語”