klasa SDCard – sterownik karty SD / MMC

Klasa SDCard obsługuje gniazdo karty SD / MMC w kamerach OpenMV, które je posiadają. Sterownik implementuje interfejs vfs.AbstractBlockDev, dzięki czemu można go przekazać bezpośrednio do vfs.mount()

import machine
import vfs

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

Informacja

Oprogramowanie układowe OpenMV automatycznie montuje kartę SD podczas rozruchu, więc większość skryptów nigdy nie tworzy obiektu SDCard bezpośrednio – po prostu odczytują i zapisują dane przez automatycznie zamontowaną ścieżkę. Konstruuj obiekt ręcznie tylko wtedy, gdy potrzebujesz niestandardowego punktu montowania lub surowego dostępu na poziomie bloków przez readblocks() / writeblocks() / ioctl().

W kamerach OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6 gniazdo jest obsługiwane przez wbudowany kontroler SDMMC układu STM32 w trybie 4-bitowym SD. W kamerze OpenMV Cam RT1062 gniazdo jest obsługiwane przez kontroler USDHC układu i.MX RT, również w trybie 4-bitowym SD. Na żadnej z obecnych płytek OpenMV nie są potrzebne argumenty multipleksowania pinów – sterownik zna okablowanie płytki.

Niedostępne w kamerze OpenMV Cam AE3 (port alif).

Konstruktory

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

Zwraca singleton SDCard dla gniazda SD identyfikowanego przez id. id jest akceptowane dla zgodności między portami, ale porty obsługiwane przez OpenMV udostępniają tylko jedno gniazdo; przekaż 1 lub pomiń ten argument.

Na STM32 konstruktor nie przyjmuje żadnych argumentów; na mimxrt argument id jest akceptowany, ale prawidłowa jest tylko wartość 1.

Metody

present() bool

Zwraca True, jeśli w gnieździe wykryto kartę, w przeciwnym razie False.

Na płytkach z sygnałem wykrywania karty metoda odzwierciedla ten sygnał w czasie rzeczywistym, więc można ją odpytywać po skonstruowaniu obiektu SDCard, aby reagować na włożenie / wyjęcie karty na gorąco. Na płytkach bez sygnału wykrywania karty wartość jest zatrzaśnięta w momencie konstrukcji – zgłasza wynik początkowego sondowania CMD0, które sterownik wykonał podczas tworzenia obiektu, a karta włożona na gorąco później nie będzie widoczna, dopóki obiekt nie zostanie ponownie skonstruowany (lub na mimxrt wywołana zostanie metoda init()).

info() tuple[int, int, int]

Zwraca 3-elementową krotkę opisującą aktualnie włożoną kartę:

  • [0] num_blocks – całkowita pojemność w blokach 512-bajtowych. Pomnóż przez 512, aby uzyskać surową pojemność w bajtach.

  • [1] block_size – zawsze 512 dla kart SD. Dołączone, aby wywołujący mogli przenośnie obliczyć num_blocks * block_size.

  • [2] card_type – typ karty zgłoszony przez magistralę SD podczas inicjalizacyjnego uzgadniania CMD8 / OCR. Typowe wartości to 0 (SDSC – standardowa pojemność), 0x40 (SDHC / SDXC – wysoka / rozszerzona pojemność) oraz 0x80 (MMC).

Przydatne do sprawdzenia, czy karta została rozpoznana, lub do wyświetlenia ilości wolnego miejsca względem całkowitej pojemności.

power(state: bool, /) None

Włącza lub wyłącza szynę zasilania gniazda karty. Oprogramowanie układowe STM32 udostępnia tę metodę, ale żadna obecna kamera OpenMV Cam nie steruje zasilaniem SD, więc wywołanie jest w praktyce operacją pustą. Zachowane dla zgodności z kodem napisanym pierwotnie dla referencyjnych płytek STM32 z głównego repozytorium MicroPython. Tylko port STM32.

read(block_num: int, /) bytes

Odczytuje pojedynczy blok 512-bajtowy z karty i zwraca go jako nowo zaalokowany obiekt bytes.

