Windows の汎用 I/O (GPIO) ドライバー スタックとプラットフォーム ファームウェアの間のさまざまなデバイス クラス固有の通信をサポートするために、Microsoft は ACPI 名前空間の GPIO コントローラーの下に含めることができる Device-Specific メソッド (_DSM) を定義します。
現在、このメソッドは 2 つの関数を定義します。
関数インデックス 0: すべての_DSMメソッドが提供する必要がある標準クエリ関数。
関数インデックス 1: ActiveBoth 極性関数。これは、ロジックが低いアサートされていないコントローラー上の ActiveBoth ピンを GPIO スタックに通知します。 GPIO スタックでは、ActiveBoth ピンがロジックローでアサートされていることを前提としているため、この関数を使用すると、プラットフォームは特定のピンの既定値をオーバーライドできます。
GUID 定義
GPIO コントローラー _DSM メソッドの GUID は、次のように定義されています。
{4F248F40-D5E2-499F-834C-27758EA1CD3F}
関数 0
すべての_DSMの関数 0 は、サポートされている関数インデックスのセットを返すクエリ関数であり、常に必要です。 関数 0 の定義については、ACPI 5.0 仕様のセクション 9.14.1「_DSM (デバイス固有の方法)」を参照してください。
関数 1
GPIO コントローラー _DSM メソッドの関数 1 のパラメーターは、次のように定義されます。
議論
Arg0: GPIO コントローラー _DSMの 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: リビジョン ID
#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})
}
}