次の方法で共有


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

このトピックでは、バージョン 2 以降の Kernel-Mode Driver Framework (KMDF) ドライバーまたは User-Mode Driver Framework (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 空間 (CmResourceTypePort、CmResourceTypeInterruptCmResourceTypeDma) 内のリソースをマップする必要はありません。

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

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