class SDCard – SD / MMC 카드 드라이버

SDCard 클래스는 SD / MMC 카드 슬롯이 있는 OpenMV 카메라에서 해당 슬롯을 구동합니다. 이 드라이버는 vfs.AbstractBlockDev 인터페이스를 구현하므로 vfs.mount()에 직접 전달할 수 있습니다:

import machine
import vfs

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

참고

OpenMV 펌웨어는 부팅 시 SD 카드를 자동으로 마운트하므로, 대부분의 스크립트는 SDCard를 직접 생성하지 않습니다 – 단지 자동 마운트된 경로를 통해 읽고 씁니다. 기본값이 아닌 마운트 지점이 필요하거나 readblocks() / writeblocks() / ioctl()을 통한 원시 블록 단위 접근이 필요할 때만 수동으로 하나를 생성하십시오.

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal / N6에서는 슬롯이 STM32의 온칩 SDMMC 컨트롤러에 의해 4비트 SD 모드로 구동됩니다. OpenMV Cam RT1062에서는 슬롯이 i.MX RT의 USDHC 컨트롤러에 의해 역시 4비트 SD 모드로 구동됩니다. 현재 어떤 OpenMV 보드에서도 핀 멀티플렉싱 인수는 필요하지 않습니다 – 드라이버가 보드의 배선을 알고 있습니다.

OpenMV Cam AE3(alif 포트)에서는 노출되지 않습니다.

생성자

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

id로 식별되는 SD 슬롯에 대한 SDCard 싱글톤을 반환합니다. id는 포트 간 호환성을 위해 허용되지만, OpenMV가 지원하는 포트는 슬롯을 하나만 노출합니다. 1을 전달하거나 생략하십시오.

STM32에서는 생성자가 인수를 전혀 받지 않습니다. mimxrt에서는 id 인수가 허용되지만 1만 유효합니다.

메서드

present() bool

현재 슬롯에 카드가 감지되면 True를, 그렇지 않으면 False를 반환합니다.

카드 감지 신호를 배선한 보드에서는 이 메서드가 해당 신호를 실시간으로 반영하므로, SDCard 객체가 생성된 후 폴링하여 핫 삽입/제거에 반응할 수 있습니다. 카드 감지 신호가 없는 보드에서는 값이 생성 시점에 래치됩니다 – 즉 객체가 생성될 때 드라이버가 수행한 초기 CMD0 프로브의 결과를 보고하며, 그 이후에 핫 삽입된 카드는 객체가 다시 생성될 때까지(또는 mimxrt에서 init()이 호출될 때까지) 보이지 않습니다.

info() tuple[int, int, int]

현재 삽입된 카드를 설명하는 3-튜플을 반환합니다:

  • [0] num_blocks – 512바이트 블록 단위의 총 용량. 512를 곱하면 원시 바이트 용량을 얻습니다.

  • [1] block_size – SD 카드의 경우 항상 512입니다. 호출자가 num_blocks * block_size를 이식 가능하게 계산할 수 있도록 포함되어 있습니다.

  • [2] card_type – CMD8 / OCR 초기화 핸드셰이크 중에 SD 버스가 보고하는 카드 유형입니다. 일반적인 값은 0 (SDSC – 표준 용량), 0x40 (SDHC / SDXC – 고용량 / 확장 용량), 0x80 (MMC)입니다.

카드가 인식되었는지 확인하거나, 총 용량 대비 여유 공간 수치를 표시하는 데 유용합니다.

power(state: bool, /) None

카드 슬롯의 전원 레일을 켜거나 끕니다. STM32 펌웨어는 이 메서드를 노출하지만 현재 어떤 OpenMV Cam도 SD 전원 공급을 게이팅하지 않으므로, 이 호출은 사실상 아무 동작도 하지 않습니다. 원래 업스트림 MicroPython STM32 레퍼런스 보드용으로 작성된 코드와의 호환성을 위해 유지됩니다. STM32 포트 전용입니다.

read(block_num: int, /) bytes

카드에서 단일 512바이트 블록을 읽어 새로 할당된 bytes 객체로 반환합니다.

