Создание объекта прерывания

Драйвер Windows Driver Frameworks (WDF), обрабатывающий аппаратные прерывания устройства, должен создать объект прерывания платформы для каждого прерывания, которое может поддерживать каждое устройство. В платформах версии 1.11 и более поздних версий, работающих в Windows 8 или более поздних версиях операционной системы, драйверы Kernel-Mode Driver Framework (KMDF) и User-Mode Driver Framework (UMDF) могут создавать объекты прерываний, требующие обработки на пассивном уровне. Однако, если вы не пишете драйвер для системы на платформе Chip (SoC), драйвер должен использовать объекты прерываний DIRQL.

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

Платформа вызывает функцию обратного вызова EvtDriverDeviceAdd драйвера до того, как диспетчер Plug and Play (PnP) назначил системные ресурсы, такие как векторы прерываний, устройству. После назначения ресурсов диспетчером PnP платформа сохраняет ресурсы прерываний в объекте прерывания устройства. (Драйверы, не поддерживающие Plug and Play, не могут использовать объекты прерываний.)

Чтобы создать объект прерывания платформы, драйвер должен инициализировать структуру WDF_INTERRUPT_CONFIG и передать ее в метод WdfInterruptCreate .

UMDF поддерживает следующие типы прерываний:

  • Уровень активации (общий или эксклюзивный)
  • С активацией edge (только эксклюзивные)
  • MSI (эксклюзивный по определению)

Примечание UMDF не поддерживает прерывания, активированные общими пограничными устройствами.

Начиная с версии UMDF 2.15, UMDF поддерживает прерывания для простых устройств, таких как аппаратные кнопки, обычно поддерживаемые контактами GPIO, которые нельзя явно включить или отключить с помощью аппаратных регистров. Для поддержки таких устройств драйвер UMDF должен использовать монопольные прерывания, активированные по краям.

Начиная с KMDF версии 1.15, KMDF также поддерживает прерывания для таких устройств без обходного решения, описанного в разделе Обработка прерываний Active-Both.

Кроме того, в WDF_INTERRUPT_CONFIG драйвер предоставляет указатели на следующие функции обратного вызова событий, предоставляемые драйвером:

EvtInterruptEnable
Включает аппаратное прерывание.

EvtInterruptDisable
Отключает аппаратное прерывание.

EvtInterruptIsr
Подпрограмма службы прерываний (ISR) для прерывания.

EvtInterruptDpc
Отложенный вызов процедуры (DPC) для прерывания.

EvtInterruptWorkItem
Рабочий элемент для прерывания пассивного уровня.

Для драйверов, использующих платформу версии 1.11 или более поздней в Windows 8 или более поздних версиях операционной системы, драйвер может явно задать родительский объект прерывания платформы (DIRQL или пассивный) либо объект устройства платформы, либо объект очереди платформы. Если драйвер указывает родительский объект, драйвер должен задать для элемента AutomaticSerialization структуры WDF_INTERRUPT_CONFIG объекта прерывания значение TRUE. (Напомним, что если automaticSerialization имеет значение TRUE, платформа синхронизирует выполнение функции обратного вызова EvtInterruptDpc или EvtInterruptWorkItem объекта прерывания с функциями обратного вызова из других объектов, которые находятся под родительским объектом прерывания.)

Например, драйвер может указать очередь в качестве родительского элемента прерывания для синхронизации обратных вызовов очереди с обратным вызовом EvtInterruptDpc или EvtInterruptWorkItem . В этой конфигурации платформа удаляет объект очереди при удалении объекта устройства.

После вызова WdfInterruptCreate драйвер может при необходимости вызвать WdfInterruptSetPolicy или WdfInterruptSetExtendedPolicy , чтобы указать дополнительные параметры прерывания. Как правило, драйвер вызывает эти методы из функции обратного вызова EvtDriverDeviceAdd .

Платформа автоматически удаляет прерывание перед удалением родительского элемента прерывания. При необходимости драйвер может вызвать WdfObjectDelete , чтобы удалить прерывание в более раннее время.

Поддержка прерываний с сигналом сообщения

Прерывания с сигналом сообщения (MSIs) поддерживаются, начиная с Windows Vista. Чтобы операционная система поддерживала MSIs для вашего устройства, в INF-файле драйвера должны быть заданы некоторые значения в реестре. Сведения о том, как задать эти значения, см. в разделе Включение прерываний Message-Signaled в реестре.

Драйвер должен создать объект прерывания платформы для каждого вектора прерывания или сообщения MSI, которое может поддерживать устройство. Если диспетчер PnP не предоставляет устройству все ресурсы прерываний, которые может поддерживать устройство, дополнительные объекты прерываний не будут использоваться и их функции обратного вызова не будут вызываться.

В Windows 7 операционная система не поддерживает запросы ресурсов для более чем 910 сообщений прерываний для каждой функции устройства. В Windows 8 операционная система не поддерживает запросы ресурсов для более чем 2048 прерываний для каждой функции устройства.

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

Драйвер должен без сбоев перебалансировать ресурсы прерывания системы, в которых диспетчер PnP назначает устройству любой набор альтернативных ресурсов прерывания из списка требований к ресурсам. Например, устройству может быть назначено меньшее количество прерываний сообщений, чем запрошено драйвером. В худшем случае драйвер должен быть готов к работе с устройством только с одним прерыванием на основе строки.