👨‍💻

W5500-EVB-PICO2やRaspberry pi pico2でFuzixを起動する話

2024/12/17に公開

はじめに

kazuedaは8ビットCPUやマイクロコントローラで動作するOSの動作実験を行いながら、コンピュータの仕組みやLinuxでのファイル操作法を勉強しています。
 主に、Fuzixとよばれる8ビットCPUやMCUで動作するUNIX風OSを、様々な環境で動作させてきました。

https://github.com/EtchedPixels/FUZIX

将来は、自分の手でFuzixの移植ができたらと妄想しています。
 Raspberry pi pico2の出現以降、RP2350上で動作するFuzixでEthernet接続の実験ができないかと妄想していました。
 2024年11月上旬、W5500ネットワークチップとPR2350CPUを搭載したボードの、W5500-EVB-PICO2がマルツオンラインで入手可能になっていましたが、最小提供数10個でしたので、個人では手の出しにくい状況でした。

https://wiznet.io/products/evaluation-boards/w5500-evb-pico2

そのような状況下で、ありがたいことに、Japanese Raspberry Pi Users Groupさんより、W5500-EVB-PICO2を提供頂いたので、RP2350上で動作するFuzixでEthernet接続を行いましたので報告いたします。

https://www.raspi.jp/

本稿では、x64用Ubuntu22.04上でFuzixのブートローダ、カーネルおよびルートファイルシステムをビルドしW5500-EVB-PICO2でのFuzixの動作確認までを報告します。FuzixはRaspberry pi pico2やW5500-EVB-PICO2だけでなく、PSRAMが4 MB搭載されているRP2350ボードでも動作可能かと思います。
 Ethernet実験に関する内容は、別ページで紹介します。
 なお、2024年12月上旬、マルツオンラインで1個から入手可能となっています。

RP2350へのFuzixの対応

veremenko-yさんにより、RP2350への対応が行われます。
Pull requestsの題は「pico: SD card speed improvement, rudimentary pico2 support, initial net support #1107」となっており、「pico2 support」の記載があります。

https://github.com/EtchedPixels/FUZIX/pull/1107

EtchedPixelsさんとのやり取りを見ると、uf2convがtoolから無くなっており、ボードへの書き込みはpicotoolを使うようです。
 Mekfileを見てみると、「SUBTARGET」の指定で、「pico」、「pico_w」と 「pico2」のブートローダとカーネルを含むfuzix.uf2を作り分けているようです。
 https://github.com/EtchedPixels/FUZIX/blob/master/Kernel/platform/platform-rpipico/Makefile

pico2用にFuzixをビルド

必要なコマンドが用意されていないかもしれませんので、以下のインストールを行っておきます。

sudo apt install cmake python3 build-essential gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib

作業は、「~/FUZIX/Kernel/platform/platform-rpipico」で行っています。
 2024年12月現在、pico2用のカーネルでは、フラッシュROM上のルートファイルシステムをマウントできません。したがって、SDカード上にルートファイルシステムを構築する必要があります。
 ビルド前に、「Applications/netd/echoping.c」をv.0.4のものに変更します。あるいは、「Applications/netd/Makefile.armm0」の

SRCS += echoping.c dig.c gethostbyname.c httpd.c coconic.c ping.c ntpdate.c

SRCS += dig.c gethostbyname.c httpd.c coconic.c ping.c ntpdate.c

のように、「echoping.c」をコンパイルしないようにします。「echoping.c」内で使用する関数が用意されていないため、ビルド時のエラーを避けるためです。
 次にRaspberry pi pico2用のビルドを行います。32MBのSDカードイメージが必要なので、「~/FUZIX」でmakeコマンドを使います。

$ make TARGET=rpipico SUBTARGET=pico2

「~/Fuzix/Kernel/platform/platform-rpipico/build」ディレクトリに、ブートローダとカーネルを含む「fuzix.uf2」が生成します。
 続いて、SDカード用のルートファイルシステムのイメージファイル、filesys.imgを作成します。

$ make TARGET=rpipico SUBTARGET=pico2 diskimage

