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

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

16.5.2. 初期化

コントローラーへの電力とクロックが安定すると、コントローラーのアクティブLowリセットがアサートされます。リセットシーケンスでは、コントローラー内のレジスター、FIFOバッファーポインター、DMAインターフェイス・コントロール、およびステートマシンが初期化されます。
図 56. SD/MMCコントローラーの初期化シーケンス

パワーオンリセットのシーケンス

パワーオンリセット後に、ソフトウェアでは次の内容を実行する必要があります。
  1. カードへの電源を有効にする前に、電圧レギュレーターに対する電圧設定が正しいことを確認します。
  2. power enable (pwren) レジスターのpower enable (power_enable) ビットを1に設定し、カードへの電源を有効にします。次のステップに進む前に、電源のランプアップ時間を待機します。
  3. intmaskレジスターの適切なビットを0にリセットし、割り込みマスクを設定します。
  4. ctrlレジスターのint_enableビットを1に設定します。
    注: インテルでは、int_enableビットを1に設定する前に0xFFFFFFFFをrintstsレジスターに書き込み、保留中の割り込みをクリアすることを推奨しています。
  5. カードタイプに応じてカードスタックを検出します。検出には、SD/MMC/CE‑ATAの規格に従いクロック周波数を400kHzに制限する必要があります。詳細については、列挙されるカードスタックを参照してください。
  6. クロックソースの割り当てを設定します。カードの周波数は、コントローラーのclkdivレジスターとclksrcレジスターを使用して設定します。詳細は、クロックのセットアップを参照してください。
  7. 次の共通のレジスターとフィールドを初期化プロセス時に設定することができます。
    • tmoutレジスターのresponse timeout (response_timeout) フィールド。一般的な値は0x40です。
    • tmoutレジスターのdata timeout (data_timeout) フィールド。次のうちの最も大きいもの。
      • 10 * NAC

        NAC = カードデバイスの合計アクセス時間

        = 10 * ((TAAC * FOP) + (100 * NSAC))

        この式の内容は次のとおりです。

        TAAC = データアクセス時間の時間に依存する係数

        FOP = カードの動作に使用されるカードクロック周波数

        NSAC = データアクセス時間のワーストケースのクロックレートに依存する係数

      • ホストのFIFOバッファーのレイテンシー

        読み出しの場合: ホストがフルのFIFOバッファーから読み出しを開始するまでに経過した時間

        書き込みの場合: ホストが空のFIFOバッファーに書き込みを開始するまでに経過した時間

    • Debounce counter (debnce) レジスター。一般的なデバウンス値は25msです。
    • FIFO threshold watermark (fifoth) レジスターのTX watermark (tx_wmark) フィールド。一般的に、しきい値の値はFIFOバッファーの深さの半分である512に設定されます。
    • fifothレジスターのRX watermark (rx_wmark) フィールド。一般的に、しきい値の値は511に設定されます。

これらのレジスターは、SD/MMC/CE‑ATAコマンドごとに変更する必要はありません。これらのレジスターは、SD/MMC/CE‑ATAの仕様に応じて一般的な値に設定します。

列挙されるカードスタック

カードスタックは、次のタスクを実行します。
  • 接続されているカードを検出します
  • 接続されているカードのRelative Card Address (RCA) レジスターを設定します
  • カード固有の情報を読み出します
  • カード固有の情報をローカルに保存します

コントローラーに接続されるカードは、MMC、CE‑ATA、SD、またはSDIO (IO専用、MEM専用、コンボを含む) カードです。

接続されているカードタイプの識別

