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


RaspberryPi 4 Model B で USBポートの電源をON/OFFする - Qiita
のリトライ版

目標

ラズパイに接続したUSBカメラ映像で異常検知を行い、パトランプで警告を行う

構成

USBハブは、Per-port power switching対応のものを使いたかったのだが、BSH4AE12BKが使えるという情報があり、お安かったのでそちらを使った。
パトライトについては、FAX検知用のがお安かったので、それを使いった。
用紙検知部に白紙を巻きつけるだけで常時点灯する。

Per-port power switchingとは

USBハブのポート毎に電源供給をON/OFFできる仕組み。
対応のハブはLinuxであれば、

sudo lsusb -v | less

で、該当のハブのところに

wHubCharacteristic 0x0009
  Per-port power switching
  Per-port overcurrent protection

と表示されれば使える可能性が高い。
(めっちゃ大量に出てくるのでless推奨)
可能性が高い、というのは、ラズパイ4では上記表示があるのにも関わらず、個別制御が出来ないから。
めんどくさっ!

ラズパイ4のUSB構成

物理的配置は、こう

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

論理的配置は、多分こんな感じ

Hub1(Root) - Hub 1.1(USB2.0) - Hub 2(USB3.0) 
                ├ Port1          ├ Port1
                ├ Port2          ├ Port2
                ├ Port3          ├ Port3
                └ Port4          └ Port4

全ポートをON/OFFしていいのであれば、以下でOKだが、個別に制御したいんだよおおおおお。

sudo uhubctl -l 1-1 -a off

事前準備

前の記事では、hub-ctrlを使ったが、その後調べたところ、より使い勝手の良いものが公開されていたので、こちらを使った。
GitHub - mvp/uhubctl: uhubctl - USB hub per-port power control

ファームウェアアップデート

ファームウェアが古いとそもそも動かないらしいのでアップデート。

sudo apt update
sudo apt full-upgrade
sudo reboot

コマンドインストール

git clone https://github.com/mvp/uhubctl
cd uhubctl
make
sudo make install

HUB確認

コマンドを引数なしで呼ぶと、対応しているハブを列挙してくれる。
が、必ずしも確実に対応しているわけではないので、実際に給電状況を見て確認する必要がある。
GitHubのページでも、実際に適当なスマホとかライトとかを繋いで通電確認せよ、とある。
マジめんどくせぇ。。。

sudo uhubctl
Current status for hub 2 [1d6b:0003 Linux 5.4.83-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 3.00, 4 ports, ppps]
  Port 1: 02a0 power 5gbps Rx.Detect
  Port 2: 02a0 power 5gbps Rx.Detect
  Port 3: 02a0 power 5gbps Rx.Detect
  Port 4: 02a0 power 5gbps Rx.Detect
Current status for hub 1-1 [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps]
  Port 1: 0507 power highspeed suspend enable connect [05e3:0608 USB2.0 Hub, USB 2.00, 4 ports, ganged]
  Port 2: 0107 power suspend enable connect [1e4e:0100 GroupGets PureThermal (fw:v1.3.0) 800c0031-5109-3538-3731-313200000000]
  Port 3: 0100 power
  Port 4: 0100 power
Current status for hub 1 [1d6b:0002 Linux 5.4.83-v7l+ xhci-hcd xHCI Host Controller 0000:01:00.0, USB 2.00, 1 ports, ppps]
  Port 1: 0503 power highspeed enable connect [2109:3431 USB2.0 Hub, USB 2.10, 4 ports, ppps]

上記で1-1.1に繋がれているHUBをON/OFFする
HUB自体は、Per-port power switching対応していないので、「-f」オプションを付ける

sudo uhubctl -l 1-1.1 -f -a off

「.1」の部分を.2~.4に変更しても動くが、
USB2.0のポート(3,4)を使う場合でも

sudo uhubctl -l 1-1.4 -f -a off

と指定する必要があるので注意。

推測など

↑は外部給電対応でありながら、大本のUSBの電源連動する、ということで、内部的に何らかのエミュレーション(または誤動作)をしているものと思われる。

また、給電制御ということで、個別ポートの過電圧検知が付いていたり、個別に給電をON/OFFできるハブは、Per-port power switching対応している……かもしれない。

GitHubの情報によると、こちらのメーカーのHUBが対応しているらしい。
(GitHubに報告があるのは16ポート)

ROSONWAY USB ハブ 3.0 16ポート アルミ製 USB Hub 100W セルフパワー USBハブ 5Gbps高速転送 12V/8.3A ACアダプタ付き 独立スイッチ

USBハブ 3.0 ROSONWAY アルミ製 7ポート USB3.0 Hub 24W電源付き バスパワーとセルフパワー両用 独立スイッチ 5Gbps高速転送、12V/2A ACアダプター

今回はBSH4AE12BKで目的達成してしまったので、今後機会があれば上記HUBも試してみたい。