Raspberry Pi 2 の USB バスパワーを制御する（Pi 3も同じ手順）sudo実行の自動化なども。。

## 動機は、、
関連会社のメンバーから受けたプロジェクトの相談で、古い IOT機器に接続されている USBデバイスの電源を操作したいという要件があり話を聞いてみると、、ラズパイ2の時代に数十台規模で何かの測定関連の機能を実装したらしいのですが、USBデバイスのハードを更改したところ長時間通電していると熱暴走で正常に測定できない事象が、、みたいな内容でした。
USBデバイスはバスパワーで動作するらしく、私の自宅の MPD（Volumio）専用のラズパイ2 ＆ DACと同じような環境という事で、電源の ON/OFF が可能か試してみました。
ちなみに自宅のラズパイ2は 2015年に購入してずっと電源入れっぱなしですが今でも良い音出してるなぁって思います(^^;)

検索したところ、**hub-ctrl**（ https://github.com/codazoda/hub-ctrl.c ）を使ったラズパイ3 以降の記事しか見つかりませんでしたが、**結果的に hub-ctrl でラズパイ2 USBバスパワーの ON/OFF ができました**。
肝心のプロジェクトの方も測定時間帯に合わせて本稿の方法で USB給電の ON/OFF を行う事によりとりあえず運用できている模様でした。

その後、、そもそも更改後の USBデバイスが改良されて電源 ON/OFF は不要になったそうですが、、一応試した内容を以下に記述します。

## 環境
ラズパイのハード情報
~~~
$ more /proc/device-tree/model
Raspberry Pi 2 Model B Rev 1.1
~~~

ラズパイのOS（Volumio V3.0）情報
~~~
$ uname -a
Linux volumio 6.1.69-v7+ #1710 SMP Thu Dec 21 13:14:13 GMT 2023 armv7l GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
~~~
私のラズパイ2は32bit CPUです。ラズパイ2の最終モデルから64bit CPUになった模様ですが、64bit CPU化以降も混乱を避けるため殆どのベンダーが標準で32bit OSを使用してきたようです。
2022年に Raspberry Pi Foundation から 64bit OSの正規版がリリースされています。

## Git から hub-ctrl のソースコードをダウンロード
hub-ctrl（ https://github.com/codazoda/hub-ctrl.c ）から C言語のソースコードを取得します。

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

それ程多くないステップ数なのでざっと見てみましたが、UBSライブラリのAPI（usb_control_msgなど）を利用してUSBデバイス制御を行っており、特に違和感（不自然なロジックなど）はありませんでした。

## ソースコードのコンパイル・リンク
コンパイル・リンクに必要なパッケージをインストールします。なお **hub-ctrlのライセンスは GNU GPL V2となっています**。
~~~
$ sudo apt update
$ sudo apt-get install gcc
$ sudo apt-get install libusb-dev
~~~
コンパイル・リンクして実行モジュールを生成
~~~
とりあえずすべてデフォルトでモジュール生成
$ gcc -o hub-ctrl hub-ctrl.c -lusb

または静的リンクでモジュール生成（最適化 O2 オプションが適切かな）
$ gcc -O2 hub-ctrl.c -o hub-ctrl-static -lusb -static
~~~

ちなみに静的リンクでモジュール生成すると libusb_dev が無い環境でも実行できるので同環境の配布に適しています。実行モジュールのサイズは以下のようになりました。
~~~
-rwxr-xr-x 1 volumio volumio  13128 Feb 10 19:42 hub-ctrl
-rwxr-xr-x 1 volumio volumio 522980 Feb 10 19:58 hub-ctrl-static
~~~

もしパスが通ってる bin などにコピーするなら
~~~
$ sudo cp -p hub-ctrl-static /bin/hub-ctrl-static
~~~

## コマンド実行
これが（パラメーターが）、、どうも思い通りの動作にならないようで色々試行錯誤した結果、一応動くパラメーターが分かりました。

参考にさせていただいたリンクです m(_ _)m

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

バスパワーON
~~~
$ sudo hub-ctrl-static -b 1 -d 2 -P 2 -p 1
~~~
バスパワーOFF
~~~
$ sudo hub-ctrl-static -b 1 -d 2 -P 2 -p 0
~~~
末尾のパラメーター -p が ON（1）/OFF（0）です

