class SDCard – driver per schede SD / MMC¶
La classe SDCard gestisce lo slot per schede SD / MMC presente sulle camere OpenMV che ne dispongono. Il driver implementa l’interfaccia vfs.AbstractBlockDev, quindi può essere passato direttamente a vfs.mount()
import machine
import vfs
sd = machine.SDCard()
vfs.mount(sd, "/sd")
Nota
Il firmware OpenMV monta automaticamente la scheda SD all’avvio, perciò la maggior parte degli script non costruisce mai direttamente un oggetto SDCard – si limita a leggere e scrivere attraverso il percorso montato automaticamente. Costruiscine uno manualmente solo quando hai bisogno di un punto di montaggio non predefinito o dell’accesso grezzo a livello di blocco tramite readblocks() / writeblocks() / ioctl().
Sulle OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 lo slot è gestito dal controller SDMMC integrato nell’STM32 in modalità SD a 4 bit. Sulla OpenMV Cam RT1062 lo slot è gestito dal controller USDHC dell’i.MX RT, anch’esso in modalità SD a 4 bit. Su nessuna scheda OpenMV attuale sono necessari argomenti di pin-mux – il driver conosce il cablaggio della scheda.
Non disponibile sulla OpenMV Cam AE3 (porta alif).
Costruttori¶
- class machine.SDCard(id: int = 1) SDCard¶
Restituisce il singleton
SDCardper lo slot SD identificato daid.idè accettato per compatibilità tra le varie porte, ma le porte supportate da OpenMV espongono un solo slot; passa1oppure ometti l’argomento.Su STM32 il costruttore non accetta alcun argomento; su mimxrt l’argomento
idè accettato ma solo1è valido.Metodi¶
- present() bool¶
Restituisce
Truese attualmente è rilevata una scheda nello slot, altrimentiFalse.Sulle schede che cablano un segnale di rilevamento scheda (card-detect) il metodo riflette tale segnale in tempo reale, quindi può essere interrogato dopo la costruzione dell’oggetto
SDCardper reagire all’inserimento / rimozione a caldo. Sulle schede prive di un segnale di card-detect il valore viene memorizzato (latched) al momento della costruzione – riporta il risultato della sonda CMD0 iniziale eseguita dal driver alla creazione dell’oggetto, e una scheda inserita a caldo successivamente non sarà visibile finché l’oggetto non viene ricostruito (oppure non viene chiamatoinit()su mimxrt).
- info() tuple[int, int, int]¶
Restituisce una tupla di 3 elementi che descrive la scheda attualmente inserita:
[0]num_blocks– capacità totale in blocchi da 512 byte. Moltiplica per 512 per ottenere la capacità grezza in byte.[1]block_size– sempre512per le schede SD. Incluso così i chiamanti possono calcolarenum_blocks * block_sizein modo portabile.[2]card_type– il tipo di scheda riportato dal bus SD durante l’handshake di inizializzazione CMD8 / OCR. I valori tipici sono0(SDSC – capacità standard),0x40(SDHC / SDXC – capacità alta / estesa) e0x80(MMC).
Utile per verificare che la scheda sia stata riconosciuta, oppure per mostrare le cifre dello spazio libero rispetto alla capacità totale.
- power(state: bool, /) None¶
Accende o spegne la linea di alimentazione dello slot per schede. Il firmware STM32 espone il metodo, ma nessuna OpenMV Cam attuale controlla l’alimentazione della SD, quindi la chiamata è di fatto una no-op. Mantenuto per compatibilità con il codice scritto originariamente per le schede di riferimento STM32 dell’upstream MicroPython. Solo porta STM32.
- read(block_num: int, /) bytes¶
Legge un singolo blocco da 512 byte dalla scheda e lo restituisce come un nuovo oggetto
bytesappena allocato.Questa è la lettura legacy a blocco singolo fornita dalla porta STM32. Il nuovo codice dovrebbe usare invece
readblocks()– quel metodo funziona su ogni porta OpenMV, può leggere un numero qualsiasi di blocchi contigui in un unico trasferimento ed evita l’allocazione a ogni chiamata scrivendo in un buffer fornito dal chiamante. Solo porta STM32.
- write(block_num: int, data: bytes, /) None¶
Scrive un singolo blocco da 512 byte sulla scheda.
datadeve essere lungo esattamente 512 byte.Questa è la scrittura legacy a blocco singolo fornita dalla porta STM32; il nuovo codice dovrebbe usare invece
writeblocks(), che funziona su ogni porta OpenMV e può scrivere un numero qualsiasi di blocchi contigui per chiamata. Solo porta STM32.
- readblocks(block_num: int, buf: bytearray) None¶
- readblocks(block_num: int, buf: bytearray, offset: int) None
Legge dati grezzi allineati ai blocchi dalla scheda in
buf. Punto di ingresso standard del dispositivo a blocchivfs.AbstractBlockDevusato dal livello del filesystem.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 SD (512 byte).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. Usata da littlefs e da altri filesystem indirizzabili a byte.
- writeblocks(block_num: int, buf: bytes | bytearray) None¶
- writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None
Scrive dati grezzi allineati ai blocchi da
bufsulla scheda. Punto di ingresso standard del dispositivo a blocchivfs.AbstractBlockDevusato dal livello del filesystem.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 SD (512 byte). Ogni blocco interessato viene sovrascritto per intero.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. Usata da littlefs e da altri filesystem indirizzabili a byte.
- ioctl(cmd: int, arg: int) int | None¶
Punto di ingresso di controllo standard di
vfs.AbstractBlockDev. Chiamato dal livello del filesystem al momento del montaggio/smontaggio e a ogni sincronizzazione. I valoricmdriconosciuti sono:1– inizializza. Restituisce0in caso di successo.2– deinizializza. Restituisce0in caso di successo.3– sincronizza eventuali scritture in sospeso. Restituisce0(il driver SDMMC scrive in modo sincrono, non c’è nulla da scaricare).4– restituisce il numero di blocchi sul dispositivo.5– restituisce la dimensione di un singolo blocco (sempre 512).6– cancella un blocco (no-op su SD, mantenuto per il contratto divfs.AbstractBlockDev).7– restituisce se il dispositivo supporta la cancellazione dei blocchi (0 su SD).
Normalmente i chiamanti diretti non usano questo metodo – il driver del filesystem invia automaticamente tutti i codici standard una volta che la
SDCardè montata.
- init(*args, **kwargs) None¶
Reinizializza l’interfaccia SD da zero. Accetta gli stessi argomenti del costruttore. Utile per rilevare nuovamente una scheda inserita a caldo sulle schede prive di un segnale di card-detect, dato che altrimenti
present()viene memorizzato (latched) al momento della costruzione. Solo porta mimxrt.
- deinit() None¶
Deinizializza l’interfaccia SD, rilasciando il controller SDMMC/USDHC e i pin IO che aveva occupato. L’oggetto
SDCarddiventa inutilizzabile finché non viene richiamatoinit(). Usalo prima di riprogrammare la scheda da un’altra interfaccia, oppure per togliere l’alimentazione allo slot in un’applicazione alimentata a batteria. Solo porta mimxrt.