Raspberry Pi のUSBをコマンドから制御する

## Raspberry Pi のUSBを制御する
### 1. Spec
##### 1-1. ハード面

| アイテム | 詳細 |
|:-|:-|
| Raspberry Pi  | Raspberry Pi 3 Model B+  |

##### 1-2. ソフト面

| 内容 | バージョン |
|:-|:-|
| Raspberry Pi Imager  | v1.6.2  |
| Raspberry Pi OS (32-bit)  | リリース日：2021-05-07  |
| Kernel  | 5.10  |
| (補足)Raspbian  | 10.10  |

### 2. lsusbコマンドについて
+ USBデバイスの一覧と詳細情報を表示

`lsusb` ： USBデバイスを一覧表示する

```
pi@raspberrypi:~ $ lsusb
Bus 001 Device 008: ID 0424:7800 Standard Microsystems Corp. 
Bus 001 Device 007: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/12732dda-d20b-f5cd-db54-b98e56983da6.png)

| バス番号 | デバイス番号 | ベンダーID | プロダクト番号 | ベンダー名 |
|:-|:-|:-|:-|:-|
| Bus 001  | Device 008  | ID 0424  | 7800  | Standard Microsystems Corp.  |
| Bus 001  | Device 007  | ID 0424  | 2514  | Standard Microsystems Corp. USB 2.0 Hub  |
| Bus 001  | Device 002  | ID 0424  | 2514  | Standard Microsystems Corp. USB 2.0 Hub  |
| Bus 001  | Device 001  | ID 1d6b  | 0002  | Linux Foundation 2.0 root hub  |

ベンダー名は、Raspbianなので「/var/lib/usbutils/usb.ids」ファイルを参照する。

| 短いオプション | 長いオプション | 意味 |
|:-|:-|:-|
| -s バス番号:デバイス番号  |   | 表示対象のバスとデバイスを10進数で指定する<br>（どちらか片方の指定も可能：本文を参照）  |
| -d ベンダーID:プロダクト番号  |   | 表示対象のベンダーとプロダクトを16進数で指定する<br>（ベンダーのみの指定も可能：本文を参照）  |
| -v  | --verbose  | 詳細情報を表示する  |
| -t  | --tree  | USBデバイスをツリーで表示する<br>（「-v」や「-D」より優先される）  |
| -D デバイスディレクトリ  |   | 「-D /dev/bus/usb/001/001」のように、/dev/bus/usb下のディレクトリを指定して表示する<br>（「-v」同様の詳細表示となる、※1） |

※1 USBデバイスは「/dev/bus/usb/バス番号/デバイス番号」で管理されている。「-D」オプションを指定しない場合、lsusbコマンドは/dev/bus/usb/以下を走査して一覧表示する。

ツリー表示してみた状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/db36eef0-d54d-19e8-41b3-14d8c1543f2d.png)
参照

https://atmarkit.itmedia.co.jp/ait/articles/1901/17/news028.html

### 2. USBを制御するための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`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/cf27271f-dda0-9ae0-e0f0-c443110137be.png)
(挿す側から見た図）

USBなのにLANがポート1にされているので、
USBとして使えるのはポート2~5。

Raspberry Pi 3B+ は、ポート毎にON-OFF出来ず、ポート2~5まとめてのON-OFFになる。

### 3. コマンドで制御
USBポートをOFFにするコマンドは、
`sudo hub-ctrl -h 1 -P 2 -p 0`

| コマンド | 内容 |
|:-|:-|
| -h 1  | hub1をコントロール  |
| -P 2  |  port2を指定 |
| -p 0  |  0：電源OFF　<br>1：電源ON |
| -b 001 | BUS001をコントロール |
| -d 005 | device005を指定 |

(他例)
`sudo hub-ctrl -b 001 -d 005 -P 1 -p 0`

ちなみに、Raspberry Pi 3B+ では
`sudo hub-ctrl -h 0 -P 2 -p 0`
では動きませんでした。
hubの指定だけではダメなようで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/4a5623df-2fb8-767a-14c1-9928a43d1df0.png)
`sudo`で権限がないとコマンド使えませんでした。
また、`./` があるものとないものの違いはよくわかりませんでした。

### 4. 参考にさせて頂いたサイト

https://github.com/codazoda/hub-ctrl.c

http://mofuken.blogspot.com/2019/07/raspberry-pi-usb-onoff.html

https://kinokotimes.com/2017/03/07/usb-control-method-by-raspberry-pi/