SDCard osztály – SD / MMC kártyameghajtó

A SDCard osztály az SD / MMC kártyafoglalatot vezérli azokon az OpenMV kamerákon, amelyek rendelkeznek ilyennel. A meghajtó megvalósítja a vfs.AbstractBlockDev interfészt, így közvetlenül átadható a vfs.mount() függvénynek:

import machine
import vfs

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

Megjegyzés

Az OpenMV firmware indításkor automatikusan csatolja az SD kártyát, így a legtöbb szkript soha nem hoz létre közvetlenül SDCard objektumot – egyszerűen az automatikusan csatolt útvonalon keresztül olvas és ír. Csak akkor hozz létre egyet kézzel, ha nem alapértelmezett csatolási pontra vagy nyers, blokk szintű hozzáférésre van szükséged a readblocks() / writeblocks() / ioctl() metódusokon keresztül.

Az OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 modelleken a foglalatot az STM32 chipbe integrált SDMMC vezérlője hajtja meg 4 bites SD üzemmódban. Az OpenMV Cam RT1062 modellen a foglalatot az i.MX RT USDHC vezérlője hajtja meg, szintén 4 bites SD üzemmódban. Egyetlen jelenlegi OpenMV lapon sincs szükség láb-multiplexer argumentumokra – a meghajtó ismeri a lap bekötését.

Nincs elérhetővé téve az OpenMV Cam AE3 modellen (alif port).

Konstruktorok

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

Visszaadja az id által azonosított SD foglalathoz tartozó SDCard egyke (singleton) példányt. Az id a portok közötti kompatibilitás érdekében elfogadott, de az OpenMV által támogatott portok csak egyetlen foglalatot tesznek elérhetővé; add meg az 1 értéket, vagy hagyd el.

STM32 esetén a konstruktor egyáltalán nem fogad argumentumokat; mimxrt esetén az id argumentum elfogadott, de csak az 1 érvényes.

Metódusok

present() bool

Visszaadja a True értéket, ha jelenleg kártya van észlelve a foglalatban, egyébként a False értéket.

Azokon a lapokon, amelyek kártyaérzékelő jelet vezetnek be, a metódus valós időben tükrözi ezt a jelet, így a SDCard objektum létrehozása után lekérdezhető, hogy reagáljon a kártya menet közbeni behelyezésére / eltávolítására. A kártyaérzékelő jellel nem rendelkező lapokon az érték a létrehozáskor rögzül – a meghajtó által az objektum létrehozásakor végzett kezdeti CMD0 vizsgálat eredményét jelzi, és egy utólag, menet közben behelyezett kártya nem lesz látható, amíg az objektumot újra létre nem hozzák (vagy mimxrt esetén meg nem hívják az init() metódust).

info() tuple[int, int, int]

Visszaad egy 3 elemű rendezett párt (tuple), amely a jelenleg behelyezett kártyát írja le:

  • [0] num_blocks – a teljes kapacitás 512 bájtos blokkokban. Szorozd meg 512-vel a nyers bájtkapacitás megkapásához.

  • [1] block_size – SD kártyák esetén mindig 512. Azért szerepel, hogy a hívók hordozható módon elvégezhessék a num_blocks * block_size műveletet.

  • [2] card_type – a kártya típusa, amelyet az SD busz jelentett a CMD8 / OCR inicializálási kézfogás során. Tipikus értékek a 0 (SDSC – standard kapacitás), a 0x40 (SDHC / SDXC – nagy / kibővített kapacitás) és a 0x80 (MMC).

Hasznos annak ellenőrzésére, hogy a kártya felismerésre került-e, vagy a szabad helyre vonatkozó adatok teljes kapacitáshoz viszonyított megjelenítésére.

power(state: bool, /) None

Be- vagy kikapcsolja a kártyafoglalat tápsínjét. Az STM32 firmware elérhetővé teszi ezt a metódust, de egyetlen jelenlegi OpenMV Cam sem szabályozza az SD tápellátást, így a hívás gyakorlatilag nem csinál semmit. A kompatibilitás kedvéért megtartva olyan kódhoz, amelyet eredetileg az upstream MicroPython STM32 referencialapokhoz írtak. Csak STM32 port.

read(block_num: int, /) bytes

