トホホな疑問(54) WSL2、USBシリアル、既につながっておるぞよ。デバイスによるケド。

Joseph Halfmoon

前回「WSL2でシリアルを使えるようにする」と書きました。しかし気づいたら既に使えるようになってました。WSL2でシリアルを使うにはusbipd-winのインストール後カーネル再ビルトが必要と思い込んでいましたが不要でした。usbipd-winのみでシリアルポート使えてます。トホホというよりタナボタな1件。

※「トホホな疑問」投稿順Indexはこちら

Windows11上のWSL2(Ubuntu)でUSBシリアルを使う

最近、USBに接続すれば「シリアルデバイス」として認識されるマイコンボードばかり使ってます。なんといってもお手軽でお楽。一方、WSL2はWindows上でLinuxがお手軽に使えて、これまたお楽。しかし、素のままではWSL2からWindowsが管理しているUSBデバイスにアクセスできません。なんとかならないの、と思った人は多かったのでしょう、御本家マイクロソフト社の以下のページにWSL2上でUSBデバイスを使う方法が説明されています。

USB デバイスを接続する

そこで説明されているのは、以下のオープン・ソース・プロジェクトの成果物を使うもの。

usbipd-win

上記をWindowsにインストールし、Windows管理下のUSBデバイスの所望のものをLinux側でアクセス可能なように「アタッチ」してやればあLinux側から使えるようになる、というもの。

ただし、私、誤解してました。「上記usbipd-winをインストール後、WSL2上で走っているLinuxのカーネルをUSBシリアル対応のドライバを含むものに再ビルドしないとシリアルポートとして使えない」と。どこかでネット情報(多分古い)を見たためかと思います。

しかし今回 usbipd-winのインストールだけでWSL2上のUbuntu20.04からシリアルできることを確認いたしましたデス。

なお、使用したのは以下のバージョンのWindows 11です。

windows11

そして、上記のマイクロソフト社のページの説明どおりに usbipd-win をインストールしてあります。インストール後、「コンピュータの管理」を開き、その中から「サービス」の一覧を見、以下のように「USBIP Device Host」が実行中となっておることを確認です。

usbipd_service

一方、WSL2上で走らせているUbuntuは以下です。uname -aでみたLinuxのバージョンが以下に。UbuntuUname

OSリリースバージョンは以下です。UbuntuOSrelease

USBデバイスのアタッチ、デタッチ

Linux側でUSBデバイスにアクセスするまえに、Windowsに接続されたどのUSBデバイスをLinux側に許可するか指定が必要です。上記のマイクロソフト社の説明ページでは、PowerShellから操作せよみたいに書かれてましたが、アドミニストレータ権限のついたcommand promptからでも問題なく操作できてます。

正確にいうと、接続されているUSBデバイスをリストするための以下のコマンドにはアドミ権限不要でした。

usbipd wsl list

しかし、以下のアタッチ、デタッチ操作は要アドミ権限です。

usbipd wsl attach --busid <busid>
usbipd wsl detach --busid <busid>
Arduino Uno互換機をUSBに接続してみた

互換機、Seeeduino Lotus機をUSBポートに接続し、usbipd wsl listでbusidを確認後、usbipd wsl attachをし、Linux側でどう見えているのか確認してみました。こんな感じ。
cp210x_usbserial_attached

cp210x(定番のUSBシリアルデバイス)に見えてるじゃあーりませんか。/dev/ttyUSB0 として見えているようです。シリアル接続できるかどうかチェックしようとして気づきました。シリアル通信用のソフトをLotusに書き込んでなかったデス。とりあえずデタッチね。

ラズパイPico、MicroPython搭載をUSB接続

そこでUSBシリアル接続でREPLを呼び出せるハズのMicroPython書き込み済のラズパイPicoを接続しなおしました。usbpid wsl listでは以下のような素っ気ないUSBシリアルデバイスとして見えます。

RPiPico
上記のbusid 6-3に向けて管理者権限で以下を発行しました。

usbipd wsl attach --busid 6-3

こんどは、/dev/ttyUSB0 でなく /dev/ttyACM0 に接続されたようです。デバイス名変わったけれども、この辺の仕組みはどうなってるんだろ? ともかく、シリアル通信のテストをしてみることにいたしました。定番のminicomで /dev/ttyACM0に接続してみます。

$ sudo minicom --device /dev/ttyACM0

接続した後の画面キャプチャが以下に。ちゃんとMicroPythonのREPLが動いてました。シリアルポート、使えるじゃん。RPimicroPythonWSL2

余勢を駆って他のマイコンボードを接続してみた

アタッチしてシリアルポートとして見えたマイコンボードを以下に列挙します(メンドイので以下はイチイチminicomで接続してないですが。)

    • Arduino Uno (純正品)

usbipd wsl listでは以下のように、Arduino Uno として見えてます。流石純正品。ArduinoUno

アタッチすれば /dev/ttyACM0でした。

    • ESP32 DevKitC

usbipd wsl listでは以下のようにUSBシリアルデバイスのCP210xに見えます。ESP32devkitC

アタッチすれば /dev/ttyACM0でした。

    • ESP32C3

前回のESP32C3ですが、usbipd wsl listでは以下のようにUSBシリアルデバイスとして「も」見えてました。JTAG/serial debug unitとしても見えるみたいです。使い方はどうすんだろ?後で調べないと。SeeeduinoXiaoESP32C3

アタッチすれば /dev/ttyACM0として見えました。こちらはシリアルのみ?

    • ST Microelectronics、Nucleo-F072RB

Nucleoボードは、usbipd wsl listではデバッグインタフェースであるST-Linkが前面に出ていて、ストレージとして見えてます。シリアルとしてはどうすんだろ?これは、アタッチしてみてません。また今度。

NucleoF072RB

マイコンボードにより、どう認識されるのかは違うけれども、usbipdだけで使えるみたいじゃん。カーネル再ビルド不要か?知らんけど。

トホホな疑問(53) VScodeからESP-IDFインストール、ターゲットによる? へ戻る

トホホな疑問(55) Windows上でのESP-IDFインストール、一手抜けてたデス へ進む