LittleFS 用のイメージを作って Raspberry Pi Pico に書き込む
はじめに
自分の作っているレトロPCエミュレータは部品数削減のため、フラッシュの空き容量にファイルシステムを作って、そこにファイルを置くようになっています。 既存のテープのイメージをどのようにして書き込んだらよいのかわからないという話をよく聞くので簡単に手順をまとめてみました。
イメージファイルの作成
LittleFS のイメージの作成には、 mklittlefs や Python の littlefs-toolsが使えます。
LittleFS のパラメータとして、ブロックサイズとブロックカウントがあります。 ブロックサイズは書き込みのサイズで、一般てきなディスクでいうところのクラスタサイズになります。ここではデフォルトの 4096 を使っています。 ブロックカウントは、ファイルシステム全体の容量を示しています。 自分のエミュレータではデフォルトで 1.5MiB を使用しますので、ブロックカウントは 1.5MiB/4KiB = 384 となります。
./data
以下にファイルを置いた場合、以下のようにイメージを作成します。
$ mklittlefs -b 4096 -s 1572864 -c ./data output.img
または
$ littlefs_create -b 4096 -c 384 -s ./data -i output.img
(littlefs_create
は Windows 環境で実行するとファイル名の先頭に ¥
が付くという問題があります。)
できた output.img をフラッシュに書き込むことになります。
フラッシュの書き込み
フラッシュへの書き込みは picotoolまたは OpenOCD を使います。 OpenOCD は PicoSDK をインストールすると、一緒にインストールされますが、SWD で書き込むために別途書き込み機が必要です。 (もう一台 Pico があれば、picoprobeを使って、Pico 自体を書き込み機にすることもできます。)
picotool を使う場合は、load コマンドで作成したバイナリを書き込みます。 Pico を uf2 モードにした後で次のようにします。 Pico のフラッシュは 0x10000000 から 0x101fffff まであるので、この後半 1.5MiB に書き込みます。
$ picotool load -v -x output.img -t bin -o 0x10080000
OpenOCD を使う場合には、別途書き込み機を接続した後、次のようにして OpenOCD を起動します。 (Pico の場合)
$ openocd -f interface/cmsis-dap.cfg -f target/rp2040 -c "adapter speed 4000" -c "bindto 0.0.0.0"
この状態で、Teraterm などのターミナルソフトで、localhost:3333 に telnet 接続します。 接続したら、以下のように入力します。
> halt
> flash erase_address 0x10080000 0x180000
> flash write_bank 0 output.img 0x80000
その他の方法
PicoSDK で LittleFS に書き込むだけのプログラムを作るのも手です。 この場合は uf2 のファイルになりますので、書き込む際にツールが不要になります。