Windows 11自体やSDKのアップデートにより、Windows上でPico C SDKによるデバッグが頻繁に利用できなくなったり、壊れる現象が発生しています。もっとも良い解決方法は、開発環境にLinuxかmacOSを利用することですが、手元に自由に利用できるLinuxやMacがないという方も多いでしょう。
次善の策として、Windows上の仮想Linux環境であるWSL2にPico C SDKをインストールして利用する方法があります。若干の手間は発生しますが、VSCodeのWSL拡張機能を利用することでWindowsから透過的に開発環境を利用でき、なおかつ仮想とはいえLinux環境下であるためWindowsネイティブよりは安定してPico C SDKを利用することが可能です。Windows上でPico C SDKが動作しなくなった、あるいはインストールできなかった方は以下の手順を参考に、WSL2にインストールしてください。
WSL2のインストール方法はMicrosoft公式を始め、さまざまなサイトに解説があるので、それを参考にすればいいでしょう。インストールプロセス自体は簡単です。コマンドプロンプトかPower Shellを管理権限で開き、次のコマンドを実行してWindowsを再起動します。
> wsl --install [Enter]
ディストリビューションはWindows Storeからインストールするのが簡単です。Windows Storeを起動して、インストールしたいディストリビューション名を検索してインストールしてください。ディストリビューションは自分が利用したいものがあればそれで構いませんが、ここではUbuntu 22.04 LTS以降を前提にしていきます。
ディストリビューションのインストールが終わったら、端末を開いて初期ユーザー名とパスワードを登録し、Linuxのシェルが利用できる状態にしてください。
端末が使えるようになったら、aptを使って次のパッケージをインストールしておいてください。Pico C SDKを利用するために必要になります。
sudo apt update [Enter]
sudo apt upgrade [Enter]
sudo apt install libhidapi-dev gdb-multiarch libftdi1-dev libusb-1.0-0-dev usbutils autogen build-essential [Enter]
初出時にインストールすべきパッケージとしてautogenが抜けていました。autogenがないせいでプロジェクトのエラーが出ている場合は追加でインストールしてください。
WSL2はMicrosoftの仮想化技術Hyper-Vを用いて、WSL2専用の仮想マシン下でLinuxを動作させています。Hyper-V仮想マシンに、ホストOS側のUSBデバイスを割り当てるusbipd-winというツールがオープンソースで開発されています。
WSL2上のPico C SDKを利用してデバッグを行うには、WSL2環境下でCMSIS-DAPを利用しなければならないので、そのためにusbipd-winを利用します。公式サイトのReleaseページから最新バージョンのインストーラー(MSIパッケージ形式)ダウンロードしてください。MSIパッケージをダブルクリックしてWindowsにインストールします。
PCにCMSIS-DAP(PicoprobeかRaspberry Pi Debug Probe)を接続しておいてください。usbipd-winをインストール後、Power Shellまたはコマンドプロンプトを管理権限で開きます。まず、usbipd listを実行して現在のUSBデバイスのリストを得ます。
このようにCMSIS-DAP v2がリストに含まれているはずです。usbipdは、BUSIDかVID:PIDのいずれかでデバイスをHyper-V仮想マシン下に割り当てることができます。どちらでもいいですが、おすすめはVID:PIDです。VID:PIDで割り当てておくと、接続するUSBポートを変えてもusbipdの共有対象デバイスが維持されるからです。この例であれば2e8a:000cをコピーしておきます。
そのうえで、次のコマンドを実行しusbipdの共有対象デバイスに2e8a:000cを登録します。
> usbipd bind --hardware-id 2e8a:000c [Enter]
改めてリストを取ると、次のようにSTATEがSharedに変わっているはずです。
このようにSharedに設定したデバイスは、次のコマンドでWSL2仮想マシンに接続できます。
> usbipd attach --wsl --hardware-id 2e8a:000c [Enter]
usbipd: info: Device with hardware-id '2e8a:000c' found at busid '9-2'.
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Detected networking mode 'nat'.
usbipd: info: Using IP address 172.30.112.1 to reach the host.
この例のようにエラーなくattachできたなら、Linuxの端末側でlsusbコマンドを実行してみてください。
$ lsusb [Enter]
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 2e8a:000c Raspberry Pi Debugprobe on Pico (CMSIS-DAP)
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
このように仮想マシン下のLinux側に接続されているはずです。なお、仮想マシンに接続したUSBデバイスは、ホストOSであるWindows上では利用できなくなります。ホストOS側でCMSIS-DAPを利用したいときは、Power Shellまたはコマンドプロンプトで次のコマンドを実行しdetachします。
> usbipd detach --hardware-id 2e8a:000c [Enter]
同じようにunbindを実行すれば共有デバイスからも外せますが、今後もWSL2環境側でCMSIS-DAPを使うのであればunbindは必要ありません。いったんbindしたデバイスは、USBポートから取り外したり、Windowsを再起動しても共有デバイスリストに残り続けます。
ただし、attachの操作はWSL2起動後に毎回必要になります。少々面倒ですが、Pico C SDKを利用する前にPower Shellもしくはコマンドプロンプトを開いてコマンドを実行するだけでので、大した手間でもないでしょう。
以上のよううusbipd-winを利用すればWSL2仮想マシンにCMSIS-DAPを接続できますが、インストールしたディストリビューションによってはユーザー権限でCMSIS-DAPが利用できないかもしれません。Ubuntuのデスクトップ版などデスクトップ向けのディストリビューションをインストールした場合、通常はUSBデバイスのアクセス権がユーザーにあるのでユーザー権限でCMSIS-DAPを利用できます。しかし、Ubuntuの最小構成をインストールしたり、あるいは他のディストリビューションの初期設定では必ずしもユーザー権限でCMSIS-DAPが利用できるとは限りません。
CMSIS-DAPがlsusbコマンドで見えているのにデバッグできない場合、通常はUSBデバイスにアクセスするために必要な権限がユーザーにないことが原因なので対処が必要です。まず、グループplugdevに自分自身を追加してください。次のコマンドをLinuxの端末上で実行します。yournameはLinux上のアカウント名にします。
sudo usermod -aG plugdev yourname [Enter]
次にudevの設定ファイルを作成します。nanoエディタをroot権限で起動して/etc/udev/rules.d/99-cmsis-dap.rulesを新規作成しましょう。
sudo nano /etc/udev/rules.d/99-cmsis-dap.rules [Enter]
設定ファイルの内容は次のとおりです。なお、ATTRS{idVendor}の右辺は先に確認したCMSIS-DAPのVendorID、ATTRS{idProduct}の右辺は同ProductIDです。自分で確認したIDにそれぞれを変更してください。
SUBSYSTEM=="usb", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000c", MODE="0660", GROUP="plugdev"
この1行をnanoエディタで入力したら、[Ctrl+X]を押して保存、エディタを終了させます。
設定を反映させるために、WSL2を再起動させます。Linux端末やWSL2に接続しているVSCodeがあるなら、それらを閉じてから、Power Shellまたはコマンドプロンプトを開き、次のコマンドを実行してWSL2をいったんシャットダウンしてください。
> wsl --shutdown [Enter]
以上の作業で、CMSIS-DAPによるデバッグができるようになるはずです。
Windows上でVSCodeを起動し、拡張機能「WSL」を検索してインストールしてください。提供元がMicrosoftになっていることを必ず確認します。
インストール後、VSCodeウィンドウ左下にあるリモート接続アイコンをクリックします。接続先を聞いてくるので、「WSLへの接続」を選択します。
初回接続時にはWSL2のLinux側でVSCodeサーバーの設定が行われるので少し時間がかかりますが、しばらくするとWS2に接続した状態に切り替わります。左下のアイコンがWSL:ディストリビューション名に切り替わるので、それを確認してください。
正常にWSL2に接続できたら、拡張機能アイコンをクリックしてPico拡張を検索します。次のようにWSL:ディストリビューション名にインストールというインストールボタンが表示されるはずなので、クリックしてWSL側にPico拡張をインストールしましょう。
あとは、Windows側にインストールした場合とほとんど同じようにPico C SDKによる開発が行えます。注意すべきなのは、次の点です。
/dev/ttyACM0を利用する