「~/FUZIX/Images/rpipico」ディレクトリに、サイズ8 MBの「filesys8.img」とサイズ32 MBの「filesys.img」が生成します。

SDカードへのfilesys.imgの書き込み

SDカードへのfilesys.imgの書き込みは、これまでに紹介されている、先頭2MBにswapパーティション、2番目のパーティションにルートファイルシステムを保存します。
 以下のサイトの方法に従ってい、SDカードを用意します。

https://www.raspberrypi.com/news/how-to-get-started-with-fuzix-on-raspberry-pi-pico/

組み立て

RP2350ボードに「fuzix.uf2」を書き込みます。書き込みが問題なくできているかを確認するために、USBケーブルでLinuxマシンにボードを接続してボードを再起動します。
 LinuxボックスのUSBポートとRP2350ボードをUSBケーブルで接続します。
 RP2350ボードの接続されているシリアルポートを確認します。

$ ls -l /dev/serial/by-id/

「ttyACM0」、「ttyACM1」、「ttyACM2」、「ttyACM3」の4ポートあることがわかります。ttyACM0に接続するために、権限を変更します。

$ sudo chmod 666 /dev/ttyACM0

シリアル通信をするコマンドとして、ここでは、「cu」を使っています。「cu」を終了するときは、「~.」と入力します。

cu -s 115200 -l /dev/ttyACM0

起動ログの一部が表示されます。

 bootdevが表示されたら、ブートローダとカーネルを含む「fuzix.uf2」は正しく書き込まれていることがわかります。
 次にSDカードとRP2350ボードとの接続です。接続方法は「~/Fuzix/Kernel/platform/platform-rpipico/config.h」で指定します。デフォルトは、「#define CONFIG_RC2040」なので、REDME.md記載と同様、以下のように接続します。

Pico pin RP2040 pin SD card pin
16 12 MISO
17 13 CS
19 14 SCK
20 15 MOSI

Fuzixの起動

LinuxボックスのUSBポートとRP2350ボードをUSBケーブルで接続します。
 起動ログの一部が表示されます。

「SD drive 0:」に「hdb: hdb1 hdb2」と表示されたら、SDカードが認識されていることを意味します。
 「bootdev:」にルートファイルシステムの存在するパーティションの「hdb2」を入力します。何故か、この操作を2回行います。

「Enter new data:」に現在の日付、「Enter new time:」に現在の時刻を入力します。この表示では、入力を省略しています。
 「login:」プロンプトが表示されたら、「root」と入力します。「#」プロンプトが表示されたら、Fuzix用のコマンドを利用可能となります。

 ここでは、「banner」コマンドを使用しています。

まとめ

Raspberry pi pico用のFuzixのレポジトリに、veremenko-yさんが作成したRP2350CPU対応レポジトリがマージされたことにより、これまでのRP2040CPUのみの時と比べて、ビルド方法やその後のアクセス方法が大きく変わりました。
 README.mdに情報があるのですが、初見ではよくわからず、動作後にもう一度読むことで説明の意味が分かるような印象でした。
 動作前に、config.hのコメント文を手掛かりに動作環境を確認すると、時間の節約が出来たようです。
 また、コントリビューターが変わったため、起動時の環境が変更されており、RP2040搭載ボード用の設定では、上手くいかないところがあります。
 私が確認した範囲では、以下の部分がこれまでの環境とは異なっているようです。
・フラッシュROMに保存したルートファイルシステムを利用することができない
・USBシリアル変換ボードでアクセスすることができない
・USBポートは4個のUSB-CDC(ACM)が存在する。
 これらの設定は、「~/Fuzix/Kernel/platform/platform-rpipico/config.h」で変更可能です。
 さらに、Fuzixのriscv32へのポートが存在しますので、pico2のRisc-vCPUへの対応が実現する日が来るのが、個人的には楽しみです。
 最後になりましたが、W5500-EVB-PICO2での動作確認の機会を与えてくださった、Japanese Raspberry Pi Users Groupの関係者の皆様に感謝いたします。

Discussion