GPIO-Controller Device-Specific-Methode (_DSM)

Um eine Vielzahl von geräteklassenspezifischen Kommunikationen zwischen dem GPIO-Treiberstapel (General Purpose E/O) in Windows und der Plattformfirmware zu unterstützen, definiert Microsoft eine Device-Specific-Methode (_DSM), die unter einem GPIO-Controller im ACPI-Namespace enthalten sein kann.

Derzeit definiert diese Methode zwei Funktionen:

  • Funktionsindex 0: Die Standardabfragefunktion, die alle _DSM Methoden bereitstellen müssen.

  • Funktionsindex 1: Die ActiveBoth-Polaritätsfunktion, die den GPIO-Stapel über alle ActiveBoth-Pins auf dem Controller informiert, die keine behauptete Logik niedrig sind. Der GPIO-Stapel geht davon aus, dass ActiveBoth-Pins logikarm sind, sodass diese Funktion der Plattform das Überschreiben des Standardwerts für bestimmte Pins ermöglicht.

GUID-Definition

Die GUID für den GPIO-Controller _DSM Methode ist wie folgt definiert:

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

Funktion 0

Funktion 0 jedes _DSM ist eine Abfragefunktion, die den Satz unterstützter Funktionsindizes zurückgibt und immer erforderlich ist. Die Definition von Funktion 0 finden Sie in Abschnitt 9.14.1, "_DSM (gerätespezifische Methode)" in der ACPI 5.0-Spezifikation.

Funktion 1

Die Parameter für Funktion 1 des GPIO-Controllers _DSM-Methode sind wie folgt definiert:

Argumente

  • Arg0: UUID für GPIO-Controller-_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: Revisions-ID

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2: Funktionsindex für die behauptete Polarität von ActiveBoth:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: Paket leer (nicht verwendet)

Rückgabewert

Ein Paket ganzzahliger Zahlen, von denen jede die controllerrelative Pinnummer eines Pins auf dem GPIO-Controller ist, der wie folgt lautet:

  • Definiert als ActiveBoth-Interrupt und

  • Deren behaupteter Zustand nicht logikarm ist (d. h. logikhoch).

Wenn beispielsweise ein emulierter ActiveBoth-Pin mit einem Drucktastengerät verbunden ist, wechselt der Pin in den behaupteten Zustand (logikhohe Eingabeebene am Pin), wenn der Benutzer die Schaltfläche drückt, und bleibt im behaupteten Zustand, während der Benutzer die Schaltfläche gedrückt hält. Wenn der Benutzer die Schaltfläche loslässt, ändert sich der Pinzustand in nicht aktiviert (logikarme Eingabeebene).

ASL-Codebeispiel

Im folgenden ASL-Codebeispiel wird eine Reihe von GPIO-Pins identifiziert, die die anfängliche Polarität von ActiveHigh aufweisen.

//
// _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})
    }
}