共用方式為


GPIO 控制器 Device-Specific 方法 [_DSM]

為了支援 Windows 中一般用途 I/O (GPIO) 驅動程式堆疊與平臺韌體之間的各種裝置類別特定通訊,Microsoft會定義可在 ACPI 命名空間中的 GPIO 控制器中包含的 Device-Specific 方法(_DSM)。

目前,此方法會定義兩個函式:

  • 函式索引 0:所有_DSM方法都必須提供的標準查詢函式。

  • 函式索引 1:ActiveBoth 極性函式,它會通知控制器上任何未判斷提示邏輯低的 ActiveBoth 針腳的 GPIO 堆棧。 GPIO 堆棧假設 ActiveBoth 針腳是判斷提示邏輯低,因此此函式可讓平臺覆寫特定針腳的預設值。

GUID 定義

GPIO 控制器_DSM方法的 GUID 定義為:

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

函式 0

每個_DSM的函式 0 都是一個查詢函式,會傳回支援的函式索引集,而且一律是必要的。 如需函數 0 的定義,請參閱 ACPI 5.0 規格中的<_DSM(裝置特定方法)>一節 9.14.1。

函式 1

GPIO 控制器_DSM方法之函式 1 的參數定義如下:

論點

  • Arg0:GPIO 控制器 UUID _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: 修訂標識符

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2:適用於 ActiveBoth 判斷提示極性 函式索引:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: 套件空白(未使用)

返回

整數的封裝,其中每一個都是 GPIO 控制器上針腳的控制器相對針腳編號,也就是:

  • 定義為 ActiveBoth 中斷,且

  • 其判斷提示狀態 邏輯低(換句話說, 邏輯高)。

例如,如果使用者按下按鈕時,如果仿真的 ActiveBoth 針腳連線到推播裝置,則針腳會在使用者按下按鈕時,輸入 判斷提示的狀態(在釘選時為邏輯高輸入層級),並在使用者按住按鈕時保持判斷提示狀態。 當使用者放開按鈕時,釘選狀態會變更為 未經證實的(邏輯低輸入層級)。

ASL 程式代碼範例

下列 ASL 程式代碼範例會識別一組具有 ActiveHigh 初始極性之 GPIO 針腳。

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