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がマウントされると、ファイルシステムドライバがすべての標準コードを自動的にディスパッチします。