Поделиться через


Поиск и сопоставление аппаратных ресурсов

В этой теме описывается, как драйвер на основе Kernel-Mode Driver Framework (KMDF) или драйвер на основе User-Mode Driver Framework (UMDF), начиная с версии 2, сопоставляет преобразованный ресурс памяти (CmResourceTypeMemory), который он получает в функции обратного вызова EvtDevicePrepareHardware.

Драйвер UMDF 1.x также может получить этот тип ресурса в своем методе IPnpCallbackHardware2::OnPrepareHardware. Дополнительные сведения см. в разделе Поиск и сопоставление аппаратных ресурсов в драйверах UMDF 1.x.

Драйвер получает необработанные и переведенные версии аппаратных ресурсов и в списке ресурсов устройства в функции обратного вызова EvtDevicePrepareHardware. Драйвер может сохранить список ресурсов, который действителен, пока платформа не вызовет функцию обратного вызова драйвера EvtDeviceReleaseHardware.

Как правило, драйвер вызывает WdfCmResourceListGetCount из функции обратного вызова EvtDevicePrepareHardware, чтобы определить количество дескрипторов ресурсов в переведённом списке ресурсов, а затем вызывает WdfCmResourceListGetDescriptor в цикле для идентификации сопоставленных в памяти регистров, портов ввода-вывода и прерываний.

Если драйвер назначается преобразованный ресурс памяти (CmResourceTypeMemory), он должен сопоставить физический адрес с адресом, с помощью которого он может получить доступ к регистрам устройств.

Драйвер KMDF вызывает MmMapIoSpace для отображения заданного диапазона физических адресов в некэшированное системное пространство. Затем она использует подпрограммы библиотеки HAL для чтения и записи в регистры.

Драйвер UMDF вызывает WdfDeviceMapIoSpace для сопоставления физического адреса с псевдобазовым адресом, который он может использовать в сочетании с функциями доступа к регистрам и портам WDF для чтения и записи в регистры и порты.

Драйвер распаковывает ресурсы, вызывая MmUnmapIoSpace или WdfDeviceUnmapIoSpace из функции обратного вызова EvtDeviceReleaseHardware.

Вам не нужно сопоставлять ресурсы в пространстве ввода-вывода (CmResourceTypePort, CmResourceTypeInterrupt, CmResourceTypeDma).

Если драйвер UMDF вызывает WdfDeviceMapIoSpace, необходимо задать директиву INF UmdfDirectHardwareAccess для AllowDirectHardwareAccess.

Для примера, показывающего, как драйвер находит и сопоставляет ресурсы регистров, сопоставленных с памятью, см. статью Чтение и запись в регистры устройств.