Creazione di un oggetto Interrupt

Un driver WDF (Windows Driver Frameworks) che gestisce gli interrupt hardware di un dispositivo deve creare un oggetto interrupt del framework per ogni interruzione che ogni dispositivo può supportare. Nelle versioni framework 1.11 e successive in esecuzione in Windows 8 o versioni successive del sistema operativo, Kernel-Mode Driver Framework (KMDF) e i driver User-Mode Driver Framework (UMDF) possono creare oggetti interrupt che richiedono la gestione a livello passivo. A meno che non si stia scrivendo un driver per un sistema su una piattaforma Chip (SoC), tuttavia, il driver deve usare oggetti interrupt DIRQL.

Un driver crea in genere oggetti interrupt del framework nella relativa funzione di callback EvtDriverDeviceAdd . Un driver può anche creare oggetti interrupt dalla relativa funzione di callback EvtDevicePrepareHardware .

Il framework chiama la funzione di callback EvtDriverDeviceAdd del driver prima che il gestore di Plug and Play (PnP) abbia assegnato risorse di sistema, ad esempio vettori di interrupt, al dispositivo. Dopo che il gestore PnP assegna le risorse, il framework archivia le risorse di interrupt nell'oggetto interrupt del dispositivo. I driver che non supportano Plug and Play non possono usare oggetti interrupt.

Per creare un oggetto interrupt del framework, il driver deve inizializzare una struttura WDF_INTERRUPT_CONFIG e passarla al metodo WdfInterruptCreate .

UMDF supporta i tipi di interrupt seguenti:

  • Attivato a livello (condiviso o esclusivo)
  • Attivato da Edge (solo esclusivo)
  • MSI (esclusivo per definizione)

Nota UMDF non supporta interrupt attivati da edge condiviso .

A partire dalla versione 2.15 di UMDF, UMDF supporta gli interrupt per dispositivi semplici come i pulsanti di scelta hardware, in genere supportati dai pin GPIO, che non è possibile abilitare o disabilitare in modo esplicito usando registri hardware. Per supportare tali dispositivi, un driver UMDF deve usare interruzioni esclusive attivate da edge.

A partire da KMDF versione 1.15, KMDF supporta anche gli interrupt per tali dispositivi, senza la soluzione descritta in Gestione degli interrupt Active-Both.

Inoltre, in WDF_INTERRUPT_CONFIG, il driver fornisce puntatori alle funzioni di callback degli eventi fornite dal driver seguenti:

EvtInterruptEnable
Abilita un interrupt hardware.

EvtInterruptDisable
Disabilita un interrupt hardware.

EvtInterruptIsr
Interrupt service routine (ISR) per l'interrupt.

EvtInterruptDpc
Chiamata di procedura posticipata (DPC) per l'interrupt.

EvtInterruptWorkItem
Elemento di lavoro per un interrupt a livello passivo.

Per i driver che usano framework versione 1.11 o successiva in Windows 8 o versioni successive del sistema operativo, il driver può impostare in modo esplicito l'elemento padre di un oggetto interrupt del framework (DIRQL o passivo) su un oggetto dispositivo framework o su un oggetto coda del framework. Se il driver specifica un elemento padre, il driver deve impostare il membro AutomaticSerialization della struttura WDF_INTERRUPT_CONFIG dell'oggetto interrupt su TRUE. Tenere presente che se AutomaticSerialization è TRUE, il framework sincronizza l'esecuzione della funzione di callback EvtInterruptDpc o EvtInterruptWorkItem dell'oggetto interrupt con funzioni di callback di altri oggetti sottostanti l'oggetto padre dell'interrupt.

Ad esempio, un driver potrebbe specificare una coda come elemento padre di un interrupt per sincronizzare i callback della coda con il callback EvtInterruptDpc o EvtInterruptWorkItem dell'interrupt. In questa configurazione, il framework elimina l'oggetto coda quando elimina l'oggetto dispositivo.

Dopo aver chiamato WdfInterruptCreate, il driver può facoltativamente chiamare WdfInterruptSetPolicy o WdfInterruptSetExtendedPolicy per specificare parametri di interrupt aggiuntivi. In genere il driver chiama questi metodi dalla relativa funzione di callback EvtDriverDeviceAdd .

Il framework elimina automaticamente l'interrupt prima di eliminare l'elemento padre dell'interrupt. Facoltativamente, un driver può chiamare WdfObjectDelete per eliminare l'interrupt in un momento precedente.

Supporto di interrupt con segnalazione di messaggi

Le interruzioni segnalate dai messaggi sono supportate a partire da Windows Vista. Per consentire al sistema operativo di supportare gli msi per il dispositivo, il file INF del driver deve impostare alcuni valori nel Registro di sistema. Per informazioni su come impostare questi valori, vedere Abilitazione di interrupt Message-Signaled nel Registro di sistema.

Il driver deve creare un oggetto interrupt del framework per ogni vettore di interrupt o messaggio MSI che il dispositivo può supportare. Se il gestore PnP non concede al dispositivo tutte le risorse di interrupt che il dispositivo può supportare, gli oggetti interrupt aggiuntivi non verranno usati e le relative funzioni di callback non verranno chiamate.

In Windows 7 il sistema operativo non supporta le richieste di risorse per più di 910 messaggi di interruzione per ogni funzione del dispositivo. In Windows 8, il sistema operativo non supporta le richieste di risorse per più di 2048 interrupt per ogni funzione del dispositivo.

Se il driver di dispositivo supera questo limite, l'avvio del dispositivo potrebbe non riuscire. Per operare in un computer che contiene molti processori logici, il driver non deve richiedere più di un interrupt per processore.

Un driver deve tollerare, senza errori, il ribilanciamento del sistema delle risorse di interruzione in cui il gestore PnP assegna al dispositivo qualsiasi set di risorse di interrupt alternative dall'elenco dei requisiti delle risorse. Ad esempio, al dispositivo potrebbe essere assegnato un numero inferiore di interrupt di messaggio rispetto al driver richiesto. Nel peggiore dei casi, il driver deve essere preparato per operare il dispositivo con un solo interrupt basato su linea.