Condividi tramite


Partizionamento di un controller GPIO in banche di pin

Uno sviluppatore di driver può, come opzione, partizionare un dispositivo controller di I/O (GPIO) generico in due o più banche di pin GPIO. Ad esempio, un dispositivo controller GPIO con 64 pin GPIO può essere descritto dal driver del controller GPIO come due banche, ognuna delle quali ha 32 pin GPIO. Lo sviluppatore può fornire un singolo driver per gestire tutte le banche in un dispositivo controller GPIO e questo driver usa in genere un oggetto dispositivo per rappresentare l'intero dispositivo. Tuttavia, alcune o tutte le banche nel dispositivo possono essere gestite indipendentemente dalle altre banche nel dispositivo.

In genere, un driver del controller GPIO sceglie di partizionare un controller GPIO in due o più banche per uno dei motivi seguenti:

  • Lo stato di alimentazione dei pin GPIO in una banca può essere gestito indipendentemente dai pin nelle altre banche.
  • Il numero totale di pin nel controller GPIO è maggiore di 64.

Le dimensioni massime della banca supportate dall'estensione del framework GPIO (GpioClx) sono 64 pin. Un dispositivo controller GPIO contenente più di 64 pin deve essere partizionato dal driver in due o più banche, ognuna delle quali contiene più di 64 pin.

Per determinare come un controller GPIO viene partizionato in banche, GpioClx chiama la funzione di callback dell'evento CLIENT_QueryControllerBasicInformation . Questa funzione, implementata dal driver del controller GPIO, fornisce una struttura CLIENT_CONTROLLER_BASIC_INFORMATION che descrive gli attributi e le funzionalità del controller GPIO. Due membri di questa struttura, TotalPins e NumberOfPinsPerBank, specificano come i pin nel controller GPIO vengono partizionati in banche. TotalPins specifica il numero totale di pin nel controller GPIO e NumberOfPinsPerBank specifica il numero di pin per banca. Se N è il numero di banche nel controller, le banche vengono numerate da 0 a N-1. Tutti tranne l'ultima banca (ovvero il numero bancario N-1) deve contenere il numero di pin specificati nel membro NumberOfPinsPerBank . L'ultima banca può avere un numero qualsiasi di pin da uno a NumberOfPinsPerBank.

GpioClx determina il numero totale di banche nel controller GPIO dai valori dei membri TotalPins e NumberOfPinsPerBank . GpioClx usa la formula integer seguente per calcolare il numero totale di banche:

(TotalPins + NumberOfPinsPerBank – 1) / NumberOfPinsPerBank In alcuni dispositivi controller GPIO, una banca di pin in un dispositivo può essere attivata o passata a uno stato a bassa potenza indipendentemente dalle altre banche nello stesso dispositivo. Pertanto, quando una determinata banca è inattiva, questa banca può essere passata a uno stato di bassa potenza per ridurre il consumo di energia. Per supportare tali dispositivi, GpioClx supporta la gestione della potenza a livello di componente. GpioClx definisce due stati di alimentazione a livello di componente, F0 (completamente attivo) e F1 (bassa potenza o disattivazione).

Per determinare se una banca di pin GPIO supporta la gestione della potenza a livello di componente, GpioClx chiama la funzione di callback degli eventi CLIENT_QuerySetControllerInformation . Il parametro InputBuffer di questa funzione è un puntatore a una struttura CLIENT_CONTROLLER_QUERY_SET_INFORMATION_INPUT . Per richiedere informazioni di risparmio energia, il chiamante imposta il membro RequestType di questa struttura su QueryBankPowerInformation.

Se una banca GPIO supporta la gestione della potenza a livello di componente, GpioClx abilita una transizione allo stato di alimentazione F1 quando la banca è inattiva. Prima che la banca entri nello stato F1, GpioClx chiama la funzione di callback dell'evento CLIENT_SaveBankHardwareContext per indicare al driver di salvare il contesto hardware (principalmente, il contenuto del registro) della banca. Successivamente, dopo che la banca entra nello stato F0, GpioClx chiama la funzione di callback dell'evento CLIENT_RestoreBankHardwareContext per indicare al driver di ripristinare il contesto hardware salvato in precedenza.