alif — funzioni del SoC Alif Ensemble¶
Il modulo alif espone funzionalità specifiche della porta per il SoC Alif Ensemble, incluso un wrapper block-device per la flash OSPI integrata e una funzione di supporto per esportare le informazioni del SoC dai servizi del Secure Enclave.
Esempio:
import alif
alif.info()
flash = alif.Flash()
Funzioni¶
Classi¶
- class alif.Flash(*, start: int = -1, len: int = -1)¶
Crea un oggetto block-device basato sulla flash OSPI integrata. Questa classe è disponibile solo quando il firmware viene compilato con il supporto OSPI abilitato.
Quando viene chiamato senza argomenti, restituisce l’oggetto singleton predefinito che copre la regione del filesystem scrivibile della flash.
startè l’offset in byte all’interno della regione di archiviazione flash. Deve essere un multiplo della dimensione del blocco flash e rientrare nell’intervallo di archiviazione flash. Il valore predefinito è-1che significa partire dall’offset0.lenè la lunghezza in byte della regione flash esposta dall’oggetto. Deve essere un multiplo della dimensione del blocco flash e non estendersi oltre la fine della regione di archiviazione flash. Il valore predefinito è-1che significa usare tutti i byte rimanenti a partire dastart.L’oggetto implementa anche il protocollo buffer, consentendo l’accesso in sola lettura mappato in memoria alla regione flash tramite la base XIP OSPI. Ciò rende disponibile una vista zero-copy dell’intera regione senza emettere alcuna lettura della flash:
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
Legge byte dalla flash in
buf. Due overload espongono le interfacce semplice ed estesa:Forma semplice (
readblocks(block_num, buf)): legge blocchi interi a partire dall’indice di bloccoblock_num.len(buf)deve essere un multiplo della dimensione del blocco flash.Forma estesa (
readblocks(block_num, buf, offset)): leggelen(buf)byte – non necessariamente un numero intero di blocchi – a partire dal byteoffsetall’interno del bloccoblock_num.len(buf)non ha vincoli di allineamento.Restituisce
0in caso di successo o un codice di errore negativo. Si noti che il protocollo block-device standard di MicroPython restituisceNone; il driveralifespone intenzionalmente il codice di stato OSPI sottostante in modo che i chiamanti che bypassanovfspossano reagire agli errori hardware.
- writeblocks(block_num: int, buf: bytes) int¶
- writeblocks(block_num: int, buf: bytes, offset: int) int
Scrive byte da
bufnella flash. Due overload espongono le interfacce semplice ed estesa:Forma semplice (
writeblocks(block_num, buf)): scrive blocchi interi a partire dall’indice di bloccoblock_num.len(buf)deve essere un multiplo della dimensione del blocco flash. Ogni blocco interessato viene cancellato automaticamente prima di essere scritto.Forma estesa (
writeblocks(block_num, buf, offset)): scrivelen(buf)byte – non necessariamente un numero intero di blocchi – a partire dal byteoffsetall’interno del bloccoblock_num.len(buf)non ha vincoli di allineamento e non viene eseguita alcuna cancellazione implicita – il chiamante deve assicurarsi che i blocchi interessati siano stati cancellati tramite una precedente chiamataioctl(6, block_num).Restituisce
0in caso di successo o un codice di errore negativo (vedireadblocks()per la motivazione).
- ioctl(cmd: int, arg: int) int¶
Esegue un’operazione di controllo del block-device.
cmdè uno dei comandi standardMP_BLOCKDEV_IOCTL_*di MicroPython:1(init) — restituisce0.2(deinit) — restituisce0.3(sync) — restituisce0.4(block count) — restituisce il numero di blocchi nella regione.5(block size) — restituisce la dimensione del blocco flash in byte.6(block erase) — cancella il blocco all’indicearge restituisce il risultato dell’operazione di cancellazione.
Altri valori di
cmdrestituisconoNone.