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

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

16.5.12.2. eMMCカードデバイスのブート操作

次の図は、eMMCカードデバイスのブートプロセスを実行する手順を示しています。手順の詳細については、フローチャートに従い説明します。
図 59. eMMCのブート操作フロー
  1. ソフトウェア・ドライバーは次の内容を確認します。
    • eMMCカードデバイスがブート操作をサポートしているか (eMMCカードのEXT_CSDレジスターでBOOT_PARTITION_ENABLEビットが1に設定されている)。
    • EXT_CSDレジスターの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ビットを1に設定します。
  4. clkdivレジスターを使用してカードデバイスの周波数を400kHzに設定します。詳細は、クロックのセットアップを参照してください。
  5. tmoutレジスターのdata_timeoutフィールドを、カードデバイスの合計アクセス時間 (NAC) に等しくなるように設定します。
  6. blksizレジスターを0x200 (512バイト) に設定します。
  7. bytcntレジスターを、カードデバイスのBOOT_SIZE_MULTの値で示されているとおりに、128KBの倍数に設定します。
  8. fifothレジスターのrx_wmarkフィールドを設定します。しきい値の値は通常、512に設定することができます。これは、FIFOバッファー深さの半分です。
  9. cmdレジスターのフィールドを次のように設定します。
    • start_cmd = 1に設定し、コマンドを開始します。
    • Enable boot (enable_boot) = 1
    • Expect boot acknowledge (expect_boot_ack)
      • カードデバイスから開始の肯定応答パターンが想定される場合、expect_boot_ackを1に設定します。
      • カードデバイスから開始の肯定応答パターンが想定されない場合は、expect_boot_ackを0に設定します。
    • Card number (card_number) = 0
    • data_expected = 1
    • cmdレジスターの残りのビットを0にリセットします。
  10. カードデバイスから開始の肯定応答パターンが想定されない (expect_boot_ackが0に設定されている) 場合は、ステップ12に進みます。
  11. このステップでは、開始の肯定応答パターンが想定される (ステップ9expect_boot_ackが1に設定されている) 場合の処理を示しています。
    1. コマンドの開始 (ステップ9) 後50ms以内にコントローラーからBoot ACK Received割り込みを受信しない場合、ソフトウェア・ドライバーは次のcmdレジスターフィールドを設定する必要があります。
      • start_cmd = 1
      • Disable boot (disable_boot) = 1
      • card_number = 0
      • その他のすべてのフィールド = 0

      コントローラーは、カード・インターフェイスのCMDピンをデアサート後、Command Done割り込みを生成します。

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

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

      Boot ACK Received割り込み後0.95秒以内に、Boot Data Start割り込みをコントローラーから受信する必要があります。これが発生しない場合、ソフトウェア・ドライバーでは次のcmdレジスターフィールドを書き込む必要があります。

      • start_cmd = 1
      • disable_boot = 1
      • card_number = 0
      • その他のすべてのフィールド = 0

      コントローラーは、カード・インターフェイスのCMDピンをデアサート後、Command Done割り込みを生成します。

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

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

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

      カードからのブートデータ転送が正常に完了すると、次の割り込みが生成されます。

      • rintstsレジスターのcmdビットおよびdtoビット
      • idstsレジスターのriビット (内部DMAコントローラー・モードの場合のみ)
    4. ブート肯定応答パターン (0b010) でエラーが発生した場合、またはEBEが発生した場合
      • コントローラーは、CMDラインをHighに引き上げブートプロセスを自動的に中断します。
      • コントローラーは、Command Done割り込みを生成します。
      • コントローラーは、Boot ACK Received割り込みを生成しません。
      • アプリケーションはブート転送を中断します。
    5. 内部DMAコントローラー・モードの場合
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも多くの記述子を作成した場合、コントローラーでは余分な記述子を閉じません。ソフトウェアでは、記述子が閉じられるまでそれらを再度使用することができません。
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも少ない記述子を作成した場合、コントローラーはDescriptor Unavailable割り込みを生成し、システムメモリーへのデータ転送をそれ以上行いません。
    6. データブロック転送の間でNACに違反している場合、DRTO割り込みがアサートされます。さらに、スタートビットもしくはエンドビットに関連するエラーがある場合は、SBEまたはEBE割り込みも生成されます。

    eMMCカードデバイスのブート操作は完了しています。残りの手順 (ステップ12) は行わないでください。

  12. このステップでは、開始の肯定応答パターンが想定されない (ステップ9expect_boot_ackが0に設定されている) 場合の手順について示します。
    1. コマンドの開始 (ステップ9) 後1秒以内にコントローラーからBoot Data Start割り込みを受信しない場合、ソフトウェア・ドライバーは、cmdレジスターのフィールドを次のように書き込む必要があります。
      • start_cmd = 1
      • disable_boot = 1
      • card_number = 0
      • その他のすべてのフィールド = 0

      カードのCMDラインをデアサート後、コントローラーはCommand Done割り込みを生成します。内部DMAコントローラー・モードの場合は、記述子が閉じられ、idstsレジスターのcesビットが1に設定されます。これは、Boot Data Startのタイムアウトを示しています。

    2. Boot Data Start割り込みを受信している場合は、カードデバイスからブートデータを受信していることを示しています。DMAエンジンが内部DMAコントローラー・モードではない場合は、ソフトウェア・ドライバーはその後、rintstsレジスターのrxdr割り込みビットに基づき、コントローラーからのデータ読み出しを開始することができます。

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

      カードからのブートデータ転送が正常に完了すると、次の割り込みが生成されます。

      • rintstsレジスターのcmdビットおよびdtoビット
      • idstsレジスターのriビット (内部DMAコントローラー・モードの場合のみ)
    3. 内部DMAコントローラー・モードの場合
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも多くの記述子を作成した場合、コントローラーでは余分な記述子を閉じません。
      • ソフトウェア・ドライバーが、受信したブートデータに必要な記述子よりも少ない記述子を作成した場合、コントローラーはDescriptor Unavailable割り込みを生成し、システムメモリーへのデータ転送をそれ以上行いません。

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