GPIO 컨트롤러 Device-Specific 메서드(_DSM)
Windows의 범용 I/O(GPIO) 드라이버 스택과 플랫폼 펌웨어 간의 다양한 디바이스 클래스별 통신을 지원하기 위해 Microsoft는 ACPI 네임스페이스의 GPIO 컨트롤러 아래에 포함할 수 있는 Device-Specific 메서드(_DSM)를 정의합니다.
현재 이 메서드는 다음 두 가지 함수를 정의합니다.
함수 인덱스 0: 모든 _DSM 메서드를 제공해야 하는 표준 쿼리 함수입니다.
함수 인덱스 1: 논리가 낮게 어설션되지 않은 컨트롤러의 ActiveBoth 핀을 GPIO 스택에 알리는 ActiveBoth 극성 함수입니다. 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 메서드의 Function 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: 수정 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})
}
}