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 つしか公開していないため、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

カードから 1 つの 512 バイトブロックを読み取り、新たに割り当てられた bytes オブジェクトとして返します。

これは STM32 ポートに同梱されているレガシーな単一ブロック読み取りです。新しいコードでは代わりに readblocks() を使用してください。このメソッドはすべての OpenMV ポートで動作し、1 回の転送で任意の数の連続ブロックを読み取ることができ、呼び出し側が用意したバッファに書き込むことで呼び出しごとの割り当てを回避します。STM32 ポートのみ。

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

カードに 1 つの 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 ポートのみ。