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 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)): читає 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. В іншому випадку атрибут відсутній.