lsusbコマンド（検索していただければ。。）の内容を詳しく見てもよく分からず詳細も記述しませんが、ラズパイ2では（多分ラズパイ3も）**「バス 1、デバイス 2、ポート 2」で USB のバスパワーが操作できました**。
またラズパイ2では（多分ラズパイ3も）USB給電の ON/OFF は個別には制御出来ず、4つのポート全体の制御しか出来ないようです。
なおラズパイ2では（多分ラズパイ3も）「バス 1、デバイス 2、ポート 1」は Ethernetポートになるようで、これを OFF にするとラズパイの電源ケーブルを抜くことになります。何度もやってしまいました。。
もしかしたら派生プロジェクトで改良されたソースコードがあるかもしれませんが、バスパワーの ON/OFF が実現できたのでこのコマンド/パラメーターで運用します。

## 運用（リモートシェル実行）
相談を受けたプロジェクトでは比較的最近のバージョンの Windowsでデバイスを管理しているらしく、管理端末は SSH を使えるとの事なので普通にリモート実行ができるかと思ったら、、
よく考えたら **hub-ctrl の実行は root 権限が必要**なのでちょっと工夫することになりました。
ラズパイ側に以下のようなシェルを作成しておきます。

USBバスパワーOFF用シェル（usb_off.sh）
~~~
#!/bin/sh

PW="MyPassword"

expect -c "
set timeout 3
spawn sudo hub-ctrl-static -b 1 -d 2 -P 2 -p 0
expect \"password\"
send \"${PW}\n\"
expect \"$\"
exit 0
"
~~~
↑ 最後のダブルクォーテーションも忘れずに！

古典的な手法ですが expect、spawn、send を利用して sudo実行のパスワード入力に対応しています。
もちろん**この仕組みは別のコマンドでも利用できます。上記コマンド部分「hub-ctrl-static -b 1 -d 2 -P 2 -p 0」を自分が実行したいコマンドに置き換えても sudoでの自動実行ができます**。パスワードが丸見えなのは要注意！
このシェルを以下のように Windowsから SSHでリモート実行します。
~~~
C:\> ssh volumio@192.168.130.18 "./usb_off.sh"
~~~

## その他
SSHで毎回パスワードなどを入力したくない場合は鍵認証方式を利用し鍵のパスフレーズ設定も無しにしておけば、Windows上の SSHコマンドを何も入力せずに実行できます。

SSH公開鍵認証については世の中に解説サイトが数多くありますが一応以下に手順を記述します。

全然関係ないですが、ある日ぼーっとして Windowsのコマンドラインに誤って ssh と入力して普通に動いた時は衝撃でした。。curl とかも。。

https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui

Windows コマンドプロンプトを開いて運用者のユーザーディレクトリ（C:\Users\user01>）で鍵の作成
~~~
C:\Users\user01> ssh-keygen
~~~
鍵の名前はデフォルト、入力を省略したいのでキーフレーズは無しでエンター

公開鍵を Linuxに送信
~~~
C:\Users\user01> scp .ssh\id_rsa.pub volumio@192.168.130.18:ClientPubKey
~~~

Linux側
~~~
$ cat ClientPubKey > ./.ssh/authorized_keys
~~~

Windows側で動作確認
~~~
C:\Users\user01> ssh -i ~/.ssh/id_rsa volumio@192.168.130.18 "ls"
~~~

1回実行後は鍵ファイルの指定が不要
~~~
C:\Users\user01> ssh volumio@192.168.130.18
~~~

一般的な問題判別ですが、もし秘密鍵で ssh できない場合 /etc/ssh/sshd_config の以下設定などを確認します。
AuthorizedKeysFile
AllowUsers
編集後は sshd のリスタートが必要。sudo systemctl restart sshd

## 結局自分のためだったのかも。。
本稿は相談内容のために行った検証でした。相談を受ける前は自宅のラズパイ接続の DAC はずっと電源入りっぱなしでしたが、ショートカットに SSHコマンドを登録して使っていない時はバスパワーを切るようにしました。

![icons.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/52aca01e-cc59-70ca-59ea-e9016211bec9.jpeg)

ショートカットのリンク先には以下のように記述しています。
~~~
C:\Windows\System32\OpenSSH\ssh.exe -i ~/.ssh/id_rsa volumio@192.168.130.18 "./usb_off.sh"
~~~

DACのパワーは切れるようになってもラズパイは相変わらず動きっぱなしですが、、このまま10年以上いけそうな気がしてきました。。金属ケースでの冷却が良かったのかも。。再生（トランスポート）用途では DSDソース（DSD64 2.8MHz）でも PCMリサンプルとかしなければ CPUクロック周波数はラズパイ2で必要十分。というか無線とか不要な人にはラズパイ2が最適！ラズパイ2の予備をいくつか買っておけばよかったかなぁ。。
以上です (^_^)/~