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 포트 전용입니다.