class SDCard – drivrutin för SD-/MMC-kort

Klassen SDCard styr SD-/MMC-kortplatsen på OpenMV-kameror som har en sådan. Drivrutinen implementerar gränssnittet vfs.AbstractBlockDev så att den kan skickas direkt till vfs.mount()

import machine
import vfs

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

Anteckning

OpenMV-firmware monterar SD-kortet automatiskt vid uppstart, så de flesta skript konstruerar aldrig en SDCard direkt – de läser och skriver bara via den automatiskt monterade sökvägen. Konstruera en manuellt endast när du behöver en icke-standardmonteringspunkt eller åtkomst på rå blocknivå via readblocks() / writeblocks() / ioctl().

På OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 styrs kortplatsen av STM32:ns inbyggda SDMMC-styrenhet i 4-bitars SD-läge. På OpenMV Cam RT1062 styrs kortplatsen av i.MX RT:ns USDHC-styrenhet, också i 4-bitars SD-läge. Inga pin-mux-argument behövs på något aktuellt OpenMV-kort – drivrutinen känner till kortets kopplingar.

Exponeras inte på OpenMV Cam AE3 (alif-porten).

Konstruktorer

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

Returnerar singleton-objektet SDCard för den SD-plats som identifieras av id. id accepteras för korsportskompatibilitet, men de OpenMV-stödda portarna exponerar endast en plats; skicka 1 eller utelämna det.

På STM32 tar konstruktorn inga argument alls; på mimxrt accepteras argumentet id men endast 1 är giltigt.

Metoder

present() bool

Returnerar True om ett kort för närvarande detekteras i platsen, annars False.

På kort som kopplar en kortdetekteringssignal speglar metoden den signalen i realtid, så den kan pollas efter att SDCard-objektet har konstruerats för att reagera på varm insättning/borttagning. På kort utan kortdetekteringssignal låses värdet vid konstruktionstillfället – det rapporterar resultatet av den initiala CMD0-avsökning som drivrutinen gjorde när objektet skapades, och ett kort som sätts in varmt efteråt blir inte synligt förrän objektet konstrueras om (eller init() anropas på mimxrt).

info() tuple[int, int, int]

Returnerar en 3-tupel som beskriver det för närvarande insatta kortet:

  • [0] num_blocks – total kapacitet i 512-byteblock. Multiplicera med 512 för att få den råa bytekapaciteten.

  • [1] block_size – alltid 512 för SD-kort. Inkluderas så att anropare portabelt kan beräkna num_blocks * block_size.

  • [2] card_type – den korttyp som rapporteras av SD-bussen under initieringshandskakningen CMD8/OCR. Typiska värden är 0 (SDSC – standardkapacitet), 0x40 (SDHC/SDXC – hög/utökad kapacitet) och 0x80 (MMC).

Användbart för att rimlighetskontrollera att kortet kändes igen, eller för att visa siffror för ledigt utrymme relativt total kapacitet.

power(state: bool, /) None

Slå på eller av strömskenan till kortplatsen. STM32-firmware exponerar metoden, men ingen aktuell OpenMV Cam stänger av SD-strömförsörjningen, så anropet är i praktiken utan effekt. Behålls för kompatibilitet med kod som ursprungligen skrevs för MicroPythons STM32-referenskort uppströms. Endast STM32-porten.

read(block_num: int, /) bytes

Läs ett enskilt 512-byteblock från kortet och returnera det som ett nyallokerat bytes-objekt.

Detta är den äldre enkelblocksläsningen som levereras av STM32-porten. Ny kod bör använda readblocks() i stället – den metoden fungerar på alla OpenMV-portar, kan läsa valfritt antal sammanhängande block i en överföring och undviker allokeringen per anrop genom att skriva in i en buffert som anroparen tillhandahåller. Endast STM32-porten.

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

Skriv ett enskilt 512-byteblock till kortet. data måste vara exakt 512 byte långt.

Detta är den äldre enkelblocksskrivningen som levereras av STM32-porten; ny kod bör använda writeblocks() i stället, vilken fungerar på alla OpenMV-portar och kan skriva valfritt antal sammanhängande block per anrop. Endast STM32-porten.

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

Läs rå blockjusterad data från kortet in i buf. Standardingång för blockenheter enligt vfs.AbstractBlockDev som används av filsystemslagret.

Enkel form (readblocks(block_num, buf)): läs hela block med början vid blockindex block_num. len(buf) måste vara en multipel av SD-blockstorleken (512 byte).

Utökad form (readblocks(block_num, buf, offset)): läs len(buf) byte – inte nödvändigtvis ett helt antal block – med början vid byte offset inom block block_num. Används av littlefs och andra byteadresserbara filsystem.

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

Skriv rå blockjusterad data från buf till kortet. Standardingång för blockenheter enligt vfs.AbstractBlockDev som används av filsystemslagret.

Enkel form (writeblocks(block_num, buf)): skriv hela block med början vid blockindex block_num. len(buf) måste vara en multipel av SD-blockstorleken (512 byte). Varje berört block skrivs över i sin helhet.

Utökad form (writeblocks(block_num, buf, offset)): skriv len(buf) byte – inte nödvändigtvis ett helt antal block – med början vid byte offset inom block block_num. Används av littlefs och andra byteadresserbara filsystem.

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

Standardkontrollingång enligt vfs.AbstractBlockDev. Anropas av filsystemslagret vid montering/avmontering och vid varje synkronisering. De igenkända cmd-värdena är:

  • 1 – initiera. Returnerar 0 vid lyckat resultat.

  • 2 – avinitiera. Returnerar 0 vid lyckat resultat.

  • 3 – synkronisera eventuella väntande skrivningar. Returnerar 0 (SDMMC-drivrutinen skriver synkront, inget att tömma).

  • 4 – returnera antalet block på enheten.

  • 5 – returnera storleken på ett enskilt block (alltid 512).

  • 6 – radera ett block (utan effekt på SD, behålls för vfs.AbstractBlockDev-kontraktet).

  • 7 – returnera huruvida enheten stöder blockradering (0 på SD).

Direkta anropare använder normalt inte denna metod – filsystemsdrivrutinen hanterar alla standardkoder automatiskt så snart SDCard är monterad.

init(*args, **kwargs) None

Återinitiera SD-gränssnittet från grunden. Accepterar samma argument som konstruktorn. Användbart för att åter detektera ett varmt insatt kort på kort utan kortdetekteringssignal, eftersom present() annars är låst vid konstruktionstillfället. Endast mimxrt-porten.

deinit() None

Avinitiera SD-gränssnittet och frigör SDMMC/USDHC-styrenheten och de IO-stift den hade gjort anspråk på. SDCard-objektet blir oanvändbart tills init() anropas igen. Använd det innan kortet omflashas från ett annat gränssnitt, eller för att stänga av strömmen till platsen i en batteridriven tillämpning. Endast mimxrt-porten.