disk_ioctl

一般的なデータ読み書き以外のストレージ デバイス自体に対する様々な制御を行います。

DRESULT disk_ioctl (
  BYTE pdrv,    /* [IN] 物理ドライブ番号 */
  BYTE cmd,     /* [IN] 制御コマンド */
  void* buff    /* [I/O] データ受け渡しバッファ */
);

引数

pdrv
対象のデバイスを識別する物理ドライブ番号(0-9)が指定されます。
cmd
制御コマンド コードが指定されます。
buff
制御コマンドに依存したパラメータを授受するバッファを指すポインタが指定されます。パラメータの授受のないコマンドの場合は、値に意味はありません。

戻り値

RES_OK (0)
正常終了。
RES_ERROR
何らかのエラーが発生した。
RES_PARERR
コマンドが不正。
RES_NOTRDY
ドライブが動作可能状態ではない、または初期化されていない。

解説

ストレージ デバイスの種類によりサポートされるコマンドは異なりますが、FatFsモジュール自体は、次の汎用コマンドのみ使用し、特定のデバイスに依存した制御は行いません。

標準ioctlコマンド
コマンド解説
CTRL_SYNCデバイスのデータ書き込み処理を完了させます。ドライバがライト バック キャッシュなどを持っている場合は、書き込まれていないデータを即時書き込みます。メディア上への書き込みがそれぞれdisk_write関数の中で完了する場合は、このコマンドに対してすることはありません。
GET_SECTOR_COUNT総セクタ数の取得。buffの指すDWORD型変数にドライブ上の総セクタ数を返します。f_mkfs, f_fdisk関数内から呼び出され、作成するボリュームのサイズを決定するために使用されます。
GET_SECTOR_SIZEセクタ サイズの取得。セクタ サイズ可変(_MAX_SS > _MIN_SS)のとき、disk_initailize関数の成功に続き呼び出されるので、buffの指すWORD型変数に現在のセクタ サイズを返します。有効値は512、1024、2048または4096です。セクタ サイズ固定(_MAX_SS == _MIN_SS)のときはこのコマンドは使われることはなく、デバイスは常にそのセクタ サイズで動作しなければなりません。
GET_BLOCK_SIZE消去ブロック サイズの取得。buffの指すDWORD型変数にフラッシュ メモリの消去ブロック サイズ(セクタ単位)を返します。1から32768の範囲で2の累乗の値でなければなりません。ブロック サイズ不明またはフラッシュ メモリ以外のデバイスでは1を返します。f_mkfs関数内でのみ使用され、作成されるボリュームのデータ領域はこの境界にアライメントされます。
CTRL_TRIM不必要セクタの通知。buffの指すDWORD型配列には不必要になった領域 {開始セクタ,終了セクタ} を指定して呼び出されます。TRIM機能が有効(_USE_TRIM == 1)で、クラスタが解放されるとき、およびフォーマット時に呼び出されます。これは、ATAコマンド セットのTrimコマンドと等価で、この機能をサポートしないデバイスは何もする必要はありません。また、戻り値はチェックされず、結果によってFatFsの動作が影響を受けることはありません。

FatFs自体はデバイス依存コマンドやユーザ定義コマンドは一切使用しませんが、アプリケーションから何らかのデバイス制御が行えると便利なことがあります。アプリケーション上で標準以外の制御が必要なときは、必要に応じてユーザ定義コマンドを追加して利用するとよいでしょう。次にコマンドの例を示します。

ユーザ定義ioctlコマンドの例
コマンド解説
CTRL_FORMATメディアの物理フォーマットを行います。buffはNULLでないとき、進行表示のためのコールバック関数のアドレスを示します。
CTRL_POWER_IDLEデバイスをアイドル状態にします。通常の読み書き要求でアクティブ状態に戻るなら、STA_NOINITフラグをセットする必要はありません。
CTRL_POWER_OFFデバイスをシャットダウン状態にします。STA_NOINITはセットされます。デバイスはdisk_initialize関数でアクティブ状態に戻ります。
CTRL_LOCKユーザによるメディアの取り出しを禁止します。
CTRL_UNLOCKユーザによるメディアの取り出しを許可します。
CTRL_EJECTメディアを排出します。完了後、STA_NOINITSTA_NODISKフラグはセットされます。
MMC_GET_TYPEカード タイプを示すフラグ(b0:MMCv3, b1:SDv1, b2:SDv2+, b3:LBA)をbuffの示すBYTE変数に読み出します。(MMC/SDカード専用)
MMC_GET_CSDCSDレジスタの内容をbuffの示す16バイトのバッファに読み出します。(MMC/SDカード専用)
MMC_GET_CIDCIDレジスタの内容をbuffの示す16バイトのバッファに読み出します。(MMC/SDカード専用)
MMC_GET_OCROCRレジスタの内容をbuffの示す4バイトのバッファに読み出します。(MMC/SDカード専用)
MMC_GET_SDSTATSD STATUSレジスタの内容をbuffの示す64バイトのバッファに読み出します。(SDカード専用)
ATA_GET_REVリビジョン コードをbuffの示す16バイトのバッファに読み出します。(ATA/CFカード専用)
ATA_GET_MODELモデル コードをbuffの示す40バイトのバッファに読み出します。(ATA/CFカード専用)
ATA_GET_SNシリアル番号をbuffの示す20バイトのバッファに読み出します。(ATA/CFカード専用)
ISDIO_READbuffの示すコマンド構造体に従いiSDIOレジスタからデータを読み出します。(FlashAir専用)
ISDIO_WRITEbuffの示すコマンド構造体に従いiSDIOレジスタにデータを書き込みます。(FlashAir専用)
ISDIO_MRITEbuffの示すコマンド構造体に従いiSDIOレジスタの一部のビットを書き換えます。(FlashAir専用)

対応情報

リード オンリー構成で、かつセクタ サイズ固定構成のときは、この関数は必要とされません。

戻る