Jest to przestarzały odczyt pojedynczego bloku dostarczany przez port STM32. Nowy kod powinien zamiast tego używać readblocks() – ta metoda działa na każdym porcie OpenMV, może odczytać dowolną liczbę kolejnych bloków w jednym transferze i unika alokacji przy każdym wywołaniu, zapisując dane do bufora dostarczonego przez wywołującego. Tylko port STM32.

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

Zapisuje pojedynczy blok 512-bajtowy na kartę. data musi mieć dokładnie 512 bajtów długości.

Jest to przestarzały zapis pojedynczego bloku dostarczany przez port STM32; nowy kod powinien zamiast tego używać writeblocks(), która działa na każdym porcie OpenMV i może zapisać dowolną liczbę kolejnych bloków w jednym wywołaniu. Tylko port STM32.

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

Odczytuje surowe dane wyrównane do bloków z karty do buf. Standardowy punkt wejścia urządzenia blokowego vfs.AbstractBlockDev używany przez warstwę systemu plików.

Forma prosta (readblocks(block_num, buf)): odczytuje całe bloki zaczynając od indeksu bloku block_num. len(buf) musi być wielokrotnością rozmiaru bloku SD (512 bajtów).

Forma rozszerzona (readblocks(block_num, buf, offset)): odczytuje len(buf) bajtów – niekoniecznie całkowitą liczbę bloków – zaczynając od bajtu offset w bloku block_num. Używana przez littlefs i inne systemy plików adresowane bajtowo.

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

Zapisuje surowe dane wyrównane do bloków z buf na kartę. Standardowy punkt wejścia urządzenia blokowego vfs.AbstractBlockDev używany przez warstwę systemu plików.

Forma prosta (writeblocks(block_num, buf)): zapisuje całe bloki zaczynając od indeksu bloku block_num. len(buf) musi być wielokrotnością rozmiaru bloku SD (512 bajtów). Każdy objęty blok jest nadpisywany w całości.

Forma rozszerzona (writeblocks(block_num, buf, offset)): zapisuje len(buf) bajtów – niekoniecznie całkowitą liczbę bloków – zaczynając od bajtu offset w bloku block_num. Używana przez littlefs i inne systemy plików adresowane bajtowo.

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

Standardowy punkt wejścia sterowania vfs.AbstractBlockDev. Wywoływany przez warstwę systemu plików podczas montowania/odmontowywania oraz przy każdej synchronizacji. Rozpoznawane wartości cmd to:

  • 1 – inicjalizacja. Zwraca 0 w przypadku powodzenia.

  • 2 – deinicjalizacja. Zwraca 0 w przypadku powodzenia.

  • 3 – synchronizacja wszystkich oczekujących zapisów. Zwraca 0 (sterownik SDMMC zapisuje synchronicznie, nie ma nic do opróżnienia).

  • 4 – zwraca liczbę bloków na urządzeniu.

  • 5 – zwraca rozmiar pojedynczego bloku (zawsze 512).

  • 6 – kasuje blok (operacja pusta na SD, zachowana dla kontraktu vfs.AbstractBlockDev).

  • 7 – zwraca informację, czy urządzenie obsługuje kasowanie bloków (0 na SD).

Wywołujący bezpośrednio zwykle nie używają tej metody – sterownik systemu plików automatycznie obsługuje wszystkie standardowe kody, gdy SDCard zostanie zamontowana.

init(*args, **kwargs) None

Ponownie inicjalizuje interfejs SD od podstaw. Przyjmuje te same argumenty co konstruktor. Przydatne do ponownego wykrycia karty włożonej na gorąco na płytkach bez sygnału wykrywania karty, ponieważ present() jest w przeciwnym razie zatrzaśnięta w momencie konstrukcji. Tylko port mimxrt.

deinit() None

Deinicjalizuje interfejs SD, zwalniając kontroler SDMMC/USDHC oraz piny IO, które zajmował. Obiekt SDCard staje się bezużyteczny, dopóki ponownie nie zostanie wywołana metoda init(). Użyj jej przed ponownym zapisaniem karty z innego interfejsu lub aby odłączyć zasilanie gniazda w aplikacji zasilanej z baterii. Tylko port mimxrt.