alif --- Alif Ensemble SoC 函数

alif 模块为 Alif Ensemble SoC 提供了特定于端口的功能,包括针对板载 OSPI 闪存的块设备封装,以及从 Secure Enclave 服务转储 SoC 信息的辅助工具。

示例:

import alif

alif.info()
flash = alif.Flash()

函数

alif.info() None

将从 Alif Secure Enclave 服务(SE services)收集到的设备信息转储到串行终端。

class alif.Flash(*, start: int = -1, len: int = -1)

创建一个由板载 OSPI 闪存支持的块设备对象。此类仅在固件构建时启用了 OSPI 支持的情况下可用。

在不带参数调用时,返回覆盖闪存可写文件系统区域的默认单例对象。

start 是进入闪存存储区域的字节偏移量。它必须是闪存块大小的整数倍,且位于闪存存储范围之内。默认为 -1,表示从偏移量 0 处开始。

len 是该对象所暴露的闪存区域的字节长度。它必须是闪存块大小的整数倍,且不得超出闪存存储区域的末尾。默认为 -1,表示使用从 start 开始的所有剩余字节。

该对象还实现了缓冲区协议,允许通过 OSPI XIP 基址对闪存区域进行只读的内存映射访问。这使得无需发出任何闪存读取操作即可获得整个区域的零拷贝视图:

flash = alif.Flash()
view = memoryview(flash)
magic = bytes(view[:4])      # read the first 4 bytes directly from XIP
readblocks(block_num: int, buf: bytearray) int
readblocks(block_num: int, buf: bytearray, offset: int) int

将闪存中的字节读取到 buf 中。两个重载分别暴露了简单接口和扩展接口:

简单形式readblocks(block_num, buf)):从块索引 block_num 开始读取整块。len(buf) 必须是闪存块大小的整数倍。

扩展形式readblocks(block_num, buf, offset)):从块 block_num 内的字节 offset 处开始读取 len(buf) 个字节——不必是整数个块。len(buf) 没有对齐约束。

成功时返回 0,否则返回负的错误码。请注意,标准的 MicroPython 块设备协议返回 None;而 alif 驱动有意暴露底层的 OSPI 状态码,以便绕过 vfs 的调用者能够对硬件错误做出响应。

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

buf 中的字节写入闪存。两个重载分别暴露了简单接口和扩展接口:

简单形式writeblocks(block_num, buf)):从块索引 block_num 开始写入整块。len(buf) 必须是闪存块大小的整数倍。每个受影响的块在写入前都会被自动擦除。

扩展形式writeblocks(block_num, buf, offset)):从块 block_num 内的字节 offset 处开始写入 len(buf) 个字节——不必是整数个块。len(buf) 没有对齐约束,且不会执行隐式擦除——调用者必须确保受影响的块已通过先前的 ioctl(6, block_num) 调用被擦除。

成功时返回 0,否则返回负的错误码(原因参见 readblocks())。

ioctl(cmd: int, arg: int) int

执行块设备控制操作。cmd 是标准 MicroPython MP_BLOCKDEV_IOCTL_* 命令之一:

  • 1(init)——返回 0

  • 2(deinit)——返回 0

  • 3(sync)——返回 0

  • 4(块计数)——返回区域内的块数量。

  • 5(块大小)——以字节为单位返回闪存块大小。

  • 6(块擦除)——擦除索引 arg 处的块,并返回擦除操作的结果。

其他 cmd 值返回 None

常量

alif.usb_msc: bool

仅当固件构建时启用了 USB 大容量存储类支持时存在并设置为 True。否则该属性不存在。