Panoramica del supporto del driver GPIO
A partire da Windows 8, l'estensione del framework GPIO (GpioClx) semplifica l'attività di scrittura di un driver per un dispositivo controller GPIO. GpioClx offre inoltre il supporto driver per i dispositivi periferici che si connettono ai pin GPIO. GpioClx, che è un'estensione fornita dal sistema al framework driver in modalità kernel (KMDF), esegue attività di elaborazione comuni ai membri della classe di dispositivo GPIO.
Questa panoramica illustra gli argomenti seguenti:
Driver del controller GPIO
I fornitori hardware forniscono driver per controllare i controller GPIO. Un driver controller GPIO è un driver kmDF che gestisce tutte le operazioni specifiche dell'hardware per un controller GPIO. Il driver del controller GPIO collabora con GpioClx per gestire le richieste di I/O per i gruppi di pin GPIO configurati come input dati e output dei dati. Inoltre, questo driver collabora con GpioClx per gestire le richieste di interruzione dai pin GPIO configurati come input di interruzione.
Un dispositivo controller GPIO include alcuni pin GPIO. Questi pin possono essere connessi fisicamente ai dispositivi periferici. I pin GPIO possono essere configurati come input dati, output di dati o input delle richieste di interruzione. In genere, un pin GPIO è dedicato a un dispositivo periferico e non condiviso da due o più dispositivi. Le connessioni tra i pin GPIO e i dispositivi periferici sono fissi e non possono essere modificate dall'utente ,ad esempio rimuovendo un dispositivo periferico e sostituendolo con un altro dispositivo. Pertanto, l'assegnazione di pin GPIO ai dispositivi periferici può essere descritta nel firmware della piattaforma.
Il diagramma seguente illustra il driver del controller GPIO e GpioClx.
Il driver del controller GPIO e GpioClx comunicano tra loro tramite l'interfaccia del dispositivo GpioClx (DDI). Il driver del controller GPIO chiama i metodi di supporto del driver implementati da GpioClx. GpioClx chiama funzioni di callback degli eventi implementate dal driver del controller GPIO.
Il driver del controller GPIO accede direttamente ai registri hardware del dispositivo controller GPIO.
GpioClx gestisce le richieste di I/O dai driver per i dispositivi periferici che si connettono fisicamente ai pin GPIO. GpioClx converte queste richieste di I/O in semplici operazioni hardware, eseguite chiamando le funzioni di callback degli eventi implementate dal driver del controller GPIO. Ad esempio, per leggere i dati da o scrivere dati in un set di pin GPIO, GpioClx chiama funzioni di callback degli eventi, ad esempio CLIENT_ReadGpioPins e CLIENT_WriteGpioPins. GpioClx gestisce le code di I/O per il controller GPIO e quindi elimina il driver del controller GPIO di questa attività.
GpioClx gestisce inoltre gli interruzioni primarie dal dispositivo controller GPIO e esegue il mapping di questi interruzioni a interruzioni secondarie, gestite dai driver di dispositivo periferici. Gli interruzioni primari sono interruzioni generate dai dispositivi hardware. Gli interruzioni secondarie vengono generati dal sistema operativo in risposta a determinati interruzioni primarie. Sia gli interruzioni primari che secondarie sono identificati da interruzioni di sistema globali (GSIs). Il firmware ACPI per la piattaforma hardware assegna gsi a interruzioni primarie e, in fase di esecuzione, il sistema operativo assegna gsi a interruzioni secondarie.
Ad esempio, il firmware assegna un GSI all'interruzione hardware dal controller GPIO e il sistema operativo assegna un GSI a un pin GPIO configurato come input di interruzione.
GpioClx implementa un ISR che gestisce gli interruzioni hardware generati dall'hardware dal dispositivo controller GPIO. Quando un dispositivo periferico asserisce un interruzione su un pin GPIO e gli interruzioni su questo pin sono abilitati e non mascherati, il controller GPIO interrompe il processore. In risposta, il gestore del trap del kernel pianifica l'esecuzione di GpioClx ISR. Per identificare il pin GPIO che ha causato l'interruzione, GpioClx ISR chiama la funzione di callback dell'evento CLIENT_QueryActiveInterrupts , implementata dal driver del controller GPIO. GpioClx ISR cerca quindi il GSI assegnato a questo pin e passa questo GSI al livello di astrazione hardware (HAL). Hal genera un interruzione secondario chiamando l'ISR registrato per questo GSI. Questo ISR appartiene al driver per il dispositivo periferico che originariamente ha affermato l'interruzione.
Per altre informazioni sugli interruzioni primari e secondari, vedere Interruzioni GPIO.
Driver per dispositivi periferici che usano pin GPIO
All'avvio, il gestore Plug and Play (PnP) enumera sia i dispositivi PnP che i dispositivi non PnP. Per i dispositivi non PnP con connessioni fisse ai pin GPIO, il gestore PnP esegue una query sul firmware della piattaforma per determinare quali pin GPIO vengono assegnati come risorse hardware gestite dal sistema a questi dispositivi.
Il driver KMDF per un dispositivo periferico riceve le risorse hardware assegnate durante un callback di EvtDevicePrepareHardware . Queste risorse possono includere pin GPIO configurati come output dei dati, input dati o input delle richieste di interruzione.
Una risorsa I/O GPIO è un nuovo tipo di risorsa Windows in Windows 8. Questa risorsa è costituita da un set di pin GPIO che possono essere usati come input dati o output dati. Se un driver di dispositivo periferico apre una risorsa I/O GPIO per le letture, il driver usa tutti i pin nella risorsa come input dati. Se un driver apre una risorsa I/O GPIO per le scritture, il driver usa tutti i pin nella risorsa come output dei dati. Per esempi di codice che mostrano come un driver di dispositivo periferico apre una connessione logica a un set di pin I/O GPIO, vedere gli argomenti seguenti:
Connessione di un driver KMDF ai pin di I/O GPIO
Un pin GPIO configurato come input di interruzione viene assegnato a un driver come risorsa di interruzione di Windows normale. L'astrazione della risorsa di interruzione nasconde il fatto che un interruzione potrebbe essere implementato da un pin GPIO anziché, ad esempio, un controller di interruzione programmabile. Pertanto, il driver può trattare una risorsa di interruzione basata su GPIO uguale a qualsiasi altra risorsa di interruzione.
Per accedere ai pin GPIO in una risorsa I/O GPIO, un driver di dispositivo periferico deve aprire una connessione logica ai pin. Un driver KMDF chiama il metodo WdfIoTargetOpen per aprire la connessione. Tramite questa connessione, il driver può inviare richieste di I/O ai pin GPIO. Il driver invia IOCTL_GPIO_READ_PINS richieste per leggere i dati da questi pin (se sono pin di input ) o IOCTL_GPIO_WRITE_PINS richieste di scrivere dati a loro (se sono pin di output).
Per ricevere interruzioni dal pin GPIO in una risorsa di interruzione, un driver del dispositivo periferico deve registrare la routine del servizio di interruzione (ISR) per ricevere interruzioni dalla risorsa di interruzione implementata dal pin. Un driver KMDF chiama il metodo WdfInterruptCreate per connettere un ISR all'interruzione.