GPIO 드라이버 지원 개요

Windows 8 부터 GPIO 프레임워크 확장(GpioClx)은 GPIO 컨트롤러 디바이스용 드라이버를 작성하는 작업을 간소화합니다. 또한 GpioClx는 GPIO 핀에 연결하는 주변 디바이스에 대한 드라이버 지원을 제공합니다. KMDF(커널 모드 드라이버 프레임워크)에 대한 시스템 제공 확장인 GpioClx는 GPIO 디바이스 클래스의 멤버에게 공통적인 처리 작업을 수행합니다.

이 개요에서는 다음 topics 설명합니다.

GPIO 컨트롤러 드라이버

하드웨어 공급업체는 GPIO 컨트롤러를 제어하는 드라이버를 제공합니다. GPIO 컨트롤러 드라이버는 GPIO 컨트롤러에 대한 모든 하드웨어 관련 작업을 관리하는 KMDF 드라이버입니다. GPIO 컨트롤러 드라이버는 GpioClx와 협력하여 데이터 입력 및 데이터 출력으로 구성된 GPIO 핀 그룹에 대한 I/O 요청을 처리합니다. 또한 이 드라이버는 GpioClx와 협력하여 인터럽트 입력으로 구성된 GPIO 핀의 인터럽트 요청을 처리합니다.

GPIO 컨트롤러 디바이스에는 몇 가지 GPIO 핀이 있습니다. 이러한 핀은 주변 장치에 물리적으로 연결할 수 있습니다. GPIO 핀은 데이터 입력, 데이터 출력 또는 인터럽트 요청 입력으로 구성할 수 있습니다. 일반적으로 GPIO 핀은 둘 이상의 디바이스에서 공유되지 않고 주변 장치 전용입니다. GPIO 핀과 주변 장치 간의 연결은 고정되며 사용자가 변경할 수 없습니다(예: 주변 장치를 제거하고 다른 디바이스로 교체). 따라서 GPIO 핀을 주변 디바이스에 할당하는 내용은 플랫폼 펌웨어에서 설명할 수 있습니다.

다음 다이어그램에서는 GPIO 컨트롤러 드라이버 및 GpioClx를 보여 줍니다.

gpio 구성 요소의 블록 다이어그램

GPIO 컨트롤러 드라이버와 GpioClx는 GpioClx DDI(디바이스 드라이버 인터페이스)를 통해 서로 통신합니다. GPIO 컨트롤러 드라이버는 GpioClx에서 구현되는 드라이버 지원 메서드 를 호출합니다. GpioClx는 GPIO 컨트롤러 드라이버에 의해 구현되는 이벤트 콜백 함수 를 호출합니다.

GPIO 컨트롤러 드라이버는 GPIO 컨트롤러 디바이스의 하드웨어 레지스터에 직접 액세스합니다.

GpioClx는 GPIO 핀에 물리적으로 연결하는 주변 디바이스에 대한 드라이버의 I/O 요청을 처리합니다. GpioClx는 이러한 I/O 요청을 GPIO 컨트롤러 드라이버에서 구현하는 이벤트 콜백 함수를 호출하여 수행하는 간단한 하드웨어 작업으로 변환합니다. 예를 들어 GPIO 핀 집합에서 데이터를 읽거나 데이터를 쓰기 위해 GpioClx는 CLIENT_ReadGpioPinsCLIENT_WriteGpioPins 같은 이벤트 콜백 함수를 호출합니다. GpioClx는 GPIO 컨트롤러에 대한 I/O 큐를 관리하므로 이 작업의 GPIO 컨트롤러 드라이버가 완화됩니다.

또한 GpioClx는 GPIO 컨트롤러 디바이스의 기본 인터럽트를 처리하고 이러한 인터럽트를 주변 장치 드라이버에서 처리하는 보조 인터럽트로 매핑합니다. 기본 인터럽트는 하드웨어 디바이스에서 생성되는 인터럽트입니다. 보조 인터럽트는 특정 기본 인터럽트 응답에서 운영 체제에 의해 생성됩니다. 기본 인터럽트와 보조 인터럽트는 모두 GSI(전역 시스템 인터럽트)로 식별됩니다. 하드웨어 플랫폼용 ACPI 펌웨어는 기본 인터럽트에서 GSI를 할당하고 런타임에 운영 체제가 보조 인터럽트에게 GSI를 할당합니다.

예를 들어 펌웨어는 GPIO 컨트롤러의 하드웨어 인터럽트에 GSI를 할당하고 운영 체제는 인터럽트 입력으로 구성된 GPIO 핀에 GSI를 할당합니다.

