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


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

В этом разделе описывается, как драйвер 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 register/Port Access для чтения и записи в регистры и порты.

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

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

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

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