이것은 STM32 포트에서 제공되는 레거시 단일 블록 읽기입니다. 새 코드는 대신 readblocks()를 사용해야 합니다 – 이 메서드는 모든 OpenMV 포트에서 동작하고, 한 번의 전송으로 임의 개수의 연속 블록을 읽을 수 있으며, 호출자가 제공한 버퍼에 기록함으로써 호출마다 발생하는 할당을 피합니다. STM32 포트 전용입니다.

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

카드에 단일 512바이트 블록을 씁니다. data는 정확히 512바이트 길이여야 합니다.

이것은 STM32 포트에서 제공되는 레거시 단일 블록 쓰기입니다. 새 코드는 대신 writeblocks()를 사용해야 하며, 이 메서드는 모든 OpenMV 포트에서 동작하고 호출당 임의 개수의 연속 블록을 쓸 수 있습니다. STM32 포트 전용입니다.

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

카드에서 블록 정렬된 원시 데이터를 buf로 읽습니다. 파일 시스템 계층이 사용하는 표준 vfs.AbstractBlockDev 블록 장치 진입점입니다.

단순 형식 (readblocks(block_num, buf)): 블록 인덱스 block_num부터 시작하여 전체 블록을 읽습니다. len(buf)는 SD 블록 크기(512바이트)의 배수여야 합니다.

확장 형식 (readblocks(block_num, buf, offset)): 블록 block_num 내의 바이트 offset에서 시작하여 len(buf) 바이트를 읽습니다 – 반드시 블록의 정수 배수일 필요는 없습니다. littlefs 및 기타 바이트 주소 지정 가능 파일 시스템에서 사용됩니다.

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

buf의 블록 정렬된 원시 데이터를 카드에 씁니다. 파일 시스템 계층이 사용하는 표준 vfs.AbstractBlockDev 블록 장치 진입점입니다.

단순 형식 (writeblocks(block_num, buf)): 블록 인덱스 block_num부터 시작하여 전체 블록을 씁니다. len(buf)는 SD 블록 크기(512바이트)의 배수여야 합니다. 영향을 받는 각 블록은 전체가 덮어쓰여집니다.

확장 형식 (writeblocks(block_num, buf, offset)): 블록 block_num 내의 바이트 offset에서 시작하여 len(buf) 바이트를 씁니다 – 반드시 블록의 정수 배수일 필요는 없습니다. littlefs 및 기타 바이트 주소 지정 가능 파일 시스템에서 사용됩니다.

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

표준 vfs.AbstractBlockDev 제어 진입점입니다. 파일 시스템 계층이 마운트/언마운트 시점과 모든 동기화 시점에 호출합니다. 인식되는 cmd 값은 다음과 같습니다:

  • 1 – 초기화. 성공 시 0을 반환합니다.

  • 2 – 초기화 해제. 성공 시 0을 반환합니다.

  • 3 – 보류 중인 쓰기를 동기화합니다. 0을 반환합니다(SDMMC 드라이버는 동기적으로 쓰므로 플러시할 것이 없습니다).

  • 4 – 장치의 블록 수를 반환합니다.

  • 5 – 단일 블록의 크기를 반환합니다(항상 512).

  • 6 – 블록을 지웁니다(SD에서는 아무 동작도 하지 않으며, vfs.AbstractBlockDev 계약을 위해 유지됨).

  • 7 – 장치가 블록 지우기를 지원하는지 반환합니다(SD에서는 0).

직접 호출하는 경우 일반적으로 이 메서드를 사용하지 않습니다 – SDCard가 마운트되면 파일 시스템 드라이버가 모든 표준 코드를 자동으로 디스패치합니다.

init(*args, **kwargs) None

SD 인터페이스를 처음부터 다시 초기화합니다. 생성자와 동일한 인수를 받습니다. present()가 생성 시점에 래치되기 때문에, 카드 감지 신호가 없는 보드에서 핫 삽입된 카드를 다시 감지하는 데 유용합니다. mimxrt 포트 전용입니다.

deinit() None

SD 인터페이스를 초기화 해제하여 SDMMC/USDHC 컨트롤러와 점유한 IO 핀을 해제합니다. init이 다시 호출될 때까지 SDCard 객체는 사용할 수 없게 됩니다. 다른 인터페이스에서 카드를 다시 플래시하기 전에, 또는 배터리 구동 애플리케이션에서 슬롯의 전원을 차단하기 위해 사용하십시오. mimxrt 포트 전용입니다.