## disk_read

ストレージ・デバイスからデータを読み出します。

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

#### 引数

pdrv
  対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。
buff
  ストレージ・デバイスから読み出したデータを格納するバイト配列が指定されます。
sector
  読み出しを開始するセクタ番号。LBAで指定されます。
count
  読み出すセクタ数。FatFsからの呼び出しでは1〜128の範囲に限られます。

#### 戻り値

RES_OK (0)
  正常終了。
RES_ERROR
  読み込み中にエラーが発生し、その回復にも失敗した。
RES_PARERR
  パラメータが不正。
RES_NOTRDY
  ドライブが動作可能状態ではない（初期化されていない）。

#### 解説

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

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

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

戻る