disk_read

ストレージ デバイスからデータを読み出すときに呼ばれます。

DRESULT disk_read (
  BYTE pdrv,     /* [IN] 物理ドライブ番号 */
  BYTE* buff,    /* [OUT] 読み出しバッファへのポインタ */
  DWORD sector,  /* [IN] 読み出し開始セクタ番号 */
  UINT count     /* [IN] 読み出すセクタ数 */
);

引数

pdrv
対象のデバイスを識別する物理ドライブ番号(0-9)が指定されます。シングル ドライブ システムでは、常に0が指定されます。
buff
ストレージ デバイスから読み出したデータを格納するバイト配列が指定されます。
sector
読み出しを開始するセクタ番号。32ビットLBAで指定されます。
count
読み出すセクタ数(1以上の値)が指定されます。

戻り値

RES_OK (0)
正常終了。
RES_ERROR
回復不能なエラーにより、読み出し操作を完了できなかった。
RES_PARERR
パラメータが不正。
RES_NOTRDY
ストレージ デバイスが動作可能な状態ではない (初期化されていない)。

解説

ストレージ デバイスに対するデータの読み書きは、セクタ単位で行われます。FatFsでは512~4096バイトのセクタ サイズをサポートします。固定セクタ サイズ構成(_MIN_SS == MAX_SS)のときは、暗黙的にそのセクタ サイズで動作しなければなりません。可変セクタ サイズ構成(_MIN_SS < MAX_SS)のときは、disk_initialize関数に続いてdisk_ioctl関数でセクタ サイズを問い合わせてくるので、それに対して正しい値を返す必要があります。

buffBYTE型なので、指定されるアドレスは常にワード アライメントされているとは限りません。非アライメント アドレスへの転送は、直接転送において発生することがあります。もしも、ハードウェア上の制約でそのような転送が不可能なときは、この関数内で二段転送するなどして解決するか、または別の方法で対応しなければなりません。次にいくつかの対応方法を示します(いずれか一つでOK)。

一般的に、複数セクタの転送要求は、ストレージ デバイスに対して可能な限りマルチ セクタ転送しなければなりません。複数のシングル セクタ読み出しに分解された場合、スループットが低下することがあります。

戻る