Udostępnij przez


GPIO controller Device-Specific Method (_DSM)

Aby zapewnić obsługę różnych komunikacji specyficznej dla klasy urządzeń między stosem sterowników we/wy ogólnego przeznaczenia (GPIO) w systemie Windows i oprogramowaniem układowym platformy, firma Microsoft definiuje metodę Device-Specific (_DSM), która może być uwzględniona w kontrolerze GPIO w przestrzeni nazw ACPI.

Obecnie ta metoda definiuje dwie funkcje:

  • Indeks funkcji 0: Standardowa funkcja kwerendy wymagana do zapewnienia wszystkich metod _DSM.

  • Indeks funkcji 1: Funkcja Polaryczności ActiveBoth, która informuje stos GPIO o żadnych pinach ActiveBoth na kontrolerze, które nie są asertywne logiki niskie. Stos GPIO zakłada, że piny ActiveBoth są asertywne niskie logiki, więc ta funkcja umożliwia platformie zastąpienie tego domyślnego dla określonych wyprowadzeń.

Definicja identyfikatora GUID

Identyfikator GUID dla kontrolera GPIO _DSM metody jest definiowany jako:

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

Funkcja 0

Funkcja 0 każdego _DSM jest funkcją zapytania, która zwraca zestaw obsługiwanych indeksów funkcji i jest zawsze wymagana. Aby uzyskać definicję funkcji 0, zobacz sekcję 9.14.1, "_DSM (metoda specyficzna dla urządzenia)", w specyfikacji ACPI 5.0.

Funkcja 1

Parametry funkcji 1 kontrolera GPIO _DSM metody są definiowane w następujący sposób:

Argumenty (w programowaniu)

  • Arg0: identyfikator UUID dla kontrolera 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: identyfikator poprawki

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2: indeks funkcji dla polarności asercji ActiveBoth:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: pakiet pusty (nieużytkowane)

Wrócić

Pakiet liczb całkowitych, z których każdy jest względnym numerem pin kontrolera numeru PIN na kontrolerze GPIO, który jest:

  • Zdefiniowano jako przerwanie ActiveBoth i

  • Którego stan asertywne nie jest logiki niski (innymi słowy, jest logika wysoka).

Jeśli na przykład emulowana pinezka ActiveBoth jest podłączona do urządzenia pushbutton, numer PIN wprowadza asertywnego stanu (poziom danych wejściowych o wysokim poziomie logiki na przypięciu), gdy użytkownik naciska przycisk i pozostaje w stanie asertywne, gdy użytkownik trzyma przycisk w dół. Gdy użytkownik zwolni przycisk, stan pinezki zmieni się na bez obsługi (poziom danych wejściowych niskiego poziomu logiki).

Przykład kodu ASL

Poniższy przykład kodu ASL identyfikuje zestaw wyprowadzeń GPIO, które mają początkową polaryzację 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})
    }
}