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

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

16.5.12.5. eMMCカードデバイスの代替ブート操作

次の図は、eMMCカードデバイスの代替ブート操作の実行に必要な一連の手順を示しています。詳細な手順については、フローチャートに従い説明します。
図 60. eMMCの代替ブート操作フロー
  1. ソフトウェア・ドライバーは次の内容を確認します。
    • eMMCカードデバイスが代替ブート操作をサポートしているか (eMMCカードでBOOT_INFOビットが1に設定されている)。
    • カードデバイスのBOOT_SIZE_MULTおよびBOOT_BUS_WIDTHの値。これは、ブートプロセス時に使用されます。
  2. ソフトウェアで次のビットを設定します。
    • intmaskレジスターの適切なビットを0にリセットし、割り込みのマスクを設定します。
    • ctrlレジスターのint_enableビットを1に設定します。ctrlレジスターの他のビットは0に設定する必要があります。
      注: インテルでは、rintstsレジスターおよびidstsレジスターに0xFFFFFFFFを書き込み、保留中の割り込みをクリアした後で、int_enableビットを設定することを推奨しています。内部DMAコントローラー・モードの場合、ソフトウェア・ドライバーでは、idintenレジスターの関連するフィールドすべてのマスクを解除する必要があります。
  3. 受信したブートデータの転送に、ソフトウェア・ドライバーで内部DMAコントローラーを使用する必要がある場合は、次の手順を実行する必要があります。
    • 内部DMAコントローラーの送信シーケンスおよび内部DMAコントローラーの受信シーケンスの説明に従い記述子を設定します。
    • ctrlレジスターのuse internal DMAC (use_internal_dmac) ビットを1に設定します。
  4. clkdivレジスターを使用してカードデバイスの周波数を400kHzに設定します。詳細は、クロックのセットアップを参照してください。カードクロックが動作していることを確認します。
  5. カード・インターフェイスで少なくとも74カード・クロック・サイクルが確実に発生するまで待機します。
  6. tmoutレジスターのdata_timeoutフィールドを、カードデバイスの合計アクセス時間 (NAC) に等しくなるように設定します。
  7. blksizレジスターを0x200 (512バイト) に設定します。
  8. bytcntレジスターを、カードデバイスのBOOT_SIZE_MULTの値で示されているとおりに、128Kバイトの倍数に設定します。
  9. fifothレジスターのrx_wmarkフィールドを設定します。しきい値の値は通常、512に設定することができます。これは、FIFOバッファー深さの半分です。
  10. cmdargレジスターを0xFFFFFFFAに設定します。
  11. cmdレジスターのフィールドを次のように設定し、コマンドを開始します。
    • start_cmd = 1
    • enable_boot = 1
    • expect_boot_ack
      • カードデバイスから開始の肯定応答パターンが想定される場合、expect_boot_ackを1に設定します。
      • カードデバイスから開始の肯定応答パターンが想定されない場合は、expect_boot_ackを0に設定します。
    • card_number = 0
    • data_expected = 1
    • cmd_index = 0
    • cmdレジスターの残りのビットを0に設定します。
  12. カードデバイスから開始の肯定応答パターンが想定されない (expect_boot_ackが0に設定されている) 場合は、ステップ15に進みます。
  13. Command Done割り込みを待機します。
  14. このステップでは、開始の肯定応答パターンが想定される (ステップ11expect_boot_ackが1に設定されている) 場合の手順を示します。
    1. コマンドの開始 (ステップ11) 後50ms以内にコントローラーからBoot ACK Received割り込みを受信しない場合は、開始パターンが受信されていません。ソフトウェア・ドライバーはブートプロセスを中止し、通常の検出から開始する必要があります。

      内部DMAコントローラー・モードがブートプロセスに使用されている場合、コントローラーは、Boot ACK Receivedのタイムアウト後に次のステップを行います。

      • DMA記述子が閉じられます。
      • idstsレジスターのcesビットが1に設定され、Boot ACK Receivedのタイムアウトを示します。
      • idstsレジスターのriビットは設定されません。
    2. Boot ACK Received割り込みを受信している場合、ソフトウェア・ドライバーは、これに1を書き込むことでこの割り込みをクリアする必要があります。

      Boot ACK Received割り込み後0.95秒以内に、Boot Data Start割り込みをコントローラーから受信する必要があります。これが発生しない場合、ソフトウェア・ドライバーはブートプロセスを中止し、通常の検出から開始する必要があります。

      内部DMAコントローラー・モードがブートプロセスに使用されている場合、コントローラーは、Boot ACK Receivedのタイムアウト後に次のステップを行います。

      • DMA記述子が閉じられます。
      • idstsレジスターのcesビットが1に設定され、Boot Data Startのタイムアウトを示します。
      • idstsレジスターのriビットは設定されません。
    3. Boot Data Start割り込みを受信している場合は、カードデバイスからブートデータを受信していることを示しています。DMAエンジンが内部DMAコントローラー・モードではない場合は、ソフトウェア・ドライバーはその後、rintstsレジスターのrxdr割り込みビットに基づき、コントローラーからのデータ読み出しを開始することができます。

      内部DMAコントローラー・モードの場合は、fifothレジスターのrx_wmarkフィールドで指定されているレベルに到達するとすぐに、DMAエンジンはFIFOバッファーからシステムメモリーへのデータ転送を開始します。

    4. ソフトウェア・ドライバーは、SD/SDIO GO_IDLE_STATEコマンドを送信するようにコントローラーに指示することで、ブートプロセスを終了する必要があります。
      • cmdargレジスターを0にリセットします。
      • cmdレジスターのstart_cmdビットを1に設定し、その他のビットはすべて0に設定します。
    5. カードからのブートデータの転送が正常に完了すると、次の割り込みが生成されます。
      • rintstsレジスターのcmdビットおよびdtoビット
      • idstsレジスターのriビット (内部DMAコントローラー・モードの場合のみ)
    6. ブート肯定応答パターン (0b010) でエラーが発生した場合、またはEBEが発生した場合
      • コントローラーは、Boot ACK Received割り込みを生成しません。
      • コントローラーはBoot Data Startを検出し、Boot Data Start割り込みを生成します。
      • コントローラーは、ブートデータの受信を続けます。
      • Boot Data Start割り込みを受信すると、アプリケーションはブートプロセスを中断する必要があります。
    7. 内部DMAコントローラー・モードの場合
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも多くの記述子を作成した場合、コントローラーでは余分な記述子を閉じません。
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも少ない記述子を作成した場合、コントローラーはDescriptor Unavailable割り込みを生成し、システムメモリーへのデータ転送をそれ以上行いません。
    8. データブロック転送の間でNACに違反している場合、DRTO割り込みがアサートされます。それ以外にも、スタートビットまたはエンドビットに関連するエラーがある場合は、SBEまたはEBE割り込みも生成されます。

    eMMCカードデバイスの代替ブート操作は完了しています。残りの手順 (15および16) は行わないでください。

  15. Command Done割り込みを待機します。
  16. このステップでは、開始の肯定応答パターンが想定されない (step 11expect_boot_ackが0に設定されている) 場合の手順について示します。
    1. コマンドの開始 (ステップ11) 後1秒以内にコントローラーからBoot Data Start割り込みを受信しない場合、ソフトウェア・ドライバーはブートプロセスを中止し、通常の検出から開始する必要があります。 内部DMAコントローラー・モードの場合は、次の内容が行われます。
      • DMA記述子が閉じられます。
      • idstsレジスターのcesビットが1に設定され、Boot Data Startのタイムアウトを示します。
      • idstsレジスターのriビットは設定されません。
    2. Boot Data Start割り込みを受信している場合は、ブートデータをカードデバイスから受信しています。DMAエンジンが内部DMAコントローラー・モードではない場合は、ソフトウェア・ドライバーはその後、rintstsレジスターのrxdr割り込みビットに基づき、コントローラーからのデータの読み出しを開始することができます。

      内部DMAコントローラー・モードの場合は、fifothレジスターのrx_wmarkフィールドで指定されているレベルに到達するとすぐに、DMAエンジンはFIFOバッファーからシステムメモリーへのデータ転送を開始します。

    3. ソフトウェア・ドライバーは、SD/SDIO GO_IDLE_STATE (CMD0) コマンドを送信するようにコントローラーに指示することで、ブートプロセスを終了する必要があります。
      • cmdargレジスターを0にリセットします。
      • cmdレジスターのstart_cmdビットを1に設定し、その他のビットはすべて0に設定します。
    4. カードからのブートデータの転送が正常に完了すると、次の割り込みが生成されます。
      • rintstsレジスターのcmdビットおよびdtoビット
      • idstsレジスターのriビット (内部DMAコントローラー・モードの場合のみ)
    5. 内部DMAコントローラー・モードの場合
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも多くの記述子を作成した場合、コントローラーでは余分な記述子を閉じません。
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも少ない記述子を作成した場合、コントローラーはDescriptor Unavailable割り込みを生成し、システムメモリーへのデータ転送をそれ以上行いません。

eMMCカードデバイスの代替ブート操作は完了しています。