6.6.87キタワァ。
本日、wsl --update したら wsl.2.5.7.0が来てました。
やっと6.6になったね。
ちよすけのぶろぐ。なんか技術的なこと。
Nordic の Bluetooth Low Energy の開発キット PCA10056(nRF52840)を先日よりいじってるのですが、SDK がけっこういろいろあるようなので自分用に整理してみたメモ。
Windows Terminal、いいですねぇ。タブ式ターミナルで使いやすいです。PowerShell も ArchLinux もコマンドプロンプトも MSYS2 の zsh も、全部これで使ってます。
一方で、UNIX 系(昔は AT&T のコピーライトの関係で U*NX なんて書いてましたね、最近見ないですが)のホストに接続するときは ssh やら telnet やら、あるいはシリアルコンソールやらを使います。こちらは WezTerm とか TeraTerm とか WindTerm とか Alacaritty とかいろいろありますが、そこでメインの作業をするというほどでもないので、RLogin を使用しています。COM ポートでのシリアルコンソールも使えるし、xterm 256色も使えるし。
ただ一方、VSCode で開発とかやるなら、VSCode 内でできればうれしい。特にデバッグ時のステップ実行のときに、F10 とか F11 とかのファンクションキーを押しながらシリアルコンソールを起動したターミナルを前面に出す、とかすごく面倒。VSCode の中から使える シリアルコンソールがないかな、と思ったら、Market Place にありました。
Serial Monitor。このツールに Serial Monitor というのがあり、これが使えるようです。
また、VSCode 内でペリフェラルレジスタやメモリダンプを確認できる Embedded development with C++ | Create and debug embedded applications というのもあります。
このページの GET STARTED にある、Download and install the Embedded tooling で、ちょっとわかりづらいけれど、Visual Studio Code のタブがあります。
ただ、なんかまだいろいろこなれてないのか、コンパイルはできるのに #include でファイル名に波線がついて「ファイルが見つかりません」的なことを言ってみたり、関数やマクロが未定義とか言われたり、エクスプローラビューでファイル名がグレーになってたりします。そのへんがちゃんと動けば完璧なんだけどなぁ。Ubuntu WSL2 で Segger Embedded Studio を動かすことを諦めて、VSCodeでやることにしました。STM32 VS Code Extension。
あと、ピンアサインやペリフェラルの初期設定、HALドライバというかライブラリの自動ダウンロードと、初期化コードとmain()テンプレートの作成をしてくれる STM32CubeMX。
それに ARM のクロスコンパイルをしてくれる arm-none-eabi-gcc か clang。ArchLinux では arm-none-eabi-gcc パッケージですが、Ubuntu だと gcc-arm-none-eabi パッケージになっているみたいです。
今気づいたけど、Windows上でクロスコンパイルをするなら mingw-w64 の GCC を使うことになるだろうから、やっぱり Ubuntu WSL2 上でやったほうがいいんだろうか。Linux 用の VSCode もあるわけだし。そういえば Visual Studio は 2017 あたりから Clang をサポートしているはずだけれど、こちらでクロスコンパイルはできるんだろうか。一応、WSL 用のバイナリは生成できるらしいけれど、アーキテクチャが違うとどうなんだろう。生粋の Clang なら、--target <triple> オプションで arm-v8-unknown-none-eabi などと指定すればよさそうだけれど。…と思ったら、ARM GCC Cross Compilation in Visual Studioなんていう記事がありました。これは GCC だけれど、たぶん Clang でもできるんだろうな。
と、それはさておき。
bare metal です、bare metal。ちなみにベアメタルは加工前のむき出しの金属みたいな意味。OS の皮を被っていませんので。
STmicro のサイトに VSCode 拡張機能の特設ページがあります。上でもちょっと触れましたが、STM32CubeMX と、binutils 的な STM32CubeCLT、それに STM32 VS Code Extension で構成すればいいようです。Extension のページの prerequisites には、CubeCLT は必須、CubeMX はあったほうがいいよ、的な感じ。ST-MCU-FINDER は MCU を比較選択するのに便利くらいな感じでしょうか。自分的には CubeMX は最高だと思います。ピンとペリフェラル、クロック設定をちょいちょいと選択して設定していくだけで、プロジェクトのスタートポイントが作成できるのは、bare metal 開発ではかなり楽ちんです。
まずは CubeCLT からインストールします。
ダウンロードして zip を展開し、インストーラを実行すると ST-Link のドライバをインストールするか聞いてくるので、ここはインストールしておきましょう。あとで J-Link 化するにしても。
インストールが終わると、ドライブルートに ST ディレクトリが作られ、その下に CMake やら Ninja やら GNU-tools-for-STM32 やらがインストールされています。Clang が使いたければ自分でビルドしたほうがいいのかしら…と、また脱線しちゃだめ。
次に STM32 VS Code Extension ですが、すでにいくつか拡張を組み込んでいてコンフリクトなど起こしても面倒なので、拡張機能を一旦まっさらにします。
%USERPROFILE%/.vscode/extensions を extetensions.bak などの名前に変更します。そして VSCode を起動したら、マーケットプレイスから STM32 Extension をインストールします。
インストールが終わったら、CubeMX でプロジェクトの雛形を生成します。
中央の New Project の列で、ACCESS TO BOARD SELECTOR をクリックし、評価ボード名の NUCLEO-L476RG を検索します。
ピンコンフィグは、USART_TX/RX と B1 、LD2 をデフォルトのままで、PH0-OSC_INと PH0-OSC_OUT を Reset State にします。
せっかく RTC 用に 32.768kHz の水晶振動子が搭載されているので、RTC ペリフェラルをアクティベートします。
Import CMake projectを選択します。
main.c は空っぽのままですが一応コード生成はできるので、いきなりデバッガを起動してみます。
などと出力されていました。早速 ST-Link のアップデートのページでファームウェアをダウンロードしてアップデートします。ダウンロードした zip ファイルを展開すると、Windows フォルダに ST-LinkUpgrade.exe ファイルがあるので、これを実行します。
さてそれではデバッグしてみましょう。
F5 キーを押すとビルドしてデバッガが動き、main() の最初のステップで停止します。
おお、これで VS Code でデバッグできますね。
まだびみょ~に諦めてません。びみょ~だけど。
さて、世界中の人が気づいているかもしれませんが、WSL2 から Windows ホストの USB デバイスへのアクセスには制限があります。というか、一部を除いてできません。USB Audio やキーボードやマウスなどの USB HID デバイスは使えますが、それ以外の USB UART や 今回使おうとしているデバッガ/プログラマなどは使えません。Ubuntu から lsusb しても表示されません。
nRF52840 DK には同じ Nordic のチップ nRF5340 を使用した J-Link デバッガが載っていますので、ドライバをインストールする必要があります。…この時点で、WSL2 の上で全部やろうという計画は崩壊している気もしますが。
幸いというか、WSL の中の人がブログでやり方を示してくれています。Connecting USB devices to WSL。この記事は2021年11月のものなので、バージョンや機能など変わっているかもしれません。当時の usbipd-win のバージョンは 1.1.1 で、現在は 5.0.0 です。
大まかな流れは以下のような感じです。
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
usbipd detach --busid <busid>
usbipd wsl detach --busid <busid>
ところで usbipd-win には、bind/unbind というコマンドや、server というコマンドがあるようです。bind/unbind は持続的な接続を行う場合に使用するようです。また、usbip は、bind したデバイスに USB/IP を使用してネットワーク越しのアクセスもできるようです。
sudo usbip attach --remote=<HOST> --busid=<BUSID>
上記の3で J-Link が表示されていないのは、まだドライバをインストールしてないから、だと思います。ドライバのインストールはどうしようか迷い中。というのもドライバをインストールしたくないから、WSL2でサンドボックス作ってそこでやりたい、というのがそもそもなので。でも結局インストールしちゃうんだろうなぁ…。
Windows側に J-Link ドライバをインストールしたら、そもそもWSL環境でやる意味も少なくなってくるので、この記事も単なる実験記録になりそうです。
それはさておき。
なぜアクティベートできないのかという件ですが、もう少し突っ込んでみます。あまり突っ込んで回避方法とかやっちゃうとメーカーさんに目をつけられるのも怖いので程々に。
Segger のサイトに、ライセンスタイプに関する記述がありました。
MACアドレスで怒られるということは、今回のライセンスは PC-locked タイプだと思うのですが、試してみるには J-Link ドライバをインストールして、どうなるか見てみる必要があります。うーん、にわたま。でも、すでに usbipd-win はインストールしちゃいましたから、やってしまいましょう。
と、その前に、昨日 STM32 の評価ボード Nucleo-L476RG を買ってきましたので、それを繋いでみます。
ドライバが入っていないため⚠がついてますが、表示されます。なぜ J-Link はでないのでしょうか。もうこうなったら仕方ないのでドライバをインストールしてみます。ダウンロードページから使用条件許諾してダウンロードします。
ちなみに Segger のダウンロードページには、ST-Link を J-Link にするファームウェアがあります。ここを見ると、今回購入した Nucleo-L476RG は対象になっているようですね。SEGGER RTT Viewer とか結構ありがたいので、書き換えちゃおうかしら。
さて J-Link Software and Documentation Pack をインストールしてみます。
ここからは SES へ、となっていくわけですが、STmicro も Nordic も VSCode を利用した開発環境の構築ができるようです。
実はここだけの話、SES も Keil μVision も IDE が使いづらいんですよね。どちらかというと、重たいけれど Eclipse ベースの STM32CubeIDE のほうがこなれてるというか。特に μVision5 はシンボルの一括リネームができないとか、ソースのインデントを好みにするとか、いろいろと不満があります。それなら VSCode でやっちゃうのもありかな、という感じ。
MACアドレスの件ですが、WSL2ネットワークを新機能でブリッジモードに変更する(IPv6も利用可)[ただし暫定]という記事を見つけました。Windows 11 Pro 以上であることが必要なようですが、これでブリッジすればいいのかもしれません。が、そろそろ VSCode でいいかな、と思い始めてしまったので、とりあえず一旦はここまでとします。
その1でインストールまではできたものの、出てきたウィンドウがのっぺらぼうになってしまったので、その続きです。
エラーメッセージの最後のところに、"MESA: error: Failed to attach to x11 shm" とありまして、そういえば Qt で SHM(共有メモリ)関係のなにかがあったなぁ、と思ったところ、まさに Segger のナレッジベースにありました。
Using Embedded Studio remotely via X11 on a docker image not working
これは docker イメージで動作させるときのお話ですが、MIT-SHM X11 extensionがdisableされていることを確認してください、とのこと。環境変数 QT_X11_NO_MITSHM=1 を設定することでQtはこの拡張を使わなくなります、ということでやってみました。
ちゃんとできましたね。
ライセンスですが、Nordicのチップでの開発であれば、Nordic用のライセンスが利用できます。1年間無償です。たぶん1年経ったらまた登録し直せばいいのかな。
ライセンスの登録は左下にある Obtain a License をクリックします。
…と、なにも反応がありません。コンソールを見てみると、
おおぅ、ブラウザがないから困っているようです。
実はライセンスは別途Windows側で申請してもOKです。MACアドレス縛り(かつNordicチップ開発用)のライセンスなので、OKなんですが……。https://license.segger.com/Nordic.cgi に飛んで、必要事項を記入します。
MACアドレスを入力するようになっているけど、Ubuntuのほうで ip link (ifconfig はdeprecatedとなり、今は iproute2 の時代です)で表示されるものではなく、Windowsのほうで ipconfig /all で表示されたものを入力してみます。名前とメールアドレスを入れて申請。すぐにメールでアクティベーションキーが送られてきます。起動画面の Accept をクリックすると Segger Embedded Studio が起動しますので、Tools →License Manager で Activate Segger Embedded Studio をクリック。
届いたメールにある License_SES_... で始まる段落を丸ごとコピーして貼り付け、そのダイアログにある Install License のボタンをクリックすれば…だめですね。MACアドレスが違うと怒られました。Ubuntu側のMACアドレスで再申請して入れてみたんですが、アクティベートされないようです。うーん。なんかあるのかな。またまた座礁です。やっぱりWindows環境でやるしかないのだろうか。
ちなみにですが、nRF52840 DKの箱には、nordicsemi.com/start52840dkと印刷してあって、ここから始めましょうな感じです。早速アクセスしてみると、別のリンクにリダイレクトされて、"Download and install nRF Connect for Desktop" というステップが案内されます。これもWindows版とLinux版があるので、インストールしてみましょう。ツールのなかでもしかしたら一番使うのはProgrammerかもしれません。Software Deviceを焼いたり、Eraseしたりができます。FOTAとかDFUで失敗したらEraseしてやり直せるのはありがたいです。
余談ですが、Gimp を起動すると
という警告がたくさん出ます。これは pixmap エンジンがないということなので、
してやれば消えます。
本日の主題です。 ようやっとここまで来た感じですが。
まずはUSB デバイスを接続するに従って、WSL上のLinuxからUSBデバイスにアクセスするためのドライバを入れておきます。現在のバージョンは5.0.0のようです。
nRF82540 DKで遊ぶために、Segger Embedded Studioを利用させてもらいます。
まず、SEGGERのダウンロードページからLinux版をダウンロードして、Ubuntuからアクセスできる場所に置きます。Windowsのダウンロードフォルダは /mnt/c/Users/<username>/Downloadsとしてアクセスできるので、そのままでも大丈夫です。現在のバージョンは8.22aですね。
$ tar zxvf Setup_EmbeddedStudio_v822a_Linux_x86_64.tar.gz
INSTALL.txt と install_segger_embedded_studio というファイルができますので、まずはINSTALL.txtを読みます。
Run "./install_segger_embedded_studio" as root user and follow the installation instructions.
sudoで実行してね、ということですね。今回、Ubuntu はまだ RDP接続とかしてないのでこのあとでX関係のライブラリなどのインストールをする必要があるんですが、どっちを先にしようか。Xかな。 とりあえずお約束でxeyesを動かせるところまではやっておきますか。
まず、管理者モードでPowerShellを起動して、 wsl --update を実行しておきます。
いちおうまだカーネルは 5.15 でした。
次に apt で x11-utils をインストールします。
x11-appsも。
でもって、
などとすると、
すると、
emStudioというのがありますね。これがそうかな?
libusb-1.0.so.0がない、と言われました。ないのかな、と思って locate libusb したら、locate もないようです。
おっと、/mnt/c や /mnt/d なんかを検索対象外にしておかないとやばいことになります。設定は /etc/updatedb.conf を書いて、と。でも、なさそうです。ということでlibusbもインストール。
で、起動してみる。
どうもSESはQtライブラリを使ってるみたいですが、うーん。これはWindow Managerとか入れて、RDPで接続すべき?
ちなみに、このあとでNautilusとかGimpとかのGUIアプリをインストールしてみました。
Gimpはちゃんと動くようですが、Nautilusのほうは、
となりました。MESAとlibEGL関係でしょうか。ちょっと座礁しました。