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가 마운트되면 파일 시스템 드라이버가 모든 표준 코드를 자동으로 디스패치합니다.