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 被挂载,文件系统驱动就会自动分发标准代码。