システムトークスのSUGOI HUB4Xシリーズ という凄いネーミングのUSBハブを使ってみました。
うたい文句は安定した高出力の電源供給ということですが、実はソフトによってパソコンから電源オンオフができるというのも特徴です。
http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
を入手してコンパイルすると、
「usb.hがありません」
と文句を言われました。
ふむふむ、usb.h は libusb-dev パッケージに含まれているとな…。
sudo apt-get install libusb-dev で無事入手しました。
さて再度コンパイルすると、
/tmp/ccEdGPrr.o: 関数 `hub_port_status' 内:
hub-ctrl.c:(.text+0xb1): `usb_control_msg' に対する定義されていない参照です
/tmp/ccEdGPrr.o: 関数 `usb_find_hubs' 内:
hub-ctrl.c:(.text+0x37a): `usb_get_busses' に対する定義されていない参照です
hub-ctrl.c:(.text+0x459): `usb_open' に対する定義されていない参照です
hub-ctrl.c:(.text+0x4b4): `usb_control_msg' に対する定義されていない参照です
hub-ctrl.c:(.text+0x639): `usb_close' に対する定義されていない参照です
hub-ctrl.c:(.text+0x769): `usb_close' に対する定義されていない参照です
/tmp/ccEdGPrr.o: 関数 `main' 内:
hub-ctrl.c:(.text+0xb67): `usb_init' に対する定義されていない参照です
hub-ctrl.c:(.text+0xb6c): `usb_find_busses' に対する定義されていない参照です
hub-ctrl.c:(.text+0xb71): `usb_find_devices' に対する定義されていない参照です
hub-ctrl.c:(.text+0xc13): `usb_open' に対する定義されていない参照です
hub-ctrl.c:(.text+0xce4): `usb_control_msg' に対する定義されていない参照です
hub-ctrl.c:(.text+0xd38): `usb_close' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
なんだか更に一杯怒られました。結構時間を掛けて調べたところ、libusb.aなどが/user/libの下ではなく、/usr/lib/x86_64-linux-gnu の下に落とされていたことが判明し、ようやく解決です。
適切なbus番号を$ bus、device番号を$ deviceとすると、
sudo ./hub-ctrl -b ${ bus } -d ${ device } -P 1 -p 0
で1番ポート(左端のダウンストリームポート)の電源が遮断されました。
なるほど、これはスゴイかも知れません。
ところで、hub-ctrl.cを公開してくれているのは、システムトークスともNECとも関係なさそうな方ですね。ということは一般にUSBハブに対して hub-ctrl.c を使用すると、電源のオンオフが可能になるのではないでしょうか。
と考えて十年来使用している ArvelのH428-GNというハブでも同じことを試してみましたが、結果は全くの不発でした。上手くゆく製品とそうでない製品があるということなのでしょうね。