次の方法で共有


ハードウェア リソースの検索とマッピング

このトピックでは、バージョン 2 以降のカーネルモード ドライバー フレームワーク (KMDF) ドライバーまたはユーザーモード ドライバー フレームワーク (UMDF) ドライバーが、EvtDevicePrepareHardware コールバック関数で受け取る変換されたメモリ リソース (CmResourceTypeMemory) をマップする方法について説明します。

UMDF 1.x ドライバーは、IPnpCallbackHardware2 ::OnPrepareHardware メソッドでこの種類のリソースを受け取ることもできます。 詳しくは、「UMDF 1.xドライバー でのハードウェア リソースの検索とマッピング」をご覧ください。

ドライバーは、EvtDevicePrepareHardware コールバック関数のデバイスのリソース一覧で、未加工および翻訳されたバージョンのハードウェア リソースを受け取ります。 ドライバーは、フレームワークがドライバーのEvtDeviceReleaseHardware コールバック関数を呼び出すまで有効なリソースリストを保存できます。

通常、ドライバーは、EvtDevicePrepareHardware コールバック関数から WdfCmResourceListGetCount を呼び出して、変換されたリソース リスト内のリソース記述子の数を決定し、ループ内で WdfCmResourceListGetDescriptor を呼び出して、メモリ マップされたレジスタ、I/O ポート、割り込みを識別します。

ドライバーに変換されたメモリ リソース (CmResourceTypeMemory) が割り当てられている場合は、デバイス レジスタにアクセスできるアドレスに物理アドレスをマップする必要があります。

KMDF ドライバーは、MmMapIoSpace を呼び出して、指定された物理アドレス範囲を非ページ システム空間にマップします。 次に、HAL ライブラリ ルーチンを使用してレジスタの読み取りと書き込みを行います。

UMDF ドライバーは WdfDeviceMapIoSpace を呼び出して、物理アドレスを擬似ベース アドレスにマップします。このアドレスは、WDF レジスタ/ポート アクセス関数と組み合わせて使用して、レジスタとポートの読み取りと書き込みに使用できます。

ドライバーは、EvtDeviceReleaseHardware コールバック関数から MmUnmapIoSpace または WdfDeviceUnmapIoSpace を呼び出してリソースのマップを解除します。

I/O 空間 (CmResourceTypePortCmResourceTypeInterruptCmResourceTypeDma) 内のリソースをマップする必要はありません。

UMDF ドライバーが WdfDeviceMapIoSpace を呼び出す場合は、UmdfDirectHardwareAccess INF ディレクティブを AllowDirectHardwareAccess に設定する必要があります。

ドライバーがメモリ マップされたレジスタ リソースを検索してマップする方法を示す例については、「デバイス レジスタの読み取りと書き込み」を参照してください。