インテル® Agilex™ ハード・プロセッサー・システムのテクニカル・リファレンス・マニュアル

ID 683567
日付 1/19/2023
Public
ドキュメント目次

16.5.5.4. 単一ブロックまたは複数ブロックの読み出し

単一ブロックまたは複数ブロックの読み出しを実装するには、ソフトウェアで次の手順を実行します。
  1. データサイズをバイト単位でbytcntレジスターに書き込みます。複数ブロックの読み出しの場合は、bytcntをブロックサイズの倍数にする必要があります。
  2. ブロックサイズをバイト単位でblksizレジスターに書き込みます。コントローラーは、blksizのサイズのブロックでカードからデータが返されることを想定します。
  3. カードの遅延を含む読み出し往復遅延がsdmmc_clk_dividedの半分よりも大きい場合は、card threshold control (cardthrctl) レジスターに書き込み、データブロックがカードからホストに転送されている途中でカードクロックが停止しないようにします。詳細については、カードの読み出ししきい値を参照してください。
    注: card read threshold enable (cardrdthren) ビットが0の場合、ホストシステムでは、データがFIFOバッファーに書き込まれる速度よりも速い速度でRX FIFOバッファーが読み出されるようにすることで、読み出しデータ転送中にRX FIFOバッファーがフルにならないことを保証する必要があります。これに従わない場合は、オーバーフローが発生する可能性があります。
  4. 読み出すデータの開始データアドレスでcmdargレジスターを書き込みます。
  5. 単一ブロックおよび複数ブロックの読み出しに向けたcmdレジスターの設定に記載されているパラメーターでcmdレジスターを書き込みます。SDカードおよびMMCカードの場合、単一ブロックの読み出しにはSD/SDIO READ_SINGLE_BLOCK (CMD17) コマンドを使用し、複数ブロックの読み出しにはREAD_MULTIPLE_BLOCK (CMD18) コマンドを使用します。SDIOカードの場合は、IO_RW_EXTENDED (CMD53) コマンドを単一ブロック転送および複数ブロック転送の両方に使用します。次の図に、CMD53のコマンド引数を示します。cmdレジスターに書き込むと、コントローラーはコマンドの実行を開始します。コマンドがバスに送信されると、Command Done割り込みが生成されます。
  6. ソフトウェアでは、rintstsレジスターのdcrcbdssbe、およびebeビットで報告されるデータエラーの割り込みを確認する必要があります。必要に応じて、ソフトウェアでSD/SDIO STOPコマンドを送信し、データ転送を終了させることができます。
  7. ソフトウェアでは、rintstsレジスターのホストのタイムアウト条件を確認する必要があります。
    • 受信FIFOバッファーデータ要求
    • ホストによるデータのスタベーション - ホストがカードからのデータに対して十分な速度でFIFOバッファーからの読み出しを行っていません。この状態を是正するには、ソフトウェアで次の手順を実行する必要があります。
      • statusレジスターのfifo_countフィールドを読み出します。
      • 対応する量のデータをFIFOバッファーから読み出します。

    どちらの場合も、ソフトウェアでFIFOバッファーからデータを読み出し、データを受信するためのスペースをFIFOバッファーに作る必要があります。

  8. DTO割り込みを受信すると、ソフトウェアはFIFOバッファーから残りのデータを読み出す必要があります。
図 57. IO_RW_EXTENDED (CMD53) のコマンド引数