Bagikan melalui


Pengontrol GPIO Metode Device-Specific (_DSM)

Untuk mendukung berbagai komunikasi khusus kelas perangkat antara tumpukan driver I/O (GPIO) tujuan umum di Windows dan firmware platform, Microsoft menentukan Metode Device-Specific (_DSM) yang dapat disertakan di bawah pengontrol GPIO di namespace ACPI.

Saat ini, metode ini mendefinisikan dua fungsi:

  • Indeks Fungsi 0: Fungsi Kueri Standar yang harus disediakan oleh semua metode _DSM.

  • Function Index 1: Fungsi Polaritas ActiveBoth, yang menginformasikan tumpukan GPIO dari pin ActiveBoth apa pun pada pengontrol yang tidak dinyatakan logika rendah. Tumpukan GPIO mengasumsikan bahwa pin ActiveBoth ditegaskan logika rendah, sehingga fungsi ini memungkinkan platform untuk mengambil alih default tersebut untuk pin tertentu.

Definisi GUID

GUID untuk metode _DSM pengontrol GPIO didefinisikan sebagai:

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

Fungsi 0

Fungsi 0 dari setiap _DSM adalah fungsi kueri yang mengembalikan kumpulan indeks fungsi yang didukung, dan selalu diperlukan. Untuk definisi Fungsi 0, lihat bagian 9.14.1, "_DSM (Metode Khusus Perangkat)", dalam spesifikasi ACPI 5.0 .

Fungsi 1

Parameter untuk Fungsi 1 dari metode _DSM pengontrol GPIO didefinisikan sebagai berikut:

Argumen

  • Arg0: UUID untuk _DSM pengontrol 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 Revisi

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2: indeks Fungsi untuk polaritas yang dinyatakan ActiveBoth:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: paket kosong (tidak digunakan)

Pengembalian

Paket bilangan bulat, yang masing-masing adalah nomor pin relatif pengontrol dari pin pada pengontrol GPIO yaitu:

  • Didefinisikan sebagai interupsi ActiveBoth, dan

  • Yang statusnya dinyatakan tidak logika rendah (dengan kata lain, logika tinggi).

Misalnya, jika pin ActiveBoth yang ditiru terhubung ke perangkat pushbutton, pin memasuki status yang ditegaskan (tingkat input tinggi logika saat disematkan) ketika pengguna menekan tombol, dan tetap dalam status tegas saat pengguna menahan tombol. Saat pengguna merilis tombol, status pin berubah menjadi yang tidak ditetapkan (tingkat input logika rendah).

Contoh kode ASL

Contoh kode ASL berikut mengidentifikasi sekumpulan pin GPIO yang memiliki polaritas awal 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})
    }
}