Aracılığıyla paylaş


GPIO denetleyicisi Device-Specific Yöntemi (_DSM)

Microsoft, Windows'taki genel amaçlı G/Ç (GPIO) sürücü yığını ile platform üretici yazılımı arasında cihaza özgü çeşitli iletişimleri desteklemek için ACPI ad alanında GPIO denetleyicisi altına dahil edilebilecek bir Device-Specific Yöntemi (_DSM) tanımlar.

Şu anda bu yöntem iki işlevi tanımlar:

  • İşlev Dizini 0: Tüm _DSM yöntemlerinin sağlaması gereken Standart Sorgu İşlevi.

  • İşlev Dizini 1: ActiveBoth Polarity İşlevi, GPIO yığınını, denetleyicide mantık düşük olduğu iddia edilmeyen activeBoth pinlerinin bilgisini sağlar. GPIO yığını, ActiveBoth pinlerinin düşük mantıkla onaylandığını varsayar, bu nedenle bu işlev platformun belirli raptiyeler için bu varsayılanı geçersiz kılmasına olanak tanır.

GUID tanımı

GPIO denetleyicisi _DSM yönteminin GUID değeri şu şekilde tanımlanır:

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

İşlev 0

Her _DSM 0. işlev, desteklenen işlev dizinleri kümesini döndüren ve her zaman gerekli olan bir sorgu işlevidir. İşlev 0'ın tanımı için, ACPI 5.0 belirtimi "_DSM (Cihaza Özgü Yöntem)" başlıklı 9.14.1 bölümüne bakın.

İşlev 1

GPIO denetleyicisi _DSM yönteminin İşlev 1 parametreleri aşağıdaki gibi tanımlanır:

Tartışmalar

  • Arg0: GPIO denetleyici _DSM için UUID

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

    DEFINE_GUID (GPIO_CONTROLLER _DSM_GUID,

    0x4f248f40, 0xd5e2, 0x499f, 0x83, 0x4c, 0x27, 0x75, 0x8e, 0xa1, 0xcd. 0x3f);

  • Arg1: Düzeltme Kimliği

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2: ActiveBoth için İşlev dizini onaylanan kutup:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: Paketi boş (kullanılmaz)

Dönmek

Her biri GPIO denetleyicisindeki bir raptiyenin denetleyici göreli pin numarası olan tamsayı paketi:

  • ActiveBoth kesmesi olarak tanımlanmış ve

  • Onaylanan durumu mantığı düşük değildir (başka bir deyişle, yüksek mantıktır).

Örneğin, bir itme düğmesi cihazına öykünmüş bir ActiveBoth pini bağlıysa, kullanıcı düğmeye bastığında, pin onaylanan durumunu (pin'te mantıksal yüksek giriş düzeyi) girer ve kullanıcı düğmeyi basılı tutarken onaylanan durumda kalır. Kullanıcı düğmeyi serbest bıraktığında, sabitleme durumu birleştirilmemiş (mantıksal düşük giriş düzeyi) olarak değişir.

ASL kod örneği

Aşağıdaki ASL kod örneği, ActiveHigh'nin ilk kutupsallığına sahip bir GPIO pinleri kümesini tanımlar.

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