接続されているカードタイプを識別するには、次の検出シーケンスが必要です。
  1. ctypeレジスターで、1ビットまたは4ビットのカード幅 (card_width2) フィールド、および8ビットのカード幅 (card_width1) フィールドを0にリセットします。
  2. カードタイプをSD、MMC、SDIO、またはSDIO-COMBOとして識別します。
    1. SD/SDIO IO_SEND_OP_COND (CMD5) コマンドを引数0でカードに送信します。
    2. コントローラーでresp0を読み出します。IO_SEND_OP_CONDコマンドに対する応答は、カードがサポートする電圧を示します。
    3. 目的の電圧ウィンドウを引数で指定し、IO_SEND_OP_CONDコマンドを送信します。このコマンドにより、電圧ウィンドウが設定され、カードの初期化状態が終了します。
    4. resp0のビット27を確認します。
      • ビット27が0の場合、SDIOカードはIO専用です。その場合はステップ5に進みます。
      • ビット27が1の場合、カードのタイプはSDIOコンボです。以降の内容を引き続き行います。
  3. unresolvable-reference.html#izv1481130108739 に進みます。
  4. unresolvable-reference.html#bqr1481130110143 に進みます。
  5. この時点で、ソフトウェアはカードタイプをSD/SDHC、SDIOまたはSDIO-COMBOとして特定しています。次に、検出されたタイプに従いカードスタックを列挙する必要があります。
  6. カードのクロックソースの周波数を識別クロックレートの周波数である400KHzに設定します。次の検出コマンドシーケンスのいずれかを使用します。
    • SDカードまたはSDIOメモリーセクションの場合は、次のSD/SDIOコマンドシーケンスを送信します。
      • GO_IDLE_STATE
      • SEND_IF_COND
      • SD_SEND_OP_COND (ACMD41)
      • ALL_SEND_CID (CMD2)
      • SEND_RELATIVE_ADDR (CMD3)
    • SDIOカードの場合は、次のコマンドシーケンスを送信します。
      • IO_SEND_OP_COND
      • カウントの機能が有効な場合は、SEND_RELATIVE_ADDRコマンドを送信します。
    • MMCの場合は、次のコマンドシーケンスを送信します。
      • GO_IDLE_STATE
      • SEND_OP_COND (CMD1)
      • ALL_SEND_CID
      • SEND_RELATIVE_ADDR
  7. 検出後、clkdivレジスターに値を書き込み、カードのクロック周波数を変更します。この値は、sdmmc_clkクロックを分周します。

    次のリストは、さまざまなタイプのカードに対する一般的なクロック周波数を示しています。

    • SDメモリーカード: 25MHz
    • MMCカードデバイス: 12.5MHz
    • フルスピードSDIO: 25MHz
    • 低速SDIO: 400kHz

カードタイプがSDIOコンボの場合、または初期化中である場合

SDIOのカードタイプがコンボの場合、もしくは前出のIO_SEND_OP_CONDコマンドからの応答を受信していない場合にのみこの内容を行います。それ以外の場合は、接続されているカードタイプの識別のセクションのステップ5に進みます。

  1. SD/SDIO SEND_IF_COND (CMD8) コマンドを次の引数で送信します。
    • ビット [31:12] = 0x0 (予約済みビット)
    • ビット [11:8] = 0x1 (電源電圧値)
    • ビット [7:0] = 0xAA (SDIO Simplified Specification Version 2.00以降に準拠するSDメモリーカードで推奨される確認パターン)

    SD Associationのウェブサイトで説明されているSDIO Simplified Specification Version 2.00を参照してください。

    • 上のSEND_IF_CONDコマンドに対する応答を受信している場合、カードは、SD Specifications, Part 1, Physical Layer Simplified Specification Version 2.00に準拠するSD High-Capacityをサポートしています。
    • 応答を受信していない場合は、次の決定ステートメントに進みます。
  2. SD_SEND_OP_COND (ACMD41) コマンドを次の引数で送信します。
    • ビット [31] = 0x0 (予約済みビット)
    • ビット [30] = 0x1 (High Capacityステータス)
    • ビット [29:25] = 0x0 (予約済みビット)
    • ビット [24] = 0x1 (S18R ‑‑ 1.8Vの電圧切り替えをサポート)
    • ビット [23:0] = サポートされる電圧範囲
    • 上のSD_SEND_OP_CONDコマンドで応答を受信している場合、カードのタイプはSDHCです。それ以外の場合は、カードはMMCまたはCE-ATAです。いずれの場合も、以降のステップをスキップし、接続されているカードタイプの識別のセクションのステップ5に進みます。
    • 最初のSEND_IF_CONDコマンドで応答を受信していない場合、カードはHigh Capacity SD2.0をサポートしていません。その場合はステップ3に進みます。
  3. 次に、GO_IDLE_STATEコマンドを発行し、その後、SD_SEND_OP_CONDコマンドを次の引数で発行します。
    • ビット [31] = 0x0 (予約済みビット)
    • ビット [30] = 0x0 (High Capacityステータス)
    • ビット [29:24] = 0x0 (予約済みビット)
    • ビット [23:0] = サポートされる電圧範囲

    上のSD_SEND_OP_CONDコマンドに対して応答を受信している場合、カードはSDタイプです。それ以外の場合は、カードはMMCまたはCE-ATAです。

    注:
    最初のSD_SEND_OP_CONDコマンドの前にSEND_IF_CONDコマンドを発行し、High Capacity SDメモリーカードを初期化する必要があります。次のいずれかの条件に該当する場合、カードは、SD_SEND_OP_CONDコマンドに対する応答としてビジーを返します。
    • カードが内部初期化プロセスを実行している。
    • SD_SEND_OP_CONDコマンドの前にSEND_IF_CONDコマンドが発行されていない。
    • ACMD41コマンドが発行されている。大容量SDカードの場合、コマンド引数では、Host Capacity Support (HCS) ビットが0に設定されます。

