ウォール クロックとリンク位置のレジスタ
HD オーディオ コントローラーには、HD オーディオ リンクのビット クロック レートでインクリメントされ、約 89 秒ごとにロールオーバーする 32 ビットの壁時計カウンター レジスタが含まれています。 ソフトウェアは、このカウンタを使用して、デバイスのハードウェアクロック間の相対ドリフトを測定することにより、2つ以上のコントローラデバイス間で同期します。
さらに、HD オーディオ コントローラーには、一連のリンク位置レジスタが含まれています。 各 DMA エンジンには、エンジンが HD オーディオ リンク経由で送信しているデータの現在の読み取りまたは書き込み位置を示すリンク位置レジスタがあります。 位置レジスタは、現在位置を循環バッファの先頭からのバイトオフセットとして表します:
レンダー ストリームでは、リンク位置レジスタは、DMA エンジンがリンク経由でコーデックに送信する次のバイトの循環バッファー オフセットを示します。
キャプチャ ストリームでは、リンク位置レジスタは、DMA エンジンがリンク上のコーデックから受信する次のバイトのサイクリック バッファー オフセットを示します。
循環バッファのオフセットは、単に周期バッファの先頭からの現在の読み取りまたは書き込み位置のオフセット(バイト単位)です。 バッファーの末尾に達すると、位置はバッファーの先頭に折り返され、循環バッファー オフセットは 0 にリセットされます。 循環バッファーは、システム メモリに常駐します。 詳細については、インテル HD オーディオ の ウェーブ サイトにあるインテル ハイ デフィニション オーディオ仕様を参照してください。
カーネル モード関数ドライバーは、壁時計とリンク位置レジスタを直接読み取ることができます。 直接アクセスを有効にするために、HD オーディオ バス ドライバーは、レジスタを含む物理メモリをシステム仮想メモリにマップします。 関数ドライバーは、 GetWallClockRegister又 GetLinkPositionRegister ルーチンを呼び出して、壁時計レジスタまたはリンク位置レジスタへのシステム仮想アドレス ポインターを取得します。 これら 2 つのルーチンは、HD オーディオ DDI の両方のバージョンで使用できます。
HD オーディオ コントローラー ハードウェアは、ウォール クロック レジスタとリンク位置レジスタを、コントローラー内の他のレジスタを含まないメモリ ページにミラーリングします。 したがって、ファンクション ドライバーがミラー化された壁時計または位置レジスタをユーザー モードにマップする場合、ユーザー モード プログラムはコントローラーの他のレジスタにアクセスできません。 ドライバーは、ユーザー モード プログラムがこれらの他のレジスタに触れてハードウェアをプログラムすることを許可しません。
レジスタのミラーリングは、ホストプロセッサのページサイズに対応する必要があります。 ホストプロセッサーアーキテクチャーに応じて、一般的なページサイズは 4,096 バイトまたは 8,192 バイトです。