GPIO コント ローラーのデバイス固有のメソッド (_DSM)
Windows の汎用 I/O (GPIO) ドライバー スタックとプラットフォーム ファームウェアの間のさまざまなデバイス クラス固有の通信をサポートするために、Microsoft は、ACPI 名前空間の GPIO コントローラーに含めることができるデバイス固有のメソッド (_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: パッケージ空 (未使用)
Return
整数のパッケージ。各パッケージは、次の 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})
}
}