class SDCard – driver pentru carduri SD / MMC

Clasa SDCard controlează slotul pentru carduri SD / MMC al camerelor OpenMV care dispun de unul. Driverul implementează interfața vfs.AbstractBlockDev, astfel încât poate fi transmis direct către vfs.mount()

import machine
import vfs

sd = machine.SDCard()
vfs.mount(sd, "/sd")

Notă

Firmware-ul OpenMV montează automat cardul SD la pornire, așa că majoritatea scripturilor nu construiesc niciodată direct un obiect SDCard – ele doar citesc și scriu prin calea montată automat. Construiți manual unul doar atunci când aveți nevoie de un punct de montare diferit de cel implicit sau de acces brut, la nivel de bloc, prin readblocks() / writeblocks() / ioctl().

Pe OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 slotul este controlat de controlerul SDMMC integrat al STM32 în modul SD pe 4 biți. Pe OpenMV Cam RT1062 slotul este controlat de controlerul USDHC al i.MX RT, tot în modul SD pe 4 biți. Nu este nevoie de niciun argument de pin-mux pe nicio placă OpenMV actuală – driverul cunoaște cablajul plăcii.

Nu este expusă pe OpenMV Cam AE3 (portul alif).

Constructori

class machine.SDCard(id: int = 1) SDCard

Returnează instanța unică (singleton) SDCard pentru slotul SD identificat prin id. id este acceptat pentru compatibilitate între porturi, dar porturile suportate de OpenMV expun un singur slot; transmiteți 1 sau omiteți-l.

Pe STM32 constructorul nu acceptă niciun argument; pe mimxrt argumentul id este acceptat, dar doar 1 este valid.

Metode

present() bool

Returnează True dacă în slot este detectat în prezent un card, altfel False.

Pe plăcile care conectează un semnal de detectare a cardului, metoda reflectă acel semnal în timp real, astfel încât poate fi interogată după ce obiectul SDCard a fost construit pentru a reacționa la inserarea / scoaterea la cald. Pe plăcile fără semnal de detectare a cardului, valoarea este fixată în momentul construcției – raportează rezultatul sondării inițiale CMD0 efectuate de driver la crearea obiectului, iar un card inserat la cald ulterior nu va fi vizibil până când obiectul nu este reconstruit (sau până când init() este apelată pe mimxrt).

info() tuple[int, int, int]

Returnează un tuplu cu 3 elemente care descrie cardul inserat în prezent:

  • [0] num_blocks – capacitatea totală în blocuri de 512 octeți. Înmulțiți cu 512 pentru a obține capacitatea brută în octeți.

  • [1] block_size – întotdeauna 512 pentru cardurile SD. Inclus pentru ca apelanții să poată calcula portabil num_blocks * block_size.

  • [2] card_type – tipul de card raportat de magistrala SD în timpul procesului de inițializare CMD8 / OCR. Valorile tipice sunt 0 (SDSC – capacitate standard), 0x40 (SDHC / SDXC – capacitate înaltă / extinsă) și 0x80 (MMC).

Util pentru a verifica faptul că un card a fost recunoscut sau pentru a afișa valori de spațiu liber raportate la capacitatea totală.

power(state: bool, /) None

Pornește sau oprește alimentarea slotului pentru card. Firmware-ul STM32 expune metoda, dar nicio cameră OpenMV Cam actuală nu controlează alimentarea SD, așa că apelul este practic fără efect. Păstrat pentru compatibilitate cu codul scris inițial pentru plăcile de referință STM32 din MicroPython upstream. Doar pentru portul STM32.

read(block_num: int, /) bytes

Citește un singur bloc de 512 octeți de pe card și îl returnează ca un obiect bytes nou alocat.

Aceasta este citirea pe un singur bloc, moștenită, livrată de portul STM32. Codul nou ar trebui să folosească în schimb readblocks() – acea metodă funcționează pe fiecare port OpenMV, poate citi orice număr de blocuri contigue într-un singur transfer și evită alocarea la fiecare apel scriind într-un tampon (buffer) furnizat de apelant. Doar pentru portul STM32.

