memoメモ

最近はGo言語関連で。φ(..)メモメモ

LinuxからUSB HUBの電源のON/OFFを制御してみる

はじめに

USBの規格上、各ポートの電源の制御ができる(Per-port power switchingというらしい?)そうですが、その機能を実装しているデバイスがあまり無いようです。 いろいろを探してみるとSUGOI HUBがその機能を実装しているということなので買って試してみました。

システムトークス SUGOI HUB4Xシリーズ ブラック アダプタ付 電力供給安定型 USB2-HUB4XA-BK

システムトークス SUGOI HUB4Xシリーズ ブラック アダプタ付 電力供給安定型 USB2-HUB4XA-BK

システムトークス SUGOI HUB4Xシリーズ ホワイト アダプタ付 電力供給安定型 USB2-HUB4XA-WH

システムトークス SUGOI HUB4Xシリーズ ホワイト アダプタ付 電力供給安定型 USB2-HUB4XA-WH

lsusbコマンドで確認する

Linuxならなんでもいいですが、とりあえずraspberry pi 2で。

lsusbで確認してみます:

pi@raspberrypi ~ $ sudo lsusb 
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0409:005a NEC Corp. HighSpeed Hub

このなかのNEC Corp.製のチップのデバイスがSUGOI HUBです。BUS=1, Device=4であることがわかります。

hub-ctrlを使って制御する

portの電源制御が簡単にできるようになるので利用してみます:

http://www.gniibe.org/development/ac-power-control-by-USB-hub/index.html

hub-ctrlをコンパイル

$ wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
$ gcc -O2 -o hub-ctrl hub-ctrl.c -lusb

-vで各portの状態が確認できます:

pi@raspberrypi ~ $ sudo ./hub-ctrl -v
Hub #0 at 001:004
 INFO: individual power switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0100 power
   Port 3: 0000.0100 power
   Port 4: 0000.0100 power
*snip*

Hub #0 at 001:004が先にlsusbで確認したBUS=1, Device=4のSUGOI HUBです。

操作してみる

portはSUGOI HUBの左から1,2,3,4の順で指定できます。

$ sudo ./hub-ctrl -b 1 -d 4 -P 1 -p 0 # port 1のpower off
$ sudo ./hub-ctrl -b 1 -d 4 -P 1 -p 1 # port 1のpower on
$ sudo ./hub-ctrl -b 1 -d 4 -P 2 -p 0 # port 2のpower off
$ sudo ./hub-ctrl -b 1 -d 4 -P 2 -p 1 # port 2のpower on

なお、port 3,4は操作できませんでした。

これでUSBファンなどが自在に操作できます! USB電源連動のタップを使えば、安全に電化製品を制御できそうですね。

https://gist.github.com/atotto/5c1d55a2cb99ced9f7c7

raspberry piでやっていて気になったこと

hub-ctrl -vで確認するとBUS=1, Device=2にも何か見えています。 これはraspberry piのものです。

Hub #1 at 001:002
 INFO: individual power switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect
   Port 2: 0000.0100 power
   Port 3: 0000.0100 power
   Port 4: 0000.0503 highspeed power enable connect
   Port 5: 0000.0100 power
Hub #2 at 001:001
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect

ためしに、raspberry piのportを操作してみました。 port 1の電源を落とすとLANが落ちました:

$ sudo ./hub-ctrl -b 1 -d 2 -P 1 -p 0

port 2、または、port 4を操作するとraspberry piのUSBの電源がすべて落ちました:

$ sudo ./hub-ctrl -b 1 -d 2 -P 2 -p 0
$ sudo ./hub-ctrl -b 1 -d 2 -P 4 -p 0

残りのport 3,5はよくわかりません。 #どこの資料をみればいいのでしょう。。