다음을 통해 공유


범용 I/O(GPIO)

SoC(System on a Chip) 통합 회로는 GPIO(범용 I/O) 핀을 광범위하게 사용합니다. SoC 기반 플랫폼의 경우 Windows는 GPIO 하드웨어에 대한 일반적인 추상화 를 정의하며, 이 추상화에는 ACPI(고급 구성 및 전원 인터페이스) 네임스페이스의 지원이 필요합니다.

GPIO 추상화는 이 문서에 나열된 ACPI 5.0 사양 정의에서 지원됩니다.

GPIO 컨트롤러가 모든 Windows 플랫폼 요구 사항을 충족하는지 확인하려면 GPIO 컨트롤러 요구 사항 검사 목록을 참조하세요.

GPIO 컨트롤러 디바이스

Windows는 GPIO 컨트롤러를 지원합니다. GPIO 컨트롤러는 인터럽트, 입력 신호 및 출력 신호를 포함하여 주변 디바이스에 대한 다양한 기능을 제공합니다. GPIO 기능은 네임스페이스에서 GPIO 컨트롤러 디바이스로 모델링됩니다. GPIO 프레임워크 확장(GpioClx)은 GPIO 컨트롤러 디바이스를 일부 핀 뱅크로 분할되는 것으로 모델링합니다. 각 핀 뱅크에는 64개 이하의 구성 가능한 핀이 있습니다. GPIO 컨트롤러의 은행은 컨트롤러 상대 GPIO 핀 공간 내에서 핀의 위치를 기준으로 정렬됩니다. 예를 들어 bank 0에는 컨트롤러에 핀 0-31이 있고 bank 1에는 핀 32-63 등이 포함됩니다. 마지막 은행을 제외한 모든 은행은 동일한 수의 핀을 가지고 있으며, 이는 더 적을 수 있습니다. 아래 GPIO 네임스페이스 개체 섹션에 설명된 대로 펌웨어가 시스템 인터럽트 리소스의 매핑을 은행에 보고해야 하기 때문에 은행은 ACPI 펌웨어에 중요합니다.

은행의 각 핀에는 핀을 구성하는 방법을 설명하는 매개 변수 집합(예: 출력, 수준 구분 인터럽트, 반송 해제된 입력 등)이 있습니다.

GPIO 컨트롤러 및 ActiveBoth 인터럽트

일부 GPIO 컨트롤러의 기능은 신호의 양쪽 가장자리(상승 또는 ActiveHigh 가장자리, 떨어지는 가장자리 또는 ActiveLow 가장자리)에서 인터럽트 생성 기능입니다. 이는 단추 인터페이스를 비롯한 다양한 애플리케이션에서 유용합니다. 여기서 단추 누름 이벤트(한쪽 가장자리)와 단추 릴리스 이벤트(반대쪽 가장자리)는 모두 의미가 있습니다. 이 기능을 "ActiveBoth"라고 합니다.

