USBのパワーコントロール

USBのHUBのポートの電源を制御するために以下のような回路を考えていました。

![USB_POWER1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a8e60f6c-3735-87fb-8509-fc06148ec9fe.png)

制御にはUSBが使えるPICやAVRのマイコンを使うつもりでした。

この仕組みだと普通のHUBは4ポートなので3ポートしか使えなくなります。

USB HUBのチップのGL850Gのデータシートを眺めていたら、PWRENという信号が出ているのに気がつきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/91ca9730-6339-f497-9dd4-ef3d35b5af03.png)

どうもUSBのper-port power switching(PPPS)という仕様でHUBのポートの電源コントロールができるみたいです。

![USB_POWER2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/28e12803-0e63-fee9-dcab-1585f51cf2aa.png)

いろいろ調べていたら、[uhubctl](https://github.com/mvp/uhubctl)というツールが見つかりFreeBSDでも使えるようです。

早速ZRouterのportsもどきに追加してみました。本家のportsには無いようです。

RT3883で確認してみます。

```
# ./uhubctl 
Current status for hub 1-0.0 [0000:0000 MediaTek OHCI root HUB]
  Port 1: 0100 power
  Port 2: 0103 power enable connect []
Current status for hub 0-0.0 [0000:0000 MediaTek EHCI root HUB]
  Port 1: 0503 power highspeed enable connect []
  Port 2: 0500 power highspeed
Current status for hub 0-1 [0409:0059]
  Port 1: 0100 power
  Port 2: 0100 power
  Port 3: 0100 power
  Port 4: 0100 power
# ./uhubctl -l 0-1 -p 4 -a off
Current status for hub 0-1 [0409:0059]
  Port 4: 0100 power
Sent power off request
New status for hub 0-1 [0409:0059]
# ./uhubctl
Current status for hub 1-0.0 [0000:0000 MediaTek OHCI root HUB]
  Port 1: 0100 power
  Port 2: 0103 power enable connect []
Current status for hub 0-0.0 [0000:0000 MediaTek EHCI root HUB]
  Port 1: 0503 power highspeed enable connect []
  Port 2: 0500 power highspeed
Current status for hub 0-1 [0409:0059]
  Port 1: 0100 power
  Port 2: 0100 power
  Port 3: 0100 power
  Port 4: 0000 off
```

最初の二つがSOC内蔵のHUBで最後のが接続したHUBでバッファローの古い2.0初期のものです。NECのuPD720112というチップが使われています。ただこのHUBはチップは設定はできますが、VCCの回路は直につながっているみたいで、意味がありません。

このルーターのUSBの電源はgpioで制御できて、gpioctlでHUBごと見えなくすることはできます。

uhubctlはオプション無しで起動すると、対応してるHUBの状況がでますが、結構対応してないHUBが多いので、分かりにくいような気がします。

[ルーターのUSB](https://qiita.com/yamori813/items/68e622d5e3532fceac3e)のようにUSB電源制御用のチップを使えばオーバーロードすると流れなくなって、検知できますが、リレーだとできないので、安全のためにポリスイッチを入れておくのが良いかもしれません。

GL850Gは28ピンのパッケージもあって、こちらはPWRENは二つしか出てないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8ee3fa7d-5ead-dcef-cca5-98c83fe4da7f.png)

Terminus Technology IncのFE 1.1は4ポートのチップで1本Power Controlがあるのですが、uhubctlは対応していないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bd88f8de-3bc8-1a52-edfc-221bc9af1bfe.png)

|VID|PID|uhubctl|備考|
|:--|:--|:--|:--|
|05e3|0608|非対応||
|05e3|0606|非対応|ALCOR USB Hub 2.0|
|1a40|0101|非対応|Terminus Technology Inc FE 1.1|
|0409|0059|対応|NEC uPD720112|
|0409|005a|対応|NEC uPD720114|
|0451|2046|非対応|TI TUSB2046(12M)|
|2109|2812|非対応|VIA Labs, Inc. VL812 Hub(3.0)|

NECのチップはピンによるコンフィグレーションで非対応になることもあるようです。

uhubctlはAtheros(BigEndian)のモジュールで確認するとPID,VIDのエンディアンが間違えてるようです。

調べてみるとHUBのIC自体はPower Controlのピンがあるケースが多いですが、ほとんど未使用のようです。またたいていPower ControlはOver Currentとペアーになっています。

ジャンクのルーターでGlobal Mixed-mode Technology Inc.のG526というチップでPowerを制御しているものがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/407eea54-3c5b-6fe2-0952-7477af06bd95.png)

Apple Pro KeyboardにはAIC1525が使われていました。

MAX8586ETAというチップもあるようです。

ポートごとに制御する方法はIndividualモードとよばれ、ポートをまとめて制御する方法はGang(ギャング)モードと呼ばれているようです。

usbconfigだけでもできるようです。

https://b09066522014.wordpress.com/2010/10/05/usbconfig-%E3%81%A7%E3%80%80%E3%83%8F%E3%83%96%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E9%9B%BB%E6%BA%90%E5%88%B6%E5%BE%A1-freebsd-8-1/

以前はUSBのOn/Offで制御できる電源タップがあってこれを制御されている方がいましたが、最近は製品のタップはほとんど見かけませんし、けっこう高価だったようで、今だとスマートプラグも安くなったので、そっちの方が良いかもれません。