alif — funktioner för Alif Ensemble SoC

Modulen alif exponerar portspecifik funktionalitet för Alif Ensemble SoC, inklusive ett blockenhetsomslag för det inbyggda OSPI-flashminnet och en hjälpfunktion för att dumpa SoC-information från tjänsterna i Secure Enclave.

Exempel:

import alif

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

Funktioner

alif.info() None

Dumpar enhetsinformation som samlats in från Alifs Secure Enclave-tjänster (SE-tjänster) till seriell terminal.

Klasser

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

Skapar ett blockenhetsobjekt som backas av det inbyggda OSPI-flashminnet. Den här klassen är endast tillgänglig när den fasta programvaran byggs med OSPI-stöd aktiverat.

Vid anrop utan argument returneras standardsingletonobjektet som täcker den skrivbara filsystemsregionen i flashminnet.

start är byteoffset in i flashminnets lagringsregion. Det måste vara en multipel av flashminnets blockstorlek och ligga inom flashminnets lagringsintervall. Standardvärdet är -1 vilket innebär start vid offset 0.

len är längden i byte för den flashregion som exponeras av objektet. Det måste vara en multipel av flashminnets blockstorlek och får inte sträcka sig förbi slutet på flashminnets lagringsregion. Standardvärdet är -1 vilket innebär att alla återstående byte från start används.

Objektet implementerar även buffertprotokollet, vilket möjliggör skrivskyddad minnesmappad åtkomst till flashregionen via OSPI XIP-basen. Detta gör en kopieringsfri vy över hela regionen tillgänglig utan att några flashläsningar utförs:

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

Läser byte från flashminnet till buf. Två överlagringar exponerar det enkla och det utökade gränssnittet:

Enkel form (readblocks(block_num, buf)): läser hela block med början vid blockindex block_num. len(buf) måste vara en multipel av flashminnets blockstorlek.

Utökad form (readblocks(block_num, buf, offset)): läser len(buf) byte – inte nödvändigtvis ett helt antal block – med början vid byte offset inom block block_num. len(buf) har inget justeringskrav.

Returnerar 0 vid lyckat resultat eller en negativ felkod. Observera att MicroPythons standardprotokoll för blockenheter returnerar None; drivrutinen alif exponerar avsiktligt den underliggande OSPI-statuskoden så att anropare som kringgår vfs kan reagera på hårdvarufel.

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

Skriver byte från buf till flashminnet. Två överlagringar exponerar det enkla och det utökade gränssnittet:

Enkel form (writeblocks(block_num, buf)): skriver hela block med början vid blockindex block_num. len(buf) måste vara en multipel av flashminnets blockstorlek. Varje berört block raderas automatiskt innan det skrivs.

Utökad form (writeblocks(block_num, buf, offset)): skriver len(buf) byte – inte nödvändigtvis ett helt antal block – med början vid byte offset inom block block_num. len(buf) har inget justeringskrav, och ingen implicit radering utförs – anroparen måste säkerställa att de berörda blocken har raderats via ett tidigare anrop till ioctl(6, block_num).

Returnerar 0 vid lyckat resultat eller en negativ felkod (se readblocks() för motivet).

ioctl(cmd: int, arg: int) int

Utför en kontrolloperation för blockenheten. cmd är ett av MicroPythons standardkommandon MP_BLOCKDEV_IOCTL_*:

  • 1 (init) — returnerar 0.

  • 2 (deinit) — returnerar 0.

  • 3 (sync) — returnerar 0.

  • 4 (blockantal) — returnerar antalet block i regionen.

  • 5 (blockstorlek) — returnerar flashminnets blockstorlek i byte.

  • 6 (blockradering) — raderar blocket vid index arg och returnerar resultatet av raderingsoperationen.

Andra värden på cmd returnerar None.

Konstanter

alif.usb_msc: bool

Finns och är satt till True endast när den fasta programvaran byggs med stöd för USB Mass Storage Class aktiverat. I annat fall saknas attributet.