Dela via


GPIO-styrenhet Device-Specific metod (_DSM)

För att stödja en mängd olika enhetsklassspecifika kommunikationer mellan gpio-drivrutinsstacken (general-purpose I/O) i Windows och plattformens inbyggda programvara definierar Microsoft en Device-Specific-metod (_DSM) som kan ingå under en GPIO-styrenhet i ACPI-namnområdet.

För närvarande definierar den här metoden två funktioner:

  • Function Index 0: Standard Query Function som alla _DSM metoder måste tillhandahålla.

  • Function Index 1: The ActiveBoth Polarity Function, som informerar GPIO-stacken om eventuella ActiveBoth-stift på styrenheten som inte är hävdad logik låg. GPIO-stacken förutsätter att ActiveBoth-stiften har låg logik, så den här funktionen gör att plattformen kan åsidosätta den standardinställningen för specifika stift.

GUID-definition

GUID för GPIO-kontrollanten _DSM-metoden definieras som:

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

Funktion 0

Funktion 0 i varje _DSM är en frågefunktion som returnerar uppsättningen funktionsindex som stöds och som alltid krävs. Definitionen av Funktion 0 finns i avsnitt 9.14.1, "_DSM (enhetsspecifik metod)", i ACPI 5.0-specifikationen.

Funktion 1

Parametrarna för funktion 1 i GPIO-kontrollanten _DSM-metoden definieras på följande sätt:

Argumenten

  • Arg0: UUID för GPIO-styrenhet _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: Function index for ActiveBoth asserted polarity:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: Paketet är tomt (används inte)

Återvända

Ett paket med heltal, som var och en är det kontrollant-relativa pin-numret för en pin-kod på GPIO-styrenheten som är:

  • Definieras som ett ActiveBoth-avbrott och

  • Vars påstådda tillstånd är inte logik låg (med andra ord är logik hög).

Om till exempel en emulerad ActiveBoth-stift är ansluten till en pushbutton-enhet, anger stiftet bekräftat tillstånd (logik-hög indatanivå vid stift) när användaren trycker på knappen och förblir i det bekräftade tillståndet medan användaren håller knappen nere. När användaren släpper knappen ändras pin-tillståndet till ej bekräftad (logiklåg indatanivå).

ASL-kodexempel

Följande ASL-kodexempel identifierar en uppsättning GPIO-stift som har inledande polaritet för 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})
    }
}