Condividi tramite


Metodo Device-Specific del controller GPIO (_DSM)

Per supportare un'ampia gamma di comunicazioni specifiche della classe di dispositivo tra lo stack di driver di I/O per utilizzo generico (GPIO) 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 fornire 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 asserzioni logiche basse. Lo stack GPIO presuppone che i pin ActiveBoth siano asserzioni logiche basse, quindi questa funzione consente alla piattaforma di eseguire l'override di tale impostazione predefinita per pin specifici.

Definizione GUID

Il GUID per il metodo di _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 obbligatoria. 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 della funzione per la polarità asserta di ActiveBoth:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: pacchetto vuoto (non usato)

Ritorno

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 logica bassa ( in altre parole, è logica elevata).

Ad esempio, se un pin ActiveBoth emulato è connesso a un dispositivo pushbutton, il pin entra nel asseriti stato (livello di input ad alto livello di logica al pin) quando l'utente preme il pulsante e rimane nello stato asserito mentre l'utente tiene premuto il pulsante. Quando l'utente rilascia il pulsante, lo stato del segnaposto cambia in non inseriti (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})
    }
}