Condividi tramite


Interfacce di I/O GpioClx e interrupt

In genere, i client di un controller GPIO sono driver per i dispositivi periferici che si connettono ai pin GPIO. Questi driver usano i pin GPIO come canali dati a larghezza di banda bassa, output selezionati dal dispositivo e input di richiesta di interruzione. I driver di dispositivo periferici aprono connessioni logiche ai pin GPIO configurati come input dati o output. Usano queste connessioni per inviare richieste di I/O a questi pin. Inoltre, i driver di dispositivo periferici possono connettere logicamente le routine di servizio di interruzione ai pin GPIO configurati come input della richiesta di interruzione.

I pin GPIO sono risorse hardware gestite dal sistema. Prima che un driver di dispositivo periferico inizi il dispositivo, il gestore Plug and Play (PnP) assegna a questo driver un elenco di risorse hardware. Questo elenco di risorse hardware può includere quanto segue:

  • Risorsa di I/O GPIO. Questa risorsa è un set di pin GPIO configurati come input dati o output dati. Le risorse di I/O GPIO sono un nuovo tipo di risorsa Windows a partire da Windows 8.
  • Interruzione. Questa risorsa di interruzione può essere implementata come pin GPIO configurata come input di interruzione, ma potrebbe essere implementata invece da un controller di interruzione programmabile o come pin di interruzione dedicato in un pacchetto del processore. L'astrazione hardware layer (HAL) di interruzione nasconde questi dettagli di implementazione, che i driver client possono ignorare in modo sicuro.

Prima che un driver di dispositivo periferico possa usare un set di pin GPIO come input dati o output, il driver deve aprire una connessione logica a questi pin. Ad esempio, un driver in modalità kernel ottiene un handle WDFIOTARGET per identificare la connessione. Il driver usa questo handle per inviare richieste di I/O ai pin. In particolare, i driver client inviano IOCTL_GPIO_WRITE_PINS e IOCTL_GPIO_READ_PINS richieste di controllo I/O per scrivere dati nei pin di output e leggere i dati dai pin di input. Per esempi di codice che illustrano come connettersi a un set di pin I/O GPIO, vedere gli argomenti seguenti:

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

Per usare una risorsa di interruzione per ricevere gli interruzioni, un driver del dispositivo periferico deve connettere logicamente una routine del servizio di interruzione (ISR) all'interruzione. Ad esempio, un driver in modalità kernel può effettuare questa connessione chiamando il metodo WdfInterruptCreate o la routine IoConnectInterruptEx . Dopo la connessione, l'ISR del driver viene eseguito quando il dispositivo periferico segnala una richiesta di interruzione all'input del controller GPIO pin o interrupt. Per altre informazioni sugli interruzioni, vedere Creazione di un oggetto interrupt.

L'estensione del framework GPIO (GpioClx) gestisce le connessioni di I/O e le connessioni di interruzione per i driver di dispositivo periferici che sono i relativi client. Il gestore PnP potrebbe assegnare gruppi diversi di pin GPIO in un dispositivo controller GPIO a driver client diversi. Alcuni di questi pin sono configurati come input o output dei dati e alcuni sono configurati come input delle richieste di interruzione.

Quando i driver client ricevono richieste di interruzione o inviano richieste di I/O ai pin GPIO, GpioClx chiama le funzioni di callback degli eventi implementate dal driver del controller GPIO. Questi callback accedono ai registri hardware nel dispositivo controller GPIO. Tramite queste chiamate di funzione, GpioClx legge gli input dati, scrive in output dati e gestisce le richieste di interruzione (eseguendo query, abilitando, mascherando, cancellando e così via, i pin GPIO configurati come input di interruzione).

GpioClx esegue tutte le operazioni necessarie per gestire le connessioni di I/O e di interruzione aperte dai client. Il driver del controller GPIO, delegando la gestione di queste connessioni a GpioClx, è responsabile solo dell'attività relativamente semplice di accesso ai registri hardware nel dispositivo controller GPIO. Il driver del controller GPIO non deve conoscere il driver client per il quale viene effettuato un particolare accesso.