논리적으로 ActiveBoth 신호는 순간적인 어설션(예: pushbutton) 또는 무기한 긴 어설션(예: 헤드폰 잭 삽입)인지 여부에 관계없이 어설션된 상태와 어설션되지 않은 상태를 모두 갖습니다. ActiveBoth 인터럽트 에지 검색은 GPIO 컨트롤러 하드웨어(하드웨어 ActiveBoth)에서 구현되거나 GPIO 드라이버 소프트웨어(에뮬레이트된 ActiveBoth)에서 에뮬레이트될 수 있습니다. Windows에서는 ActiveBoth를 구현하는 GPIO 컨트롤러가 에뮬레이트된 ActiveBoth를 사용해야 합니다. 이는 모든 시나리오에 대해 양날 인터럽트 처리를 강력하게 처리하는 데 필요합니다. ActiveBoth 에뮬레이션을 지원하기 위해 다음과 같은 하드웨어 요구 사항이 적용됩니다.

  1. ActiveBoth 인터럽트 지원 GPIO 컨트롤러는 수준 모드 인터럽트만 지원해야 하며 런타임 시 인터럽트 극성 재프로그래밍을 지원해야 합니다.

  2. I/O 오류의 위험을 최소화하기 위해 Windows는 SPB 연결 GPIO 컨트롤러 대신 메모리 매핑 GPIO 컨트롤러를 사용하는 것을 선호합니다. 실제로 Windows 단추 배열 디바이스(PNP0C40)의 경우 이 디바이스에 대한 ActiveBoth GPIO 인터럽트가 SPB에 연결된 디바이스가 아닌 메모리 매핑된 GPIO 컨트롤러에 연결해야 합니다. ActiveBoth여야 하는 단추 인터럽트는 기타 ACPI 네임스페이스 개체 항목의 단추 디바이스 섹션을 참조하세요.

  3. ActiveBoth 인터럽트 신호에 대한 결정적 초기 상태를 설정하기 위해 Windows GPIO 디바이스 스택은 드라이버가 인터럽트 연결 후 생성된 첫 번째 인터럽트는 항상 신호의 어설션된 상태에 대한 것이 되도록 보장합니다. 또한 스택은 모든 ActiveBoth 인터럽트 줄의 어설션된 상태가 기본적으로 논리 수준 낮음(ActiveLow 에지)임을 가정합니다. 플랫폼에서 그렇지 않은 경우 컨트롤러의 네임스페이스에 GPIO 컨트롤러 Device-Specific 메서드(_DSM)를 포함하여 기본값을 재정의할 수 있습니다. 이 메서드에 대한 자세한 내용은 GPIO 컨트롤러 Device-Specific 메서드(_DSM)를 참조하세요.

이전 목록의 세 번째 요구 사항은 현재 GPIO 핀의 신호가 어설션된 상태인 경우 ActiveBoth를 사용하는 디바이스의 드라이버가 인터럽트를 초기화(연결)한 직후 인터럽트를 받을 수 있음을 의미합니다. 이는 가능하며 일부 디바이스(예: 헤드폰)의 경우에도 가능하며 드라이버에서 지원되어야 합니다.

에뮬레이트된 ActiveBoth를 지원하려면 GPIO 컨트롤러 드라이버가 CLIENT_ReconfigureInterrupt 콜백 함수를 구현하고 드라이버의CLIENT_QueryControllerBasicInformation 콜백 함수가 GpioClx에 제공하는 기본 정보 구조에서 EmulateActiveBoth 플래그를 설정하여 ActiveBoth 에뮬레이션을 사용하도록 설정해야 합니다("옵트인"). 자세한 내용은 GPIO(범용 I/O) 드라이버를 참조하세요.

GPIO 네임스페이스 개체

GPIO 컨트롤러 및 해당 컨트롤러에 연결하는 주변 장치는 ACPI를 통해 열거됩니다. 이들 간의 연결은 GPIO 연결 리소스 설명자를 사용하여 설명합니다. 자세한 내용은 ACPI 5.0 사양의 섹션 6.4.3.8, "연결 설명자"를 참조하세요.

디바이스 식별 및 구성 개체

GPIO 컨트롤러 디바이스의 ACPI 네임스페이스에는 다음이 포함됩니다.

  • 공급업체가 할당한 ACPI 규격 하드웨어 ID(_HID) 개체입니다.
  • 사용된 리소스 집합(_CRS) 개체입니다.
  • 네임스페이스에 GPIO 컨트롤러 인스턴스가 두 개 이상 있는 경우(즉, 디바이스 식별 개체가 동일한 두 개 이상의 네임스페이스 노드)인 고유 ID(_UID) 개체입니다.