Beolvas egyetlen 512 bájtos blokkot a kártyáról, és újonnan lefoglalt bytes objektumként adja vissza.

Ez az STM32 port által szállított, örökölt egyblokkos olvasás. Az új kódnak ehelyett a readblocks() metódust kell használnia – az minden OpenMV porton működik, egyetlen átvitelben tetszőleges számú összefüggő blokkot képes olvasni, és elkerüli a hívásonkénti lefoglalást azáltal, hogy egy hívó által biztosított pufferbe ír. Csak STM32 port.

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

Egyetlen 512 bájtos blokkot ír a kártyára. A data hosszának pontosan 512 bájtnak kell lennie.

Ez az STM32 port által szállított, örökölt egyblokkos írás; az új kódnak ehelyett a writeblocks() metódust kell használnia, amely minden OpenMV porton működik, és hívásonként tetszőleges számú összefüggő blokkot képes írni. Csak STM32 port.

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

Nyers, blokkhatárhoz igazított adatokat olvas be a kártyáról a buf pufferbe. A fájlrendszer rétege által használt standard vfs.AbstractBlockDev blokkeszköz belépési pont.

Egyszerű forma (readblocks(block_num, buf)): teljes blokkokat olvas a block_num blokkindextől kezdődően. A len(buf) értéknek az SD blokkméret (512 bájt) többszörösének kell lennie.

Kibővített forma (readblocks(block_num, buf, offset)): len(buf) bájtot olvas – nem feltétlenül egész számú blokkot – a block_num blokkon belüli offset bájttól kezdődően. A littlefs és más bájtcímezhető fájlrendszerek használják.

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

Nyers, blokkhatárhoz igazított adatokat ír a buf pufferből a kártyára. A fájlrendszer rétege által használt standard vfs.AbstractBlockDev blokkeszköz belépési pont.

Egyszerű forma (writeblocks(block_num, buf)): teljes blokkokat ír a block_num blokkindextől kezdődően. A len(buf) értéknek az SD blokkméret (512 bájt) többszörösének kell lennie. Minden érintett blokk teljes egészében felülíródik.

Kibővített forma (writeblocks(block_num, buf, offset)): len(buf) bájtot ír – nem feltétlenül egész számú blokkot – a block_num blokkon belüli offset bájttól kezdődően. A littlefs és más bájtcímezhető fájlrendszerek használják.

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

Standard vfs.AbstractBlockDev vezérlési belépési pont. A fájlrendszer rétege hívja meg csatoláskor/leválasztáskor és minden szinkronizáláskor. A felismert cmd értékek a következők:

  • 1 – inicializálás. Sikeresség esetén 0 értéket ad vissza.

  • 2 – de-inicializálás. Sikeresség esetén 0 értéket ad vissza.

  • 3 – a függőben lévő írások szinkronizálása. 0 értéket ad vissza (az SDMMC meghajtó szinkron módon ír, nincs mit kiüríteni).

  • 4 – visszaadja az eszközön lévő blokkok számát.

  • 5 – visszaadja egyetlen blokk méretét (mindig 512).

  • 6 – blokk törlése (SD esetén nem csinál semmit, a vfs.AbstractBlockDev szerződés kedvéért megtartva).

  • 7 – visszaadja, hogy az eszköz támogatja-e a blokktörlést (SD esetén 0).

A közvetlen hívók általában nem használják ezt a metódust – a fájlrendszer-meghajtó automatikusan kezeli az összes standard kódot, miután a SDCard csatolásra került.

init(*args, **kwargs) None

Az SD interfész teljes újrainicializálása. Ugyanazokat az argumentumokat fogadja el, mint a konstruktor. Hasznos a menet közben behelyezett kártya újraészleléséhez kártyaérzékelő jel nélküli lapokon, mivel a present() egyébként a létrehozáskor rögzül. Csak mimxrt port.

deinit() None

De-inicializálja az SD interfészt, felszabadítva az SDMMC/USDHC vezérlőt és az általa lefoglalt IO lábakat. A SDCard objektum használhatatlanná válik, amíg az init() metódust újra meg nem hívják. Használd, mielőtt egy másik interfészről újraírnád a kártyát, vagy hogy lekapcsold a foglalat tápellátását egy akkumulátoros alkalmazásban. Csak mimxrt port.