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

alif.info() None

Esporta sul terminale seriale le informazioni del dispositivo raccolte dai servizi del Secure Enclave Alif (servizi SE).

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 è -1 che significa partire dall’offset 0.

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 è -1 che significa usare tutti i byte rimanenti a partire da start.

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 blocco block_num. len(buf) deve essere un multiplo della dimensione del blocco flash.

Forma estesa (readblocks(block_num, buf, offset)): legge len(buf) byte – non necessariamente un numero intero di blocchi – a partire dal byte offset all’interno del blocco block_num. len(buf) non ha vincoli di allineamento.

Restituisce 0 in caso di successo o un codice di errore negativo. Si noti che il protocollo block-device standard di MicroPython restituisce None; il driver alif espone intenzionalmente il codice di stato OSPI sottostante in modo che i chiamanti che bypassano vfs possano reagire agli errori hardware.

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

Scrive byte da buf nella flash. Due overload espongono le interfacce semplice ed estesa:

Forma semplice (writeblocks(block_num, buf)): scrive blocchi interi a partire dall’indice di blocco block_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)): scrive len(buf) byte – non necessariamente un numero intero di blocchi – a partire dal byte offset all’interno del blocco block_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 chiamata ioctl(6, block_num).

Restituisce 0 in caso di successo o un codice di errore negativo (vedi readblocks() per la motivazione).

ioctl(cmd: int, arg: int) int

Esegue un’operazione di controllo del block-device. cmd è uno dei comandi standard MP_BLOCKDEV_IOCTL_* di MicroPython:

  • 1 (init) — restituisce 0.

  • 2 (deinit) — restituisce 0.

  • 3 (sync) — restituisce 0.

  • 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’indice arg e restituisce il risultato dell’operazione di cancellazione.

Altri valori di cmd restituiscono None.

Costanti

alif.usb_msc: bool

Presente e impostato a True solo quando il firmware viene compilato con il supporto USB Mass Storage Class abilitato. L’attributo è altrimenti assente.