GPIO 컨트롤러의 _CRS GPIO 컨트롤러의 모든 은행에서 사용하는 모든 리소스(레지스터 주소 공간, 시스템 인터럽트 등)를 포함합니다. 인터럽트 리소스-은행 간 매핑은 인터럽트 리소스가 _CRS 나열되는 순서로 표시됩니다. 즉, 나열된 첫 번째 인터럽트는 bank 0에 할당되고, 나열된 다음 인터럽트는 bank 1에 할당됩니다. 은행은 인터럽트 리소스를 공유할 수 있습니다. 이 경우 인터럽트는 연결된 각 은행에 대해 은행 순서대로 한 번 나열되고 공유로 구성됩니다.

GPIO 연결 리소스 설명자

주변 장치와 연결된 GPIO 핀 간의 관계는 GPIO 연결 리소스 설명자에 의해 운영 체제에 설명되어 있습니다. 이러한 리소스 설명자는 GPIO 연결의 두 가지 유형인 GPIO 인터럽트 연결 및 GPIO I/O 연결을 정의할 수 있습니다. 주변 장치는 연결된 모든 GPIO I/O 및 인터럽트 핀에 대한 _CRS GPIO 연결 설명자를 포함합니다. 연결된 인터럽트는 절전 모드 해제 가능(저전력 유휴 상태에서 시스템을 절전 모드 해제할 수 있음)인 경우 ExclusiveAndWake 또는 SharedAndWake로 구성해야 합니다. 자세한 내용은 디바이스 전원 관리를 참조하세요.

설명자는 ACPI 5.0 사양의 섹션 6.4.3.8.1, "GPIO 연결 설명자"에 정의되어 있습니다. 이러한 설명자에 대한 ASL 리소스 템플릿 매크로는 ACPI 5.0 사양의 19.5.53, "GpioInt(GPIO 인터럽트 연결 리소스 설명자 매크로)" 섹션에 설명되어 있습니다.

GPIO 신호 ACPI 이벤트

ACPI는 플랫폼의 하드웨어 이벤트를 ACPI 드라이버에 신호를 받고 전달할 수 있도록 하는 플랫폼 이벤트 모델을 정의합니다. Windows는 디바이스 드라이버에 플랫폼 이벤트를 전달하기 위한 알림 서비스를 제공합니다. 많은 받은 편지함 드라이버가 이 서비스를 사용하여 제어 방법 전원 단추, LID 디바이스, 제어 방법 배터리, 열 영역 등과 같은 ACPI 정의 디바이스를 지원합니다. 알림에 대한 자세한 내용은 ACPI 사양의 섹션 5.6.5, "GPIO 신호 ACPI 이벤트"를 참조하세요.

SoC 플랫폼의 경우 GPIO 인터럽트는 플랫폼 이벤트를 신호하는 데 사용됩니다. ASL Notify 연산자를 사용하여 드라이버에 이벤트를 알리는 네임스페이스 디바이스("ACPI 이벤트 원본" 디바이스)에는 다음이 필요합니다.

  • ACPI 이벤트 신호가 연결된 GPIO 컨트롤러의 네임스페이스 노드에는 ACPI 이벤트 정보(_AEI) 개체에 해당 핀에 대한 GpioInt 리소스가 포함되어야 합니다(아래의 "ACPI 이벤트 정보(_AEI) 개체" 섹션 2.4.2.3.1 참조). GpioInt 리소스는 공유되지 않음(배타적)으로 구성해야 합니다.

  • 컨트롤러의 노드에는 _AEI 개체에 나열된 각 핀에 대한 Edge(_Exx), Level(_Lxx) 또는 Event(_EVT) 제어 메서드도 포함되어야 합니다.

ACPI 드라이버는 나열된 GPIO 인터럽트 를 처리하고 Edge, Level 또는 Event 컨트롤 메서드를 평가합니다. 컨트롤 메서드는 필요한 경우 하드웨어 이벤트를 정지시키고 이벤트 원본 디바이스의 네임스페이스 노드에서 필요한 Notify 연산자를 실행합니다. 그런 다음 Windows는 디바이스의 드라이버에 알림을 보냅니다. 이벤트 제어 메서드가 하드웨어를 쿼리하여 발생한 이벤트를 확인할 수 있는 경우 동일한 GpioInt 리소스를 통해 여러 이벤트를 신호로 보낼 수 있습니다. 그런 다음 메서드는 올바른 알림 코드를 사용하여 올바른 디바이스에 알려야 합니다.

