alif — funkce Alif Ensemble SoC

Modul alif zpřístupňuje funkce specifické pro port Alif Ensemble SoC, včetně obalu blokového zařízení pro vestavěnou OSPI flash paměť a pomocné funkce pro výpis informací o SoC ze služeb Secure Enclave.

Příklad:

import alif

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

Funkce

alif.info() None

Vypíše informace o zařízení shromážděné ze služeb Alif Secure Enclave (SE services) na sériový terminál.

Třídy

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

Vytvoří objekt blokového zařízení podpořený vestavěnou OSPI flash pamětí. Tato třída je dostupná pouze tehdy, je-li firmware sestaven s povolenou podporou OSPI.

Při volání bez argumentů vrací výchozí singletonový objekt pokrývající zapisovatelnou oblast souborového systému ve flash paměti.

start je bajtový offset do úložné oblasti flash paměti. Musí být násobkem velikosti bloku flash paměti a v rámci rozsahu úložiště flash. Výchozí hodnota je -1, což znamená začátek na offsetu 0.

len je délka v bajtech oblasti flash paměti zpřístupněné objektem. Musí být násobkem velikosti bloku flash paměti a nesmí přesahovat za konec úložné oblasti flash. Výchozí hodnota je -1, což znamená použít všechny zbývající bajty od start.

Objekt rovněž implementuje protokol bufferu, což umožňuje paměťově mapovaný přístup pouze pro čtení k oblasti flash paměti přes OSPI XIP základní adresu. To zpřístupňuje pohled na celou oblast bez kopírování, aniž by se prováděly jakékoli čtecí operace flash paměti:

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

Načte bajty z flash paměti do buf. Dvě varianty zpřístupňují jednoduché a rozšířené rozhraní:

Jednoduchá forma (readblocks(block_num, buf)): čte celé bloky počínaje indexem bloku block_num. len(buf) musí být násobkem velikosti bloku flash paměti.

Rozšířená forma (readblocks(block_num, buf, offset)): čte len(buf) bajtů – ne nutně celý počet bloků – počínaje bajtem offset v rámci bloku block_num. len(buf) nemá žádné omezení zarovnání.

Vrací 0 při úspěchu nebo záporný chybový kód. Pamatujte, že standardní protokol blokového zařízení MicroPythonu vrací None; ovladač alif záměrně zpřístupňuje podkladový stavový kód OSPI, aby volající, kteří obcházejí vfs, mohli reagovat na hardwarové chyby.

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

Zapíše bajty z buf do flash paměti. Dvě varianty zpřístupňují jednoduché a rozšířené rozhraní:

Jednoduchá forma (writeblocks(block_num, buf)): zapisuje celé bloky počínaje indexem bloku block_num. len(buf) musí být násobkem velikosti bloku flash paměti. Každý dotčený blok je před zápisem automaticky vymazán.

Rozšířená forma (writeblocks(block_num, buf, offset)): zapisuje len(buf) bajtů – ne nutně celý počet bloků – počínaje bajtem offset v rámci bloku block_num. len(buf) nemá žádné omezení zarovnání a neprovádí se žádné implicitní vymazání – volající musí zajistit, že dotčené bloky byly vymazány předchozím voláním ioctl(6, block_num).

Vrací 0 při úspěchu nebo záporný chybový kód (zdůvodnění viz readblocks()).

ioctl(cmd: int, arg: int) int

Provádí řídicí operaci blokového zařízení. cmd je jeden ze standardních příkazů MicroPythonu MP_BLOCKDEV_IOCTL_*:

  • 1 (init) — vrací 0.

  • 2 (deinit) — vrací 0.

  • 3 (sync) — vrací 0.

  • 4 (počet bloků) — vrací počet bloků v oblasti.

  • 5 (velikost bloku) — vrací velikost bloku flash paměti v bajtech.

  • 6 (vymazání bloku) — vymaže blok na indexu arg a vrátí výsledek operace vymazání.

Ostatní hodnoty cmd vracejí None.

Konstanty

alif.usb_msc: bool

Přítomna a nastavena na True pouze tehdy, je-li firmware sestaven s povolenou podporou USB Mass Storage Class. Jinak atribut chybí.