class Flash -- 内蔵フラッシュストレージへのアクセス

Flash クラスは、RP2040 の外部 QSPI フラッシュチップへの直接的なブロックレベルアクセスを提供します。このドライバは vfs.AbstractBlockDev インターフェースを実装しているため、カスタムファイルシステム構成のために vfs.mount() に渡すことができます。

ほとんどのスクリプトは / に自動マウントされたファイルシステムを通じてデータを永続化し、Flash を直接構築することはありません。以下の場合に手動で構築します:

  • カスタムパーティション上に既定ではないファイルシステムをマウントする(例: vfs.VfsFat でラップする)。

  • ファイルシステムが所有していないファームウェア領域や工場出荷データブロックを読み書きする。

  • ファイルシステム層をバイパスする独自のオンフラッシュストレージ形式を実装する。

コンストラクタ

class rp2.Flash Flash

RP2040 の QSPI フラッシュチップに支えられたシングルトンの Flash ブロックデバイスオブジェクトを返します。最初に公開されるブロックはファームウェア領域の直後のブロックであるため、呼び出し側にはチップのうちファイルシステムに利用可能な領域のみが見えます。

メソッド

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

フラッシュからバイトを読み取って buf に格納します。ファイルシステム層が使用する標準の vfs.AbstractBlockDev ブロックデバイスのエントリポイントです。

単純形式 (readblocks(block_num, buf)): ブロックインデックス block_num から始まるブロック全体を読み取ります。len(buf) はフラッシュブロックサイズの倍数でなければなりません。

拡張形式 (readblocks(block_num, buf, offset)): ブロック block_num 内のバイト offset から始まる len(buf) バイト(必ずしもブロック単位とは限りません)を読み取ります。littlefs やその他のバイトアドレス指定可能なファイルシステムで使用されます。

writeblocks(block_num: int, buf: bytes) None
writeblocks(block_num: int, buf: bytes, offset: int) None

buf のバイトをフラッシュに書き込みます。ファイルシステム層が使用する標準の vfs.AbstractBlockDev ブロックデバイスのエントリポイントです。

単純形式 (writeblocks(block_num, buf)): ブロックインデックス block_num から始まるブロック全体を書き込みます。len(buf) はフラッシュブロックサイズの倍数でなければなりません。影響を受ける各ブロックは、書き込み前に自動的に消去されます。

拡張形式 (writeblocks(block_num, buf, offset)): ブロック block_num 内のバイト offset から始まる len(buf) バイト(必ずしもブロック単位とは限りません)を書き込みます。暗黙的な消去は行われません -- 呼び出し側は、事前の ioctl(6, block_num) 呼び出しによって対象ブロックが消去済みであることを保証しなければなりません。

ioctl(cmd: int, arg: int) int | None

標準の vfs.AbstractBlockDev 制御エントリポイントです。マウント/アンマウント時、および同期のたびにファイルシステム層から呼び出されます。認識される cmd 値:

  • 1 -- 初期化。成功時に 0 を返します。

  • 2 -- 終了処理。成功時に 0 を返します。

  • 3 -- 保留中の書き込みを同期します。0 を返します。

  • 4 -- ファイルシステムから見えるフラッシュブロック数を返します。

  • 5 -- ブロックサイズをバイト単位で返します(通常はフラッシュセクタサイズの 4096)。

  • 6 -- インデックス arg のブロックを消去します。拡張形式の writeblocks を使用する前に必要です。

  • 7 -- デバイスがブロック消去コマンドをサポートしているかどうかを返します(RP2040 では 1)。

直接の呼び出し側は通常このメソッドを使用しません -- Flash がマウントされると、ファイルシステムドライバが標準コードを自動的にディスパッチします。