class SDCard – SD-/MMC-kaartstuurprogramma

De klasse SDCard bestuurt de SD-/MMC-kaartsleuf op OpenMV-cams die er een hebben. Het stuurprogramma implementeert de vfs.AbstractBlockDev-interface, zodat het rechtstreeks aan vfs.mount() kan worden doorgegeven:

import machine
import vfs

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

Notitie

OpenMV-firmware koppelt de SD-kaart automatisch bij het opstarten, dus de meeste scripts maken nooit rechtstreeks een SDCard aan – ze lezen en schrijven gewoon via het automatisch gekoppelde pad. Maak er alleen handmatig een aan wanneer je een niet-standaard koppelpunt nodig hebt of ruwe blok-niveau toegang via readblocks() / writeblocks() / ioctl().

Op de OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 wordt de sleuf aangestuurd door de on-chip SDMMC-controller van de STM32 in 4-bits SD-modus. Op de OpenMV Cam RT1062 wordt de sleuf aangestuurd door de USDHC-controller van de i.MX RT, eveneens in 4-bits SD-modus. Er zijn op geen enkel huidig OpenMV-board pin-mux-argumenten nodig – het stuurprogramma kent de bedrading van het board.

Niet beschikbaar op de OpenMV Cam AE3 (alif-port).

Constructors

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

Geeft de SDCard-singleton terug voor de SD-sleuf die wordt aangeduid met id. id wordt geaccepteerd voor compatibiliteit tussen ports, maar de door OpenMV ondersteunde ports stellen slechts één sleuf beschikbaar; geef 1 op of laat het weg.

Op STM32 neemt de constructor helemaal geen argumenten; op mimxrt wordt het id-argument geaccepteerd, maar is alleen 1 geldig.

Methods

present() bool

Geeft True terug als er momenteel een kaart in de sleuf wordt gedetecteerd, anders False.

Op boards die een card-detect-signaal bedraden, weerspiegelt de methode dat signaal in realtime, zodat het na het construeren van het SDCard-object kan worden gepolld om te reageren op hot insertion / verwijdering. Op boards zonder card-detect-signaal wordt de waarde vastgelegd bij het construeren – ze rapporteert het resultaat van de initiële CMD0-probe die het stuurprogramma deed toen het object werd aangemaakt, en een kaart die daarna hot wordt ingebracht is niet zichtbaar totdat het object opnieuw wordt geconstrueerd (of init() wordt aangeroepen op mimxrt).

info() tuple[int, int, int]

Geeft een 3-tuple terug dat de momenteel ingebrachte kaart beschrijft:

  • [0] num_blocks – totale capaciteit in blokken van 512 byte. Vermenigvuldig met 512 om de ruwe bytecapaciteit te krijgen.

  • [1] block_size – altijd 512 voor SD-kaarten. Toegevoegd zodat aanroepers draagbaar num_blocks * block_size kunnen berekenen.

  • [2] card_type – het kaarttype zoals gerapporteerd door de SD-bus tijdens de CMD8- / OCR-initialisatiehandshake. Typische waarden zijn 0 (SDSC – standaardcapaciteit), 0x40 (SDHC / SDXC – hoge / uitgebreide capaciteit) en 0x80 (MMC).

Handig om te controleren of de kaart is herkend, of om de hoeveelheid vrije ruimte ten opzichte van de totale capaciteit weer te geven.

power(state: bool, /) None

Schakelt de voedingsrail van de kaartsleuf in of uit. STM32-firmware stelt de methode beschikbaar, maar geen enkele huidige OpenMV Cam schakelt de SD-voeding, dus de aanroep is in feite een no-op. Behouden voor compatibiliteit met code die oorspronkelijk is geschreven voor de upstream MicroPython STM32-referentieboards. Alleen STM32-port.

read(block_num: int, /) bytes

Leest een enkel blok van 512 byte van de kaart en geeft het terug als een nieuw toegewezen bytes-object.

