Condividi tramite


Metodo Device-Specific controller GPIO (_DSM)

Per supportare un'ampia gamma di comunicazioni specifiche della classe di dispositivo tra lo stack di driver I/O (GPIO) per utilizzo generico in Windows e il firmware della piattaforma, Microsoft definisce un metodo Device-Specific (_DSM) che può essere incluso in un controller GPIO nello spazio dei nomi ACPI.

Attualmente, questo metodo definisce due funzioni:

  • Indice funzione 0: funzione query standard necessaria per tutti i metodi di _DSM.

  • Indice funzione 1: funzione ActiveBoth Polarity, che informa lo stack GPIO di tutti i pin ActiveBoth nel controller che non sono stati asserti logici bassi. Lo stack GPIO presuppone che i pin ActiveBoth siano con una logica bassa, quindi questa funzione consente alla piattaforma di eseguire l'override di tale impostazione predefinita per pin specifici.

Definizione GUID

Il GUID per il metodo _DSM controller GPIO è definito come:

{4F248F40-D5E2-499F-834C-27758EA1CD3F}

Funzione 0

La funzione 0 di ogni _DSM è una funzione di query che restituisce il set di indici di funzione supportati ed è sempre necessaria. Per la definizione della funzione 0, vedere la sezione 9.14.1, "_DSM (metodo specifico del dispositivo)", nella specifica ACPI 5.0.

Funzione 1

I parametri per la funzione 1 del controller GPIO _DSM metodo sono definiti come segue:

Argomenti

  • Arg0: UUID per il controller GPIO _DSM

    // GUID: {4F248F40-D5E2-499F-834C-27758EA1CD3F}

    DEFINE_GUID (GPIO_CONTROLLER _DSM_GUID,

    0x4f248f40, 0xd5e2, 0x499f, 0x83, 0x4c, 0x27, 0x75, 0x8e, 0xa1, 0xcd. 0x3f);

  • Arg1: ID revisione

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2: Indice di funzione per la polarità asserta di ActiveBoth:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: Pacchetto vuoto (non usato)

Return

Pacchetto di numeri interi, ognuno dei quali è il numero di pin relativo al controller di un pin nel controller GPIO, ovvero:

  • Definito come interrupt ActiveBoth e

  • Il cui stato asserto non è logico basso (in altre parole, è logica elevata).

Ad esempio, se un pin ActiveBoth emulato è connesso a un dispositivo pushbutton, il pin entra nello stato asserto (livello di input alto per la logica al pin) quando l'utente preme il pulsante e rimane nello stato asserto mentre l'utente tiene premuto il pulsante verso il basso. Quando l'utente rilascia il pulsante, lo stato del pin viene modificato in un livello di input non selezionato (livello di input a basso livello di logica).

Esempio di codice ASL

Nell'esempio di codice ASL seguente viene identificato un set di pin GPIO con polarità iniziale di ActiveHigh.

//
// _DSM - Device-Specific Method
//
// Arg0:    UUID       Unique function identifier
// Arg1:    Integer    Revision Level
// Arg2:    Integer    Function Index (0 = Return Supported Functions)
// Arg3:    Package    Parameters
//

Function(_DSM,{BuffObj, PkgObj, IntObj},{BuffObj, IntObj, IntObj, PkgObj})
{

    //
    // Switch based on which unique function identifier was passed in
    //

    //
    // GPIO CLX UUID
    //

    If(LEqual(Arg0,ToUUID("4F248F40-D5E2-499F-834C-27758EA1CD3F")))
    {
        switch(Arg2)
        {

            //
            // Function 0: Return supported functions, based on 
            //    revision
            //

            case(0)
            {
                // Revision 0+: Functions 0 & 1 are supported
                return (Buffer() {0x3})
            }

            //
            // Function 1: For emulated ActiveBoth controllers, 
            //    returns a package of controller-relative pin
            //    numbers. Each corresponding pin will have an
            //    initial polarity of ActiveHigh.
            //
            //    A pin number of 0xffff is ignored.
            //

            case(1)
            {     
                // Marks pins 0x28, 0x29 and 0x44 to be ActiveHigh.
                Return (Package() {0x28, 0x29, 0x44})
            }

            //
            // Unrecognized function for this revision
            //

            default
            {
                BreakPoint
            }
        }
    }
    else
    {
        //
        // If this is not one of the UUIDs we recognize, then return
        // a buffer with bit 0 set to 0 to indicate that no functions
        // are supported for this UUID.
        //

        return (Buffer() {0})
    }
}