## 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`関数でセクタ サイズを問い合わせてくるので、それに対して正しい値を返す必要があります。

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

- この関数内で解決する - 推奨
- 全ての`f_read()`において、セクタ全体を含む転送を避ける - 直接転送が発生しない
- `f_read(fp, data, btr, &br)`において、`(((UINT)data & 3) == (f_tell(fp) & 3))`を満足させる - 直接転送での`buff`のワード アライメントが保証される

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

戻る