カードがCE-ATA 1.1、CE-ATA 1.0、またはMMCデバイスであるかを特定

次のシーケンスを使用し、カードがCE-ATA 1.1、CE-ATA 1.0、またはMMCデバイスであるかを特定します。

ATAモードの選択を試みることで、カードがCE-ATA v1.1カードデバイスであるかを確認します。

  1. SD/SDIO SEND_IF_CONDコマンドを送信し、外部カードのEXT_CSDレジスターブロックのバイト504 (S_CMD_SET) を照会します。

    ビット4が1に設定されている場合、カードデバイスはATAモードをサポートします。

  2. SWITCH_FUNC (CMD6) コマンドを送信し、EXT_CSDレジスタースライス191 (CMD_SET) のATAビット (ビット4) を1に設定します。

    このコマンドにより、ATAモードが選択され、ATAコマンドセットがアクティブになります。

  3. 現在選択されているモードは、EXT_CSDレジスターのバイト191から読み戻すことにより確認することができます。
  4. 接続されているカードタイプの識別のセクションのステップ5に進みます。

    カードデバイスがATAモードをサポートしていない場合、カードはMMCカードまたはCE-ATA v1.0カードである可能性があります。次の内容に進み、カードがCE-ATA 1.0カードデバイスかMMCカードデバイスかを特定します。

RW_REGコマンドを送信し、カードがCE-ATA 1.0カードデバイスかMMCカードデバイスかを特定します。

応答を受信し、応答データにCE-ATA署名が含まれている場合、カードはCE-ATA 1.0カードデバイスです。そうでない場合は、カードはMMCカードデバイスです。

クロックのセットアップ

SD/MMCコントローラーの次のレジスターを使用すると、カードに必要なクロック周波数をソフトウェアで選択することができます。
  • clksrc
  • clkdiv
  • clkena

クロック更新コマンドを受信すると、コントローラーはこれらのレジスターをロードします。

カードのクロック周波数の変更

カードのクロック周波数を変更するには、次の手順を実行します。
  1. クロックを無効にする前に、それまでのデータコマンドによってカードがビジー状態ではないことを確認します。これを行うには、ステータスレジスター (status) のdata_busyビットが0であることを確認します。
  2. clkenaレジスターのcclk_enableビットを0にリセットし、 カードクロックの生成を無効にします。
  3. clksrcレジスターを0にリセットします。
  4. cmdレジスターの次のビットを1に設定します。
    • update_clk_regs_only - クロック更新コマンドを指定します
    • wait_prvdata_complete - 進行中のデータ転送が完了するまでクロック・パラメーターが変更されないようにします
    • start_cmd - コマンドを開始します
  5. start_cmdビットおよびupdate_clk_regs_onlyビットが0になるまで待機します。クロックの変更が完了しても、割り込みは発生しません。コマンドの完了時に、コントローラーはrintstsレジスターのcommand_doneビットを設定しません。別のコマンドがすでにキューにある場合、コントローラーはハードウェア・ロック・エラーを通知することがあります。その場合は、ステップ4に戻ります。

    ハードウェア・ロック・エラーについては、「割り込みとエラーの処理」の章を参照してください。

  6. クロック・マネージャーのペリフェラルPLLグループ (perpllgrp) のenableレジスターで、sdmmc_clk_enableビットを0にリセットします。
  7. システム・マネージャーのSDMMCコントローラー・グループ (sdmmcgrp) のControl (ctrl) レジスターで、drive clock phase shift select (drvsel) ビットおよびsample clock phase shift select (smplsel) ビットを設定し、必要な位相シフトの値を指定します。
  8. クロック・マネージャーのperpllgrpグループのEnableレジスターで、sdmmc_clk_enableビットを1に設定します。
  9. コントローラーのclkdivレジスターを、必要なクロック周波数に対する適切な分周器の値に設定します。
  10. clkenaレジスターのcclk_enableビットを1に設定し、カードクロックの生成を有効にします。

    また、clkenaレジスターを使用し、低電力モードを有効にすることができます。このモードでは、カードが8クロックサイクルを超えてアイドル状態の場合に、sdmmc_cclk_outクロックを自動的に停止します。

タイミングの調整

このセクションの内容は現在調整中です。