ラズパイPico/Pico2の用語は、昔ながらのマイコン屋からすると異なっており、その「文化的な背景の違い」を感じることがあります。今回眺めてみるSIOもそんな用語の一つです。SIOといったら、昔のマイコン的にはSerial I/Oですが、ラズパイPico/Pico2ではSingle cycle I/Oです。
※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。
※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。
ラズパイPico/Pico2のSIO
プロセッサコアを2つ頭にいただくラズパイPico/Pico2において、SIOは特殊な位置を占めるIO回路群です。SIOは2個のコア(Core0とCore1、Picoでは両方Arm Cortex-M0+、Pico2ではArm Cortex-M33かRISC-Vかは設定次第)の間にあって、両方のコアから、
-
- low-latency
- deterministic access
でアクセスできる回路になってます。いくら高速のバスでも、バスの下に繋がっている周辺回路では、バスマスタが競合しバスの交通渋滞が起こると deterministic なアクセスは望めませんが、SIOはそのような「交通渋滞」を起こさない回路となっているようです。
SIOといっても内部に異なる機能の回路が複数含まれており、その一覧を掲げると以下のようになるかと。
Freature | RP2040 | RP2350 |
---|---|---|
Security | none | Secure/Non-secure |
Address | 0xD0000000-0xDFFFFFFF | |
Address(Secure) | 0xD0000000-0xD001FFFF | |
Address(Non-secure) | 0xD0020000-0xD002FFFF | |
CPUID | Yes | Yes |
FIFO | 8*32bit | 4*32bit(S/NS) |
HW Spinlock | 32 | 32(S/NS) |
Doorbells | No | 8*2(S/NS) |
Int. Divider | Yes | No |
RISC-V Platform Timer | No | Yes |
TMDS | No | Yes |
Interpolator | 2 | 2 |
GPIO | 36 | 48+8 |
PicoとPico2での目立つ差異は、Pico2では Secureアクセス用とNon-secureアクセス用でSIOも「2重化」されていることです。Pico2は一部のハードウエアについて同等の回路をSecure用とNon-secure用に2つもってます。同じハードウエアをSecureとNon-secureで「シェア」している部分のありですが。
CPUID
CPUIDレジスタは「私はどっちのコア」かを確認するためのもので、コア0なのかコア1なのかを判断するものです。これは同等かね。
FIFO
FIFOはメールボックスという言い方もされてますが、コア0からコア1、コア1からコア0の2本の一方通行のFIFOが存在してます。FIFOの段数の範囲でですが、相手のコアのタイミングなど考慮することなく、メール(32ビット幅の情報)を勝手に送り付けることができます。相手が定期的にメールを読んでくれていれば通信は成立するっと。この部分はPicoのFIFO段数8段に対して、Pico2は4段とPicoの方が勝ってます。しかし、Pico2の方はセキュアとノンセキュアで2重化しているので、合計の段数は16段で変わりませぬ。なんとなく同じハードウエア量で済ませた感じがしないでもない。知らんけど。
ハードウエアスピンロック
コア間での「待ち合わせ(同期)」をするためのスピンロック装置です。マルチコア向けの命令を持っていないPicoのArm Cortex-M0+ではこういうハードウエア支援が必要であったものみたいですが、RP2350のコア共はArmにせよ、RISC-Vにせよatomic/exclusiveなアクセス命令をサポートしてます。「RP2350のHW spinlockはRP2040との互換性維持のため」らしいです。
Doorbells
コアから他方のコアへの「ピンポン」です。RP2350で新設された機能だと思います。各方向8個づつ、合計16個あります。ピンポン押すと他方のコアに割り込みかけられるので、メールボックスに何か書き込んでおいてピンポン押せば強制的に読んでいただくことも可能かと。メールボックスを使わずとも、何番のピンポンが押されたかだけで判断することも可でしょう。
整数割り算器
RP2040のArm Cortex-M0+コアは、割り算命令無だった筈なのでハードウエアのアシストあり。一方、RP2350のコア共はArmにせよ、RISC-Vにせよ割り算命令持っているので不要ということでRP2350では撤去されとります。
RISC-V Platform Timer
RP2040には不在、RP2350で利用可能な64ビットタイマです。RISC-Vとあるのは、RISC-Vシステムでは「ある前提」のタイマであるためです。Armコアを選択していてもこのタイマは使えるみたい。ハードウエアは1本しかないので、コア0もコア1も、セキュアもノンセキュアもなく同じ時間を使って動作できることになっとるようです。
TMDS
これまたRP2040には不在、RP2350で利用可能なHWです。
TMDS=Transition Minimized Differential Signaling
ぶっちゃけ、DVI、HDMIなど、ビデオ信号を高速の差動信号で送るインタフェースで使われる「8b/10b エンコーディング」です。Google様の以下のところにスペックを簡潔にまとめた文書があるようです。
コア0,コア1それぞれに1個づつ存在します。セキュア、ノンセキュアの2重化はありませぬ。
GPIO
プロセッサコアから、GPIOピン群を deterministic なタイミングで上げ下げするためにSIOからGPIOの制御が可能になってます。RP2040よりもRP2350の端子数が多かったりする(RP2350Bという品種もあり)ので制御できる端子はRP2350の方が多くなってます。
ここについては、コア0とコア1が同時に矛盾する操作をしたらどうよ?という問いかけは当然あり。その場合、コア0の操作が勝ってコア1の操作は無視されるみたいです。泣く子とコア0には勝てぬ?ホントか?