GPIO 控制器Device-Specific方法 (_DSM)
為了在 Windows 和平臺韌體中支援一般用途 I/O (GPIO) 驅動程式堆疊之間的各種裝置類別特定通訊,Microsoft 會定義可在 ACPI 命名空間中包含在 GPIO 控制器下的Device-Specific方法 (_DSM) 。
目前,此方法會定義兩個函式:
函式索引 0:所有_DSM方法都必須提供的標準查詢函式。
函式索引 1:ActiveBoth Polarity 函式,它會通知控制器上任何未判斷提示邏輯低的 ActiveBoth 針腳的 GPIO 堆疊。 GPIO 堆疊假設 ActiveBoth 針腳為低判斷提示邏輯,因此此函式可讓平臺覆寫特定針腳的預設值。
GUID 定義
GPIO 控制器的 GUID _DSM 方法定義為:
{4F248F40-D5E2-499F-834C-27758EA1CD3F}
函式 0
每個_DSM的函式 0 都是一個查詢函式,可傳回支援的函式索引集,而且一律為必要。 For the definition of Function 0, see section 9.14.1, "_DSM (Device Specific Method)", in the ACPI 5.0 specification.
函式 1
GPIO 控制器的 Function 1 參數_DSM方法的定義如下:
引數
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})
}
}