alif — функции SoC Alif Ensemble

Модуль alif предоставляет специфичную для порта функциональность для SoC Alif Ensemble, включая обёртку блочного устройства для встроенной OSPI флеш-памяти и вспомогательную функцию для вывода информации о SoC из служб Secure Enclave.

Пример:

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.

Объект также реализует протокол буфера, обеспечивая доступ к области флеш-памяти только для чтения через отображение в память (memory-mapped) с использованием базового адреса OSPI XIP. Это делает доступным представление всей области без копирования (zero-copy) без выполнения каких-либо чтений флеш-памяти:

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)): читает len(buf) байтов — не обязательно целое число блоков — начиная с байтового offset внутри блока block_num. 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)): записывает len(buf) байтов — не обязательно целое число блоков — начиная с байтового offset внутри блока block_num. 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

Присутствует и установлен в True только тогда, когда прошивка собрана с включённой поддержкой USB Mass Storage Class. В противном случае атрибут отсутствует.