前回のOTPはPico2で追加されたメモリでした。一部はユーザ使用も可能かと。一方、今回眺めてみるROM(ブートROM)はPicoの中の人がプログラムしたマスクROMみたいです。ユーザが書き変えることは出来ません。しかしその機能に毎度お世話になっておる、と。そしてPico2では専用RAMが追加されているみたい。
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
ブートROM
ラズパイPico、RP2040の時代からブートROMと呼ばれるROMが0x00000000番地に鎮座しておるようです。RP2040の場合、そのサイズ16kバイト。そこに格納されているプログラムやデータをかいつまむと以下のような機能を行うためのもののようです。
-
- システムのセットアップ
- Flashに書き込まれているユーザプログラムのブート
- Flashのプログラミング
- USBマスストレージデバイスとしての動作制御
- 浮動小数計算ライブラリなどの各種ルーチン
たとえば、Bootボタンを押しながらUSBを接続するとホストPC上にUSBマスストレージデバイスとしてPicoが見えるのも、そこにUF2形式のオブジェクトを書き込むとPicoのFlashに書き込まれるのも、そしてCore 0でユーザプログラムが走るのも、またCore 1にユーザプログラムを割り当て “Launch” するのも、このROMに格納されているプログラムの仕業であるようです。意識しようがしまいが「いつもお世話になっている」ありがたい部分です。
とはいえこの部分は工場製造時に「プログラミング」されるので書き替え不可です。書き替えて何かできるという部分があるわけじゃないので、ちらっと眺める程度で流したいと思います。
RP2350にはBoot ROMだけでなくBoot RAMあり
さてラズパイPico2搭載のRP2350は、RP2040の延長上にあり、やはり0x00000000番地にBoot ROMが存在します。しかしそのサイズは倍増。
32kバイト
あります。はたしている機能的にはPicoの時の延長上にあるみたいです。しかし倍増するのは
-
- RP2350はモダンで「セキュアな」デバイスなのでその対応
- RP2350はArmとRISC-Vの「デュアル・アーキテクチャ」なのでその対応
みたいです。BootROMのソースはRP2040もRP2350もGitHub上で公開されています。RP2350用のソースを拝見すると Arm用のアセンブリコードとRISC-V用のアセンブリコードが併存しているスタイルです(ホルダ分かれているのでこんがらがることはないけど。)単純に倍ではないけれども、増えるわな。
ちなみにArmとRISC-Vのコア・アーキテクチャ切り替えはハード的には前回やったOTPの制御レジスタ使って行われるのですが、ソフト的にはUF2オブジェクトのどこぞにあるスイッチをROM内のルーチンが識別してその操作を行ってくれるみたいです。
さて、RP2350にあってRP2040にないブロックが Boot RAMと呼ばれる小さなSRAMブロックです。サイズは以下です。
1kB(256 x 32bit)
鎮座するのは、0x400e0000番地からのようです。ここのRAMはメインのSRAMとは異なり周辺装置接続用のAPB接続のようです。よって、READに3サイクル、WRITEに4サイクルかかる遅いRAMです。また、フェッチには反応しないので、ここにコードを配置して実行するようなことはできないようです。
どうもこのSRAMは「セキュリティ」への配慮から設置されたメモリのようです。Armのセキュアアクセス、RISC-VのMachine-modeアクセスのみ可能。下々のコードは触ることすらできませぬ。また、アクセス権、特権もったプログラムを作製すればユーザが使うことは物理的には可能であるようですが、推奨はされていないようです。ROM内のAPI経由で使えと。そうしないとどんな恐ろしいことが起こっても知らんと。桑原桑原。