WSLからUSBを利用する(USB/IP)

WSLが出た当初に組み込み界隈で問題視されて、既に回避記事が多数記事が出ているUSB/IPの記事です。

いまさら感がありまくりですが、、、わたし個人のメモ的な意味合いで書き残しておきます。

USB/IPでWindowsとWSLを橋渡し

普通のWSLは、USBデバイスを利用できません。 たとえば、XIAO ESP32C6をPCに接続しても、WSLで認識されません。(認識されれば、Serialが表示されるはず。)

root@DESKTOP-O9671AF:~# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@DESKTOP-O9671AF:~#

そこでUSB/IPの出番です。 ネットワーク経由で遠隔のUSBにアクセスするUSB/IPというプロジェクトを使うと、WSLのLinuxからUSBデバイスが利用できるようになります。

https://usbip.sourceforge.net/images/usbip-design.png

Windows側でUSB/IPサーバーを動かしておいて、Linux側でUSB/IPクライアントで接続します。 なお、今回使うusbipd-winでは、Linux側のUSB/IPクライアントの操作がWindows側から可能です。ちょっとややこしい。

usbipd-winをインストール

usbipd-winのReleasesから最新のインストーラをダウンロードして実行します。

github.com

わたしは、usbipd-win_5.3.0_x64.msiをインストールしました。

WSLのLinuxからからXIAO ESP32C6にアクセス

WindowsにXIAO ESP32C6を接続すると、デバイスマネージャにCOMとUSB JTAGが認識されます。

ここでusbipd listを実行して、XIAO ESP32C6のBUSIDを得ます。

WSLのLinuxを起動しておき、Windows側で管理者として実行しているコマンドプロンプトusbipd bind -b 6-3usbipd attach -w -b 6-3を実行します。 すると、Linux側からXIAO ESP32C6が見えるようになります。

Windows側:

Linux側:

もちろん、Windowsのデバイスマネージャからは消えます。

USBデバイスの状態遷移

bindやattachすると、下図のようにUSBデバイスの接続状態が遷移します。

USBデバイスは一度bindするとpersistedと記憶されて、デバイスをリセットしたりUSB抜き差ししたときに自動的にbindされます。 そのため、2回目からはbind操作は不要です。

ただ、attachはされないのでusbipd attachはしなければいけません。 まぁ、そうですよねー。