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 サービス) から収集したデバイス情報をシリアルターミナルにダンプします。

クラス

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 にバイトを読み込みます。2 つのオーバーロードがシンプルなインターフェースと拡張インターフェースを公開します:

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

拡張形式 (readblocks(block_num, buf, offset)): ブロック block_num 内のバイト offset から開始して len(buf) バイト(必ずしもブロック全体の整数倍ではない)を読み込みます。len(buf) にアライメント制約はありません。

成功時には 0 を、失敗時には負のエラーコードを返します。標準の MicroPython ブロックデバイスプロトコルは None を返すことに注意してください。alif ドライバは、vfs をバイパスする呼び出し元がハードウェアエラーに反応できるよう、基盤となる OSPI ステータスコードを意図的に公開します。

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

buf からフラッシュにバイトを書き込みます。2 つのオーバーロードがシンプルなインターフェースと拡張インターフェースを公開します:

シンプル形式 (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 (block count) --- 領域内のブロック数を返します。

  • 5 (block size) --- フラッシュブロックサイズをバイト単位で返します。

  • 6 (block erase) --- インデックス arg のブロックを消去し、消去操作の結果を返します。

その他の cmd 値は None を返します。

定数

alif.usb_msc: bool

ファームウェアが USB Mass Storage Class サポートを有効にしてビルドされている場合にのみ存在し、True に設定されます。それ以外の場合、この属性は存在しません。