Dit is de verouderde single-block-read die door de STM32-port wordt geleverd. Nieuwe code moet in plaats daarvan readblocks() gebruiken – die methode werkt op elke OpenMV-port, kan een willekeurig aantal aaneengesloten blokken in één transfer lezen en vermijdt de toewijzing per aanroep door in een door de aanroeper geleverde buffer te schrijven. Alleen STM32-port.

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

Schrijft een enkel blok van 512 byte naar de kaart. data moet precies 512 byte lang zijn.

Dit is de verouderde single-block-write die door de STM32-port wordt geleverd; nieuwe code moet in plaats daarvan writeblocks() gebruiken, die op elke OpenMV-port werkt en een willekeurig aantal aaneengesloten blokken per aanroep kan schrijven. Alleen STM32-port.

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

Leest ruwe blok-uitgelijnde gegevens van de kaart in buf. Standaard vfs.AbstractBlockDev-blokapparaat-ingangspunt dat door de bestandssysteemlaag wordt gebruikt.

Eenvoudige vorm (readblocks(block_num, buf)): leest hele blokken vanaf blokindex block_num. len(buf) moet een veelvoud zijn van de SD-blokgrootte (512 byte).

Uitgebreide vorm (readblocks(block_num, buf, offset)): leest len(buf) bytes – niet noodzakelijk een geheel aantal blokken – vanaf byte offset binnen blok block_num. Gebruikt door littlefs en andere byte-adresseerbare bestandssystemen.

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

Schrijft ruwe blok-uitgelijnde gegevens van buf naar de kaart. Standaard vfs.AbstractBlockDev-blokapparaat-ingangspunt dat door de bestandssysteemlaag wordt gebruikt.

Eenvoudige vorm (writeblocks(block_num, buf)): schrijft hele blokken vanaf blokindex block_num. len(buf) moet een veelvoud zijn van de SD-blokgrootte (512 byte). Elk betrokken blok wordt volledig overschreven.

Uitgebreide vorm (writeblocks(block_num, buf, offset)): schrijft len(buf) bytes – niet noodzakelijk een geheel aantal blokken – vanaf byte offset binnen blok block_num. Gebruikt door littlefs en andere byte-adresseerbare bestandssystemen.

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

Standaard vfs.AbstractBlockDev-besturingsingangspunt. Wordt aangeroepen door de bestandssysteemlaag bij het koppelen/ontkoppelen en bij elke sync. De herkende cmd-waarden zijn:

  • 1 – initialiseren. Geeft 0 terug bij succes.

  • 2 – deïnitialiseren. Geeft 0 terug bij succes.

  • 3 – alle openstaande schrijfacties synchroniseren. Geeft 0 terug (het SDMMC-stuurprogramma schrijft synchroon, er is niets om te flushen).

  • 4 – geeft het aantal blokken op het apparaat terug.

  • 5 – geeft de grootte van een enkel blok terug (altijd 512).

  • 6 – een blok wissen (no-op op SD, behouden voor het vfs.AbstractBlockDev-contract).

  • 7 – geeft terug of het apparaat blok wissen ondersteunt (0 op SD).

Directe aanroepers gebruiken deze methode normaal gesproken niet – het bestandssysteemstuurprogramma verzendt alle standaardcodes automatisch zodra de SDCard is gekoppeld.

init(*args, **kwargs) None

Herinitialiseert de SD-interface vanaf nul. Accepteert dezelfde argumenten als de constructor. Handig om een hot ingebrachte kaart opnieuw te detecteren op boards zonder card-detect-signaal, aangezien present() anders bij het construeren wordt vastgelegd. Alleen mimxrt-port.

deinit() None

Deïnitialiseert de SD-interface en geeft de SDMMC/USDHC-controller en de IO-pinnen die het in beslag nam vrij. Het SDCard-object wordt onbruikbaar totdat init() opnieuw wordt aangeroepen. Gebruik het voordat je de kaart vanaf een andere interface opnieuw flasht, of om de voeding naar de sleuf uit te schakelen in een batterijgevoede toepassing. Alleen mimxrt-port.