ACPI 이벤트 정보(_AEI) 개체 앞에서 설명한 것처럼 GPIO 컨트롤러의 네임스페이스에는 ACPI 이벤트를 지원하려면 _AEI 개체가 포함되어야 합니다. _AEI 개체(ACPI 5.0 사양의 섹션 5.6.5.2 참조)는 이 GPIO 컨트롤러를 통해 ACPI 이벤트를 알리는 GpioInt 설명자만 포함하는 리소스 템플릿 버퍼를 반환합니다. 각 설명자는 하나의 ACPI 이벤트 원본 디바이스에 해당하며 해당 디바이스 전용입니다(디바이스 간에 공유되지 않음).

GeneralPurposeIO 작업 영역(OpRegions)

GPIO 컨트롤러는 종종 플랫폼 펌웨어에서 전원 및 클록 제어 또는 디바이스에서 모드 설정과 같은 다양한 플랫폼 하드웨어 기능을 지원하는 데 사용됩니다. ASL 제어 메서드에서 GPIO I/O 사용을 지원하기 위해 ACPI 5.0은 새 OpRegion 형식인 "GeneralPurposeIO"를 정의합니다.

GeneralPurposeIO OpRegions(ACPI 5.0 사양의 섹션 5.5.2.4.4 참조)는 드라이버가 I/O를 처리할 GPIO 컨트롤러 디바이스의 네임스페이스 범위 내에서 선언됩니다. GeneralPurposeIO 필드 선언(ACPI 5.0 사양의 섹션 5.5.2.4.4.1 참조)은 GeneralPurposeIO OpRegion 내에서 액세스할 GPIO 핀에 이름을 할당합니다. GpioIO 연결 리소스(ACPI 5.0 사양의 섹션 19.5.53 참조)는 필드 선언 내에서 특정 필드 참조에 대한 핀 번호 및 구성을 지정하는 데 사용됩니다. 연결 설명자 다음에 있는 명명된 필드 비트의 총 수는 설명자에 나열된 핀 수와 같아야 합니다.

OpRegion의 필드는 네임스페이스의 아무 곳이나 선언할 수 있으며 네임스페이스의 모든 메서드에서 액세스할 수 있습니다. GeneralPurposeIO OpRegion에 대한 액세스 방향은 첫 번째 액세스(읽기 또는 쓰기)에 의해 결정되며 변경할 수 없습니다.

OpRegion 액세스는 GPIO 컨트롤러 디바이스 드라이버("OpRegion 처리기")에서 제공되므로 메서드는 드라이버를 사용할 수 있게 될 때까지 OpRegion에 액세스하지 않도록 주의해야 합니다. ASL 코드는 GPIO 컨트롤러 디바이스 아래에 Region(_REG) 메서드를 포함하여 OpRegion 처리기의 상태를 추적할 수 있습니다(ACPI 5.0 사양의 섹션 6.5.4 참조). 또한 필요한 경우 GPIO OpRegion 필드에 액세스하는 메서드가 있는 모든 디바이스에서 OpRegion 종속성(_DEP) 개체(ACPI 5.0 사양의 섹션 6.5.8 참조)를 사용할 수 있습니다. _DEP 사용 시기에 대한 자세한 내용은 디바이스 관리 네임스페이스 개체 항목의 디바이스 종속성 섹션을 참조하세요. 드라이버에는 GeneralPurposeIO OpRegions에도 할당된 GPIO I/O 리소스가 할당되지 않는 것이 중요합니다. Opregions는 ASL 컨트롤 메서드를 단독으로 사용하기 위한 것입니다.