Sdílet prostřednictvím


GPIO controller Device-Specific – metoda (_DSM)

Pro podporu různých komunikací specifických pro zařízení mezi zásobníkem ovladačů GPIO (General-Purpose I/O) ve Windows a firmwarem platformy microsoft definuje metodu Device-Specific (_DSM), kterou lze zahrnout do kontroleru GPIO v oboru názvů ACPI.

V současné době tato metoda definuje dvě funkce:

  • Index funkce 0: Standardní funkce dotazu, kterou musí poskytnout všechny _DSM metody.

  • Index funkce 1: Funkce ActiveBoth Polarity, která informuje sadu GPIO o všech pinech ActiveBoth na kontroleru, které nejsou uplatněné logiky nízké. Zásobník GPIO předpokládá, že piny ActiveBoth mají nízkou logiku, takže tato funkce umožňuje platformě přepsat tuto výchozí hodnotu pro konkrétní špendlíky.

Definice IDENTIFIKÁTORU GUID

Identifikátor GUID pro metodu _DSM kontroleru GPIO je definován takto:

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

Funkce 0

Funkce 0 každého _DSM je funkce dotazu, která vrací sadu podporovaných indexů funkcí a je vždy povinná. Definice funkce 0 najdete v části 9.14.1 "_DSM (metoda specifická pro zařízení)" ve specifikaci ACPI 5.0.

Funkce 1

Parametry pro funkci 1 kontroleru GPIO _DSM metody jsou definovány takto:

Argumenty

  • Arg0: UUID pro _DSM kontroleru GPIO

    // 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 revize

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2: index funkce pro funkci ActiveBoth asserted polarity:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: prázdný balíček (nepoužívá se)

Vrátit

Balíček celých čísel, z nichž každý je číslo kolíku relativního kontroleru na ovladači GPIO, který je:

  • Definováno jako přerušení ActiveBoth a

  • Jejíž stav asserted je není logika nízká (jinými slovy, je logika vysoká).

Pokud je například emulovaný pin kód ActiveBoth připojený k zařízení s tlačítkem, pin zadá asserted state (úroveň vstupu logiky na špendlíku), když uživatel stiskne tlačítko a zůstane v kontrolním stavu, zatímco uživatel drží tlačítko dolů. Když uživatel tlačítko uvolní, stav připnutí se změní na nesesazené (úroveň vstupu s nízkou logikou).

Příklad kódu ASL

Následující příklad kódu ASL identifikuje sadu pinů GPIO, které mají počáteční polaritu 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})
    }
}