Condividi tramite


Panoramica del supporto dei 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 dei driver per i dispositivi periferici che si connettono ai pin GPIO. GpioClx, che è un'estensione fornita a livello di sistema al framework del driver in modalità kernel (KMDF), esegue attività di elaborazione comuni ai membri della classe di dispositivo GPIO.

Questa panoramica illustra gli articoli seguenti:

Driver del controller GPIO

I fornitori di 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 di dati e output di dati. Inoltre, questo driver collabora con GpioClx per gestire le richieste di interruzione dai pin GPIO configurati come ingressi di interruzione.

Un dispositivo controller GPIO ha un certo numero di pin GPIO. Questi pin possono essere collegati fisicamente ai dispositivi periferici. I pin GPIO possono essere configurati come ingressi di dati, uscite di dati o ingressi di richiesta di interrupt. 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 fisse e non possono essere modificate dall'utente ,ad esempio rimuovendo un dispositivo periferico e sostituendolo con un altro dispositivo. Di conseguenza, 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.

diagramma a blocchi dei componenti gpio.

Il driver del controller GPIO e GpioClx comunicano tra loro tramite l'interfaccia DDI (Device-Driver Interface) GpioClx. Il driver del controller GPIO chiama i metodi di supporto driver , implementati da GpioClx. GpioClx chiama le funzioni di callback dell'evento , 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, che esegue chiamando le funzioni di callback degli eventi implementate dal driver del controller GPIO. Ad esempio, per leggere 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 solleva il driver del controller GPIO da questo compito.

GpioClx gestisce inoltre gli interrupt primari dal dispositivo controller GPIO ed esegue il mapping di questi interrupt a interrupt secondari, gestiti dai driver di dispositivo periferici. Gli interrupt primari sono interrupt generati dai dispositivi hardware. Gli interrupt secondari vengono generati dal sistema operativo in risposta a determinati interrupt primari. Gli interrupt primari e secondari sono identificati dai global system interrupts (GSI). Il firmware ACPI per la piattaforma hardware assegna i GSI agli interrupt primari e, in fase di esecuzione, il sistema operativo assegna i GSI agli interrupt secondari.

Ad esempio, il firmware assegna un GSI all'interrupt hardware dal controller GPIO e il sistema operativo assegna un GSI a un pin del GPIO configurato come interruzione in ingresso.

GpioClx implementa un ISR che gestisce le interruzioni primarie generate dall'hardware del dispositivo controller GPIO. Quando un dispositivo periferico genera un interrupt su un pin GPIO e gli interrupt su questo pin sono attivi e non filtrati, il controller GPIO interrompe il processore. In risposta, il gestore trap del kernel programma l'esecuzione di GpioClx ISR. Per identificare il pin GPIO che ha causato l'interrupt, GpioClx ISR chiama la funzione di callback dell'evento CLIENT_QueryActiveInterrupts, implementata dal driver del controller GPIO. GpioClx ISR cerca quindi l'GSI assegnato a questo pin e passa questo GSI al livello di astrazione hardware (HAL). HAL genera un interrupt secondario chiamando l'ISR registrato per questo GSI. Questo ISR appartiene al driver del dispositivo periferico che ha originariamente generato l'interrupt.

Per altre informazioni sugli interrupt primari e secondari, vedere interrupt 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 EvtDevicePrepareHardware callback. Queste risorse possono includere pin GPIO configurati come uscite dati, ingressi dati o richieste di interrupt.

Una risorsa GPIO I/O è un nuovo tipo di risorsa di Windows a partire da Windows 8. Questa risorsa è costituita da un insieme di uno o più pin GPIO che possono essere utilizzati come ingressi o uscite 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 di dati. Se un driver apre una risorsa I/O GPIO per le scritture, il driver utilizza tutti i pin nella risorsa come uscite dati. Per esempi di codice che illustrano come un driver di dispositivo periferico apre una connessione logica a un set di pin di I/O GPIO, vedere gli argomenti seguenti:

Connessione di un driver KMDF ai pin di I/O GPIO

Un pin GPIO configurato come ingresso di interrupt viene assegnato a un driver come una risorsa interrupt standard di Windows. L'astrazione della risorsa interrupt occulta il fatto che un interrupt potrebbe essere implementato tramite un pin GPIO anziché, ad esempio, mediante un controller di interrupt programmabile. Di conseguenza, il driver può trattare una risorsa di interrupt basata su GPIO allo stesso modo di qualsiasi altra risorsa di interrupt.

Per accedere ai pin GPIO in una risorsa di I/O GPIO, un driver 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 di lettura dei dati da questi pin (se sono pin di input) o IOCTL_GPIO_WRITE_PINS richieste di scrittura dei dati (se sono pin di output).

Per ricevere gli interrupt dal pin GPIO in una risorsa interrupt, un driver del dispositivo periferico deve registrare la routine di servizio degli interrupt (ISR) per ricevere segnali dalla risorsa di interrupt implementata da questo pin. Un driver KMDF chiama il metodo WdfInterruptCreate per connettere un ISR all'interrupt.