write(block_num: int, data: bytes, /) None

Scrie un singur bloc de 512 octeți pe card. data trebuie să aibă exact 512 octeți.

Aceasta este scrierea pe un singur bloc, moștenită, livrată de portul STM32; codul nou ar trebui să folosească în schimb writeblocks(), care funcționează pe fiecare port OpenMV și poate scrie orice număr de blocuri contigue per apel. Doar pentru portul STM32.

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

Citește date brute aliniate la bloc de pe card în buf. Punct de intrare standard al dispozitivului de blocuri vfs.AbstractBlockDev, utilizat de stratul sistemului de fișiere.

Forma simplă (readblocks(block_num, buf)): citește blocuri întregi începând de la indexul de bloc block_num. len(buf) trebuie să fie un multiplu al dimensiunii blocului SD (512 octeți).

Forma extinsă (readblocks(block_num, buf, offset)): citește len(buf) octeți – nu neapărat un număr întreg de blocuri – începând de la octetul offset din cadrul blocului block_num. Utilizată de littlefs și de alte sisteme de fișiere adresabile la nivel de octet.

writeblocks(block_num: int, buf: bytes | bytearray) None
writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None

Scrie date brute aliniate la bloc din buf pe card. Punct de intrare standard al dispozitivului de blocuri vfs.AbstractBlockDev, utilizat de stratul sistemului de fișiere.

Forma simplă (writeblocks(block_num, buf)): scrie blocuri întregi începând de la indexul de bloc block_num. len(buf) trebuie să fie un multiplu al dimensiunii blocului SD (512 octeți). Fiecare bloc afectat este suprascris complet.

Forma extinsă (writeblocks(block_num, buf, offset)): scrie len(buf) octeți – nu neapărat un număr întreg de blocuri – începând de la octetul offset din cadrul blocului block_num. Utilizată de littlefs și de alte sisteme de fișiere adresabile la nivel de octet.

ioctl(cmd: int, arg: int) int | None

Punct de intrare standard de control vfs.AbstractBlockDev. Apelat de stratul sistemului de fișiere la momentul montării/demontării și la fiecare sincronizare. Valorile cmd recunoscute sunt:

  • 1 – inițializare. Returnează 0 în caz de succes.

  • 2 – dezinițializare. Returnează 0 în caz de succes.

  • 3 – sincronizează orice scrieri în așteptare. Returnează 0 (driverul SDMMC scrie sincron, nu este nimic de golit).

  • 4 – returnează numărul de blocuri de pe dispozitiv.

  • 5 – returnează dimensiunea unui singur bloc (întotdeauna 512).

  • 6 – șterge un bloc (fără efect pe SD, păstrat pentru contractul vfs.AbstractBlockDev).

  • 7 – returnează dacă dispozitivul suportă ștergerea blocurilor (0 pe SD).

În mod normal, apelanții direcți nu folosesc această metodă – driverul sistemului de fișiere distribuie automat toate codurile standard odată ce obiectul SDCard este montat.

init(*args, **kwargs) None

Reinițializează interfața SD de la zero. Acceptă aceleași argumente ca și constructorul. Util pentru re-detectarea unui card inserat la cald pe plăci fără semnal de detectare a cardului, deoarece present() este altfel fixată în momentul construcției. Doar pentru portul mimxrt.

deinit() None

Dezinițializează interfața SD, eliberând controlerul SDMMC/USDHC și pinii IO pe care i-a revendicat. Obiectul SDCard devine inutilizabil până când init() este apelată din nou. Folosiți-o înainte de a re-scrie cardul de pe o altă interfață sau pentru a întrerupe alimentarea slotului într-o aplicație alimentată cu baterie. Doar pentru portul mimxrt.