## 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 | `buff`の指す`WORD`型変数にドライブのセクタ・サイズを返します。有効値は512、1024、2048または4096です。セクタ・サイズ固定構成(`_MAX_SS ==_MIN_SS`)のときはこのコマンドは使われることはなく、常にそのセクタ・サイズで動作しなければなりません。
GET_BLOCK_SIZE | `buff`の指す`DWORD`型変数にフラッシュ・メモリの消去ブロック・サイズ(セクタ単位)を返します。1から32768の範囲で2の累乗の値でなければなりません。不明な場合またはフラッシュ・メモリ以外のメディアでは1を返します。`f_mkfs()`内でのみ使用され、ボリュームのデータ領域はこの境界にアライメントされます。
CTRL_ERASE_SECTOR | フラッシュ・メモリ上の領域の明示的消去。`buff`の指す`DWORD`型配列には消去する領域 {開始セクタ,終了セクタ} を指定して呼び出されます。`_USE_ERASE`が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_NOINIT`と`STA_NODISK`フラグはセットされます。
MMC_GET_TYPE | カード・タイプを示すフラグ(b0:MMCv3, b1:SDv1, b2:SDv2+, b3:LBA)を`buff`の示す`BYTE`変数に読み出します。(MMC/SDカード専用)
MMC_GET_CSD | CSDレジスタの内容を`buff`の示す16バイトのバッファに読み出します。(MMC/SDカード専用)
MMC_GET_CID | CIDレジスタの内容を`buff`の示す16バイトのバッファに読み出します。(MMC/SDカード専用)
MMC_GET_OCR | OCRレジスタの内容を`buff`の示す4バイトのバッファに読み出します。(MMC/SDカード専用)
MMC_GET_SDSTAT | SD 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カード専用)

#### 対応情報

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

戻る