risorse hardware GPIO-Based
A partire da Windows 8, i pin di I/O (GPIO) per utilizzo generico controllati da un driver controller GPIO sono disponibili per altri driver come risorse hardware gestite dal sistema. I pin di I/O GPIO, che sono pin configurati come input dati o output di dati, sono disponibili come nuovo tipo di risorsa Windows, risorse I/O GPIO. Inoltre, i pin di interruzione GPIO, che sono pin configurati come input di richiesta di interruzione, sono disponibili come risorse di interruzione di Windows normali.
Una risorsa GPIO I/O rappresenta un set di pin GPIO a cui il driver per un dispositivo periferico può leggere o scrivere. Windows nasconde i dettagli sull'implementazione sottostante dei pin di I/O GPIO in modo che i driver di dispositivo periferici possano essere scritti per modificare le risorse di I/O GPIO astratte. I driver di dispositivo periferici che usano queste risorse astratte possono funzionare tra piattaforme indipendentemente dall'hardware del controller GPIO che implementa le risorse. Una risorsa GPIO I/O è rappresentata da un handle WDFIOTARGET che associa questa risorsa al driver del controller GPIO specifico proprietario del pin o dei pin GPIO sottostanti.
In genere, un pin di I/O su un controller GPIO può essere configurato per l'input o per l'output, a seconda delle funzionalità dell'hardware del controller e del dispositivo connesso fisicamente al pin. Pertanto, un driver può aprire una connessione logica a questo pin per operazioni di scrittura o lettura, ma non entrambi. Tuttavia, questo vincolo viene imposto dall'hardware e non dall'estensione del framework GPIO (GpioClx). Se l'hardware consente la configurazione di un pin di I/O sia per l'input che per l'output, GpioClx consente a un driver di aprire una connessione logica al pin per operazioni di lettura e scrittura.
Per i pin GPIO configurati come input di richiesta di interruzione, il fatto che una richiesta di interruzione viene implementata da un pin GPIO anziché da un controller di interruzione o da una riga di richiesta di interruzione dedicata viene completamente astratta dal sistema operativo. Gli interruzioni GPIO vengono presentati ai driver di dispositivo periferici come risorse di interruzione astratte. L'astrazione di queste risorse è supportata dallo stack di driver GPIO e dal livello di astrazione hardware (HAL). Pertanto, i driver di dispositivo periferici che usano risorse di interruzione possono ignorare in gran parte i dettagli sull'implementazione sottostante di queste risorse. Per altre informazioni, vedere Interruzioni GPIO.
Il diagramma seguente illustra un'assegnazione di esempio delle risorse basate su GPIO a due driver di dispositivo periferici:
Nel diagramma precedente vengono assegnate le tre risorse basate su GPIO seguenti:
- Due pin di input dati
- Un pin di output dei dati
- Pin di input di interruzione
Le due risorse basate su GPIO seguenti vengono assegnate al driver di dispositivo periferico B:
- Pin di input dati
- Pin di input di interruzione
I driver A e B ricevono le risorse assegnate nelle funzioni di callback EvtDevicePrepareHardware . Se un driver riceve, come risorsa, un set di pin I/O GPIO o più, il driver può aprire una connessione a questi pin per accedervi. Il driver ottiene un handle WDFIOTARGET per identificare la connessione e invia richieste di I/O a questo handle per leggere o scrivere in questi pin.
Per esempi di codice che illustrano come connettersi a un set di pin I/O GPIO e inviare richieste di I/O a questi pin, vedere gli argomenti seguenti:
Connessione di un driver KMDF ai pin di I/O GPIO
In entrambi gli argomenti la IoRoutine
funzione nell'esempio di codice apre una risorsa pin I/O GPIO per le letture o per le scritture, a seconda del valore del ReadOperation
parametro. Se la risorsa viene aperta per le letture (DesiredAccess
= GENERIC_READ), i pin nella risorsa vengono configurati come input e una richiesta di IOCTL_GPIO_READ_PINS inviata alla risorsa pin legge i valori di input in questi pin. GpioClx non consente l'invio di una richiesta di IOCTL_GPIO_WRITE_PINS a un set di pin di input e completa tale richiesta con uno stato di errore STATUS_GPIO_OPERATION_DENIED. Analogamente, se la risorsa pin viene aperta per le scritture (DesiredAccess
= GENERIC_WRITE), i pin nella risorsa vengono configurati come output e una richiesta di IOCTL_GPIO_WRITE_PINS inviata alla risorsa pin imposta i valori nei latch di output che guidano questi pin. In genere, l'invio di una richiesta di IOCTL_GPIO_READ_PINS a un set di pin di output legge semplicemente gli ultimi valori scritti nei latch di output.
Per usare una risorsa di interruzione per ricevere gli interruzioni, un driver client deve connettere una routine del servizio di interruzione (ISR) all'interruzione. In genere, il driver effettua questa connessione chiamando il metodo WdfInterruptCreate (o, eventualmente, la routine IoConnectInterruptEx ). Per altre informazioni sugli interruzioni kmDF, vedere Creazione di un oggetto interrupt.
Al contrario di Plug and Play dispositivi che possono essere connessi dinamicamente a e disconnessi da una piattaforma hardware, un dispositivo controller GPIO viene collegato definitivamente. Inoltre, si presuppone che le connessioni tra pin GPIO e un dispositivo periferico siano permanenti. Oppure, se il dispositivo periferico può essere scollegato da uno slot, lo slot è dedicato a questo dispositivo. Pertanto, le risorse GPIO disponibili sono fisse e possono essere specificate nel firmware della piattaforma. Analogamente, i driver di dispositivo periferici che usano le risorse GPIO vengono assunti per l'uso di set dedicati di risorse GPIO. Pertanto, i requisiti delle risorse per questi driver di dispositivo possono essere specificati nel firmware della piattaforma.
Quando il firmware della piattaforma designa un set di pin GPIO come risorsa I/O GPIO, il firmware indica se i pin in questa risorsa possono essere aperti per le letture, per le scritture o per le letture e le scritture.
Se un driver di dispositivo periferico usa più risorse di I/O GPIO, questo driver deve essere consapevole dell'ordine in cui queste risorse vengono enumerate dal gestore PnP. Ad esempio, se un driver usa due pin I/O GPIO, ma questi pin devono essere accessibili in modo indipendente e in momenti separati, il firmware della piattaforma deve descrivere ogni pin come risorsa I/O GPIO separata. Il gestore PnP enumera queste risorse nell'ordine in cui sono descritte nel firmware della piattaforma, che deve corrispondere all'ordine previsto dal driver.
Dopo che un driver di dispositivo periferico apre una connessione a una risorsa di I/O GPIO, una richiesta di IOCTL_GPIO_READ_PINS o IOCTL_GPIO_WRITE_PINS che questo driver invia a questa connessione accede a tutti i pin nella risorsa. Se il driver deve a volte accedere solo a un subset di questi pin, questo subset deve essere assegnato al driver come risorsa separata.
Per altre informazioni sulle richieste di IOCTL_GPIO_READ_PINS , incluso il mapping dei pin di input dati ai bit nel buffer di output della richiesta, vedere IOCTL_GPIO_READ_PINS. Per altre informazioni sulle richieste di IOCTL_GPIO_WRITE_PINS , incluso il mapping dei bit nel buffer di input della richiesta ai pin di output dei dati, vedere IOCTL_GPIO_WRITE_PINS.