Pico三昧(28) ラズパイPico2:RP2350、OTP、ワンタイムプログラミング記憶

Joseph Halfmoon

ラズパイPico2搭載のRP2350のスペックをPicoのRP2040と比較してます。前回RP2350の「デュアルコアがまたデュアル」な制御でOTPというものが登場しました。ワンタイム・プログラミング・ストレージ。これはRP2040には存在せず、RP2350で登場したものです。今回はOTPについてざっと調べてみます。

※Pico関係投稿一覧は こちら 『Pico三昧』は一覧の末尾付近にひっそりと。

※Raspberry Pi Pico、Raspberry Pi Pico2のデータシートは、以下からダウンロードできます。

Pico-series Microcontrollers

OTP

マイコンに精通された姉貴兄貴にはお馴染みと思いますが、世の中にはOTPとかOTP-ROMなどと呼ばれるメモリを搭載したマイコンが存在します。OTP=One Time Programming の略です。1度しか書き込むことができないメモリです。そんなものを何に使うかと言えば、おおよそ以下の2つのどちらかか、両方の目的です。

    1. ぶっちゃけお値段が OTP<Flash なので、開発時はFlash搭載品を使い、量産時にはOTP品を使う。お求めやすいのが一番。
    2. 個別チップのバラツキなどを反映する「微妙な調整用」の値やら、各種の初期設定値などを記憶しておくのに使う。一度決めたら二度と変更しないのでOTPで良い。

Pico2、RP2350での使用目的は第2の方だと思われます。そのため「額面の」容量的にはごく小さく8Kバイトとな。

なお、搭載しているOTPは、業界では泣く子も黙る?論理合成ツールの御本家、Synopsys社のIPであるようです。日本語ページが以下に。

DesignWare不揮発性メモリーIP

通常のCMOSプロセスで製造可能なハードコアなIPのようです(GDS-IIレイアウトでの供給らしいデス。)まあ「通常」といっても高電圧を生成する回路を使い、書き込み電圧でanti-fuseを「接続」してプログラムするメモリであるので、実績のないプロセス上に頂戴といってもすぐにはくれない気がしますが、結構多数のファウンドリに対応し、実績もバリバリのIPみたいです。

RP2350上のOTP

さきほど8Kバイトと述べましたが、実際の物理構成は

4096 x 24bit

です。24ビットのうち、16ビットがプログラムから利用可能な容量で、残り8ビットはECC6ビットとBRP2ビットです。ECCを使って読み出しをベリファイすることができ、フェイルした場合、検出することが可能です。また、BRPはBit repair by polarityという機構です。これはなかなか面白い仕組みなので詳しいことはデータシートをご参照くださいまし。

なお、物理的なビットは、初期状態0、プログラムすると1、再プログラムは不可ということになってます。

さて論理的な構成は

64ページ x 1ページあたり64行 x 16ビット

となってます。これで8Kバイトです。一部のページには役割が決まっており、工場出荷時の値が書き込まれている部分もあるみたいです。

    • ページ0、チップインフォ
    • ページ1、Boot config
    • ページ2、Boot config
    • ページ61、ハードウエアアクセスキー
    • ページ62、lockワード領域
    • ページ63、lockワード領域

ユーザプログラムで使用可能な部分はページ3からページ60までになるかと思います。書き込みは、SBPIブリッジという専用経路経由でのみ可能であり、そのためには、otp_access APIというものを使って行わねばならないようです。

なおページLOCK機構というものがあり、書き込みはおろか読み出しについても制限をかけることが可能です。そしてOTP機構のセキュリティを守るため、PSM(Power-up State Machine)というものがOTPブロック内に存在します。これが門番ね。PSMは専用のリング・オシレータ(システム側のROSCとは異なる)で動作し、PSMが初期化などの動作をしてセットアップした後はそのオシレータは停止してしまいます。PSMを目覚めさせるにはリセット必須。このときプロセッサ側へもリセットかかり一旦停止。PSMがプロセッサ側のリセットを解除しない限りソフトは動作できませぬ。PSMの動作期間中にページLOCKの値などはPSMがせっせと設定してくれるみたいです。RESET解除されたときには設定は終わっているので、何か悪いソフトが仕込まれていても手も足もでませぬ。

OTPブロックのメモリマップ的には以下みたいです。

    1. 0x40120000 OTP_BASEアドレス、 ここからOTP コントロール・レジスタ群がならんでいる。
    2. 0x40130000 OTP_DATA_BASE、32ビットリードでECC訂正済のの隣接データ16ビットx2個を読み出し。パーミッションフェイルの場合はオール1が読める。
    3. 0x40134000 OTP_DATA_RAW、 32ビットリードで24ビット幅のRAWデータが読める。上位8ビットは0。ただし、パーミッションフェイルでオール1が読める。
    4. 0x40138000 OTP_DATA_GUARDED_BASE、パーミッションがOKならばOTP_DATA_BASEと同じデータが読めるが、フェイルやECCエラーの場合は、バスフォルトを起こす。
    5. 0x4013C000 OTP_DATA_GUARDED_RAW、OTP_DATA_RAWと同じデータが読めるが、フェイルやECCエラーの場合は、バスフォルトを起こす。

前回みたArmかRISC-Vかどちらを走らせるかの制御ビットはOTPコントロール・レジスタ内に存在します。PSMが選択された側のコアのRESETのみ解除し、選択されなかった側のコアはRESET状態のままということみたいです。このビットが参照されるのは当然RESETされたときだけなので、CPUの遷移はPSMによる制御をくぐり抜ける必要があります。

またOTPの各エントリは、セキュアなブートなどではGUARDEDの側で読み出しているみたいです。万が一OTP改ざんなどされているとバスエラーで落ちることになるのかも知れません。

RP2350は、Arm Cortex-M33を搭載し、M33の売りがモダンなセキュリティ対応なので流石。でも何やら複雑でメンドイよ~。

Pico三昧(27) ラズパイPico2:RP2350、Pico:RP2040との仕様比較3 へ戻る

Pico三昧(29) ラズパイPico2:RP2350、Boot ROMとBoot RAM へ進む