RaspberryPi 4 Model B で USBポートの電源をON/OFFする

# やりたかったこと
ラズパイに接続したwebカメラで異常検出を行い、異常ケースでパトランプを回す、というようなことがしたかった。
（正確にはこれからやる予定）
色々調べた結果、USB連動で電源ON/OFFするのが、最も手軽＆電子工作等しなくてもできそうだったのですが、懸念点がいくつか。

- 世の中にラズパイ4での記事が無い
- ラズパイ3ではUSBポートの親子関係？があり、色々面倒らしい
    - 回避策としては、個別給電ON/OFFに対応している別のUSB-Hubを挟むといいらしい

やりたいことが「USBカメラ」を回して監視しつつ、「USB電源制御」で別の機器を動かしたい、というニーズなので、個別にON/OFFできないのは致命的…。
が、しかしラズパイ4ではUSB3.0ポートが搭載されたりとハードウェア的に大きく変わっているので、できるのでは…？
ということでやってみましたー。

# 結論：~~できた~~ ような気がした
~~完全に個別でON/OFFできました！完全勝利！~~ 
できたような気がしたが、接続機器が連動してくれない。。。
調査中
[USB per\-port power switching \- Qiita](https://qiita.com/naosone/items/2e20c304f0e37ec964dd)
[GitHub \- mvp/uhubctl: uhubctl \- USB hub per\-port power control](https://github.com/mvp/uhubctl#raspberry-pi-4b)

1/13追記
結局、別のUSBハブを挟まないと出来なかった。
[RaspberryPi 4 Model B で USBポートの電源をON/OFFする　リトライ \- Qiita](https://qiita.com/natsu_san/items/9264480f0d26c5afc108)

以下はメモとして残しておきます



# 用意したもの

- RaspberryPi 4 Model B
- USB接続のwebカメラ
- USB給電で動くガジェット（今回は適当なものがなかったのでそのへんに落ちてた有線マウス）

# 検証手順

- USBポートのうち1つにカメラを接続し、VedeoStreamを開いて表示
- の状態で残りのポートにUSB給電ガジェットを接続して、電源OFF
- VedeoStreamが止まらない＝カメラへの給電が止まらないことを確認
- 以上をポート毎にぐるぐる検証

# 実際の手順
## hub-ctrl導入

```
sudo apt-get install libusb-dev
wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
gcc -O2 hub-ctrl.c -o hub-ctrl-armhf-static -lusb -static
sudo cp hub-ctrl-armhf-static /usr/local/bin/hub-ctrl
```

## USBポートの状態を確認
この場合。ポート2にカメラ、ポート4にマウスが刺さっている。

```
sudo lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 027: ID 05ac:0304 Apple, Inc. Mighty Mouse [Mitsumi, M1152]
Bus 001 Device 026: ID 1e4e:0100 Cubeternet WebCam
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
USB2.0と3.0で別々のrootを持っているらしいことが分かる。

```
sudo hub-ctrl -v
Hub #0 at 002:001
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
Hub #1 at 001:002
 INFO: ganged switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0103 power enable connect
   Port 3: 0000.0100 power
   Port 4: 0000.0303 lowspeed power enable connect
Hub #2 at 001:001
 INFO: individual power switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect
```

Hub #1がUSB関連、Hub #2がイーサネットらしい。
こっちでは結局USB2.0も3.0も同じHubに属している。
物理的配置はこんな感じ。
ラズパイ3ではPort2からだったのが1からになってるのがちょっといい感じ。

```
 LAN
+---+  Port1 Port2（USB3.0)
|   |
+---+  Port3 Port4（USB2.0)
```

## 給電制御してみる
※出来たっぽく見えるが、実際には制御できてない

```

sudo hub-ctrl -b 1 -d 2 -P 4 -p 0 -v
 Hub Port Status:
Hub #1 at 001:002
 INFO: ganged switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0103 power enable connect
   Port 3: 0000.0100 power
   Port 4: 0000.0303 lowspeed power enable connect
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect
Send control message (REQUEST=1, FEATURE=8, INDEX=4)
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0103 power enable connect
   Port 3: 0000.0100 power
   Port 4: 0000.0000
```

コマンドオプション

```
-b バスNo　Hub #1 at 001:002の001の方
-d デバイスNo Hub #1 at 001:002の002の方　※lsusbで出てくるDeviceは関係ない
-P PortNo（USBポートの番号）
-p 0:OFF 1:ON
-v 詳細表示オプション（普段はつけなくて良い）
```

# 参考記事
[raspberry pi 3 b\+とパトランプで遊ぶ \- 不動産情報ボット](https://timesale.club/2019/05/02/raspberrypi/)
[RaspberryPI 3 Model B で USBポートの電源をON/OFFする: パソコン鳥のブログ](https://vogel.at.webry.info/201711/article_2.html)