[JP] Raspberry Pi 4 Model B によるUSB-Proxyの構築手順

princhan
7 min readApr 30, 2023

--

USBアナライザーが高いため Raspberry Pi 4 を使った USBパケット解析の機器を作ることが目的です。

注意書き
C#を専門とするプログラマーなため、Linuxに関連する知識はないので間違ったことを書くかもしれないことをご了承ください。

参考サイト
- ラズパイとusb-proxyを使ったUSBプロトコルアナライザ
USB Raw Gadget がカーネルバージョン v6 以上だとmakeが通らなくなるためraw-gadgetそのものに手を加えることで動かせるようになりました。
その原因と対処法も記載します。

用意したもの
- Raspberry Pi 4 Model B
- 64GB の microSD
- USB Type-A Type-C オス-オス ケーブル
- HORI グリップコントローラー for Nintendo Switch
- HORI グリップコントローラー 専用アタッチメント

大まかな流れ
1.
Raspberry PiのOSをmicroSDに書き込む
2. SSHで接続
3. 前準備
4. raw-gadgetの実行
5. usb-proxyの実行
6. 実機テスト

1. Raspberry PiのOSをmicroSDに書き込む

1–1. OSはRaspberry Pi OS Lite (64-bit)を選択

1–2. ストレージを選択

1–3. 歯車をクリックして詳細設定画面を開いて以下の情報を設定
☑ ホスト名: usb-analyzer .local
☑ SSHを有効化する
● パスワード認証を使う
☑ ユーザー名とパスワードを設定する
ユーザー名: pi
パスワード:raspberry
☑ Wi-Fiを設定する
SSID: xxxx
パスワード: xxxxx
etc..

1–4. 書き込みボタンを押して実行

2. SSHで接続

2–1. RLogin に接続先を追加

2–2. 接続

3. 前準備

以下のコマンドで最新の状態に更新し、カーネルモジュールを取得する

sudo apt update
sudo apt upgrade -y
sudo apt install git -y
sudo apt install raspberrypi-kernel-headers
echo “dtoverlay=dwc2” | sudo tee -a /boot/config.txt
echo “dwc2” | sudo tee -a /etc/modules
sudo reboot

/lib/module/xxxxx の xxxx はカーネルモジュールのバージョン
apt update && upgrade で /lib/module/6.1.21-v8+/ にバージョンアップ
raspberrypi-kernel-headers で /lib/module/6.1.21-v8+/build が作成される

4. raw-gadgetの実行

git clone https://github.com/programmer-princhan/raw-gadget.git
cd raw-gadget/raw_gadget/
make
sudo ./insmod.sh
cd ../../

./update.sh は実行しないこと

5. usb-proxyの実行

git clone https://github.com/AristoChen/usb-proxy.git
cd usb-proxy/
sudo apt install libusb-1.0–0-dev libjsoncpp-dev -y
make

cd ~
cd raw-gadget/raw_gadget/
sudo ./insmod.sh
cd ../../usb-proxy
sudo ./usb-proxy — device=fe980000.usb — driver=fe980000.usb — vendor_id=0f0d — product_id=0185

6. 実機テスト

raw-gadgetのエラーについて

root@usb-analyzer:/home/pi/raw-gadget/raw_gadget# make
make -C /lib/modules/6.1.21-v8+/build M=/home/pi/raw-gadget/raw_gadget SUBDIRS=/home/pi/raw-gadget/raw_gadget modules
make[1]: Entering directory ‘/usr/src/linux-headers-6.1.21-v8+’
CC [M] /home/pi/raw-gadget/raw_gadget/raw_gadget.o
/home/pi/raw-gadget/raw_gadget/raw_gadget.c: In function ‘raw_ioctl_run’:
/home/pi/raw-gadget/raw_gadget/raw_gadget.c:546:8: error: implicit declaration of function ‘usb_gadget_probe_driver’; did you mean ‘usb_gadget_frame_number’? [-Werror=implicit-function-declaration]
546 | ret = usb_gadget_probe_driver(&dev->driver);
| ^~~~~~~~~~~~~~~~~~~~~~~
| usb_gadget_frame_number
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:250: /home/pi/raw-gadget/raw_gadget/raw_gadget.o] Error 1
make[1]: *** [Makefile:2012: /home/pi/raw-gadget/raw_gadget] Error 2
make[1]: Leaving directory ‘/usr/src/linux-headers-6.1.21-v8+’
make: *** [Makefile:8: default] Error 2

上記のようなエラーが出てしまうため今回はraw-gadgetをフォークして修正済みのソースコードをクローンすることにしました。

原因
usb_gadget_probe_driver関数がカーネルバージョンv5には存在するがv6には存在しないため。

対処方法
usb_gadget_register_driver関数を呼び出すようにソースコードを修正

カーネルモジュールのソースコード
v5
v6

--

--