GpioClx는 GPIO 컨트롤러 디바이스에서 하드웨어에서 생성된 기본 인터럽트를 처리하는 ISR을 구현합니다. 주변 장치에서 GPIO 핀에서 인터럽트를 어설션하고 이 핀의 인터럽트를 사용하도록 설정하고 마스크를 해제하면 GPIO 컨트롤러가 프로세서를 중단합니다. 이에 대한 응답으로 커널 트랩 처리기는 GpioClx ISR을 실행하도록 예약합니다. 인터럽트를 발생시킨 GPIO 핀을 식별하기 위해 GpioClx ISR은 GPIO 컨트롤러 드라이버에 의해 구현되는 CLIENT_QueryActiveInterrupts 이벤트 콜백 함수를 호출합니다. 그런 다음 GpioClx ISR은 이 핀에 할당된 GSI를 조회하고 이 GSI를 HAL(하드웨어 추상화 계층)에 전달합니다. HAL은 이 GSI에 등록된 ISR을 호출하여 보조 인터럽트 를 생성합니다. 이 ISR은 원래 인터럽트 어설션된 주변 디바이스의 드라이버에 속합니다.

기본 및 보조 인터럽트에 대한 자세한 내용은 GPIO 인터럽트 를 참조하세요.

GPIO 핀을 사용하는 주변 장치용 드라이버

시작 시 플러그 앤 플레이(PnP) 관리자는 PnP 디바이스와 PnP가 아닌 디바이스를 모두 열거합니다. GPIO 핀에 대한 고정 연결이 있는 비 PnP 디바이스의 경우 PnP 관리자는 플랫폼 펌웨어를 쿼리하여 이러한 디바이스에 시스템 관리 하드웨어 리소스로 할당되는 GPIO 핀을 확인합니다.

주변 디바이스에 대한 KMDF 드라이버는 EvtDevicePrepareHardware 콜백 중에 할당된 하드웨어 리소스를 받습니다. 이러한 리소스에는 데이터 출력, 데이터 입력 또는 인터럽트 요청 입력으로 구성된 GPIO 핀이 포함될 수 있습니다.

GPIO I/O 리소스는 Windows 8 새로운 Windows 리소스 유형입니다. 이 리소스는 데이터 입력 또는 데이터 출력으로 사용할 수 있는 하나 이상의 GPIO 핀 집합으로 구성됩니다. 주변 장치 드라이버가 읽기용 GPIO I/O 리소스를 열면 드라이버는 리소스의 모든 핀을 데이터 입력으로 사용합니다. 드라이버가 쓰기용 GPIO I/O 리소스를 열면 드라이버는 리소스의 모든 핀을 데이터 출력으로 사용합니다. 주변 장치 드라이버가 GPIO I/O 핀 집합에 대한 논리적 연결을 여는 방법을 보여 주는 코드 예제는 다음 topics 참조하세요.

KMDF 드라이버를 GPIO I/O 핀에 연결

인터럽트 입력으로 구성된 GPIO 핀은 드라이버에 일반 Windows 인터럽트 리소스로 할당됩니다. 인터럽트 리소스 추상화는 예를 들어 프로그래밍 가능한 인터럽트 컨트롤러 대신 GPIO 핀에서 인터럽트를 구현할 수 있다는 사실을 숨깁니다. 따라서 드라이버는 GPIO 기반 인터럽트 리소스를 다른 인터럽트 리소스와 동일하게 처리할 수 있습니다.

GPIO I/O 리소스의 GPIO 핀에 액세스하려면 주변 장치 드라이버가 핀에 대한 논리적 연결을 열어야 합니다. KMDF 드라이버는 WdfIoTargetOpen 메서드를 호출하여 연결을 엽니다. 이 연결을 통해 드라이버는 GPIO 핀에 I/O 요청을 보낼 수 있습니다. 드라이버는 IOCTL_GPIO_READ_PINS 요청을 보내 이러한 핀에서 데이터를 읽거나(입력 핀인 경우) 또는 IOCTL_GPIO_WRITE_PINS 요청을 전송하여 출력 핀인 경우 데이터를 씁니다.

인터럽트 리소스의 GPIO 핀에서 인터럽트를 받으려면 주변 장치 드라이버가 ISR(인터럽트 서비스 루틴)을 등록하여 이 핀으로 구현된 인터럽트 리소스에서 인터럽트를 수신해야 합니다. KMDF 드라이버는 WdfInterruptCreate 메서드를 호출하여 ISR을 인터럽트에 연결합니다.