하드웨어 리소스 GPIO-Based
Windows 8 시작하여 GPIO 컨트롤러 드라이버에서 제어하는 GPIO(범용 I/O) 핀을 시스템 관리 하드웨어 리소스로 다른 드라이버에서 사용할 수 있습니다. 데이터 입력 또는 데이터 출력으로 구성된 핀인 GPIO I/O 핀은 새 Windows 리소스 유형인 GPIO I/O 리소스로 사용할 수 있습니다. 또한 인터럽트 요청 입력으로 구성된 핀인 GPIO 인터럽트 핀은 일반 Windows 인터럽트 리소스로 사용할 수 있습니다.
GPIO I/O 리소스는 주변 장치용 드라이버가 읽거나 쓸 수 있는 하나 이상의 GPIO 핀 집합을 나타냅니다. Windows는 GPIO I/O 핀의 기본 구현에 대한 세부 정보를 숨기므로 주변 장치 드라이버를 작성하여 추상 GPIO I/O 리소스를 조작할 수 있습니다. 이러한 추상 리소스를 사용하는 주변 장치 드라이버는 리소스를 구현하는 GPIO 컨트롤러 하드웨어에 관계없이 플랫폼에서 작동할 수 있습니다. GPIO I/O 리소스는 이 리소스를 기본 GPIO 핀 또는 핀을 소유하는 특정 GPIO 컨트롤러 드라이버와 연결하는 WDFIOTARGET 핸들로 표시됩니다.
일반적으로 GPIO 컨트롤러의 I/O 핀은 컨트롤러 하드웨어의 기능과 핀에 물리적으로 연결된 디바이스에 따라 입력 또는 출력을 위해 구성할 수 있습니다. 따라서 드라이버는 쓰기 또는 읽기 작업을 위해 이 핀에 대한 논리적 연결을 열 수 있지만 둘 다 열 수는 없습니다. 그러나 이 제약 조건은 GPIO 프레임워크 확장(GpioClx)이 아닌 하드웨어에 의해 부과됩니다. 하드웨어에서 입력 및 출력 모두에 대해 I/O 핀을 구성할 수 있는 경우 GpioClx를 사용하면 드라이버가 읽기 및 쓰기 작업 모두에 대해 핀에 대한 논리적 연결을 열 수 있습니다.
인터럽트 요청 입력으로 구성된 GPIO 핀의 경우 인터럽트 요청이 인터럽트 컨트롤러 또는 전용 인터럽트 요청 라인 대신 GPIO 핀에 의해 구현된다는 사실은 운영 체제에서 완전히 추상화됩니다. GPIO 인터럽트는 주변 장치 드라이버에 추상 인터럽트 리소스로 표시됩니다. 이러한 리소스의 추상화는 GPIO 드라이버 스택 및 HAL(하드웨어 추상화 계층)에서 지원됩니다. 따라서 인터럽트 리소스를 사용하는 주변 장치 드라이버는 이러한 리소스의 기본 구현에 대한 세부 정보를 대부분 무시할 수 있습니다. 자세한 내용은 GPIO 인터럽트 를 참조하세요.
다음 다이어그램에서는 GPIO 기반 리소스를 두 개의 주변 장치 드라이버에 할당하는 예제를 보여 줍니다.
위의 다이어그램에서 다음 세 가지 GPIO 기반 리소스에는 주변 장치 드라이버 A가 할당됩니다.
- 두 개의 데이터 입력 핀
- 데이터 출력 핀
- 인터럽트 입력 핀
다음 두 GPIO 기반 리소스는 주변 장치 드라이버 B에 할당됩니다.
- 데이터 입력 핀
- 인터럽트 입력 핀
드라이버 A와 B는 EvtDevicePrepareHardware 콜백 함수에서 할당된 리소스를 받습니다. 드라이버가 하나 이상의 GPIO I/O 핀 집합을 리소스로 수신하는 경우 드라이버는 이러한 핀에 대한 연결을 열어 액세스할 수 있습니다. 드라이버는 연결을 식별하기 위해 WDFIOTARGET 핸들을 가져오고 이 핀에서 읽거나 쓰기 위해 이 핸들에 I/O 요청을 보냅니다.
GPIO I/O 핀 집합에 연결하고 이 핀에 I/O 요청을 보내는 방법을 보여 주는 코드 예제는 다음 topics 참조하세요.
두 topics IoRoutine
코드 예제의 함수는 매개 변수 값에 따라 읽기 또는 쓰기에 대한 GPIO I/O 핀 리소스를 ReadOperation
엽니다. 리소스가 읽기용으로 열리는 경우(DesiredAccess
= GENERIC_READ), 리소스의 핀은 입력으로 구성되고 핀 리소스로 전송된 IOCTL_GPIO_READ_PINS 요청은 이러한 핀에서 입력 값을 읽습니다. GpioClx는 IOCTL_GPIO_WRITE_PINS 요청을 입력 핀 집합으로 보내는 것을 허용하지 않으며 STATUS_GPIO_OPERATION_DENIED 오류 상태 이러한 요청을 완료합니다. 마찬가지로 쓰기(DesiredAccess
= GENERIC_WRITE)에 대해 핀 리소스를 열면 리소스의 핀이 출력으로 구성되고 핀 리소스로 전송되는 IOCTL_GPIO_WRITE_PINS 요청은 이러한 핀을 구동하는 출력 래치의 값을 설정합니다. 일반적으로 출력 핀 집합에 IOCTL_GPIO_READ_PINS 요청을 보내면 출력 래치에 기록된 마지막 값을 읽습니다.
인터럽트 리소스를 사용하여 인터럽트를 수신하려면 클라이언트 드라이버가 인터럽트 ISR(인터럽트 서비스 루틴)을 인터럽트에 연결해야 합니다. 일반적으로 드라이버는 WdfInterruptCreate 메서드(또는 IoConnectInterruptEx 루틴)를 호출하여 이 연결을 만듭니다. KMDF 인터럽트에 대한 자세한 내용은 인터럽트 개체 만들기를 참조하세요.
하드웨어 플랫폼에 동적으로 연결되고 연결이 끊어질 수 있는 플러그 앤 플레이 디바이스와 달리 GPIO 컨트롤러 디바이스는 영구적으로 연결됩니다. 또한 GPIO 핀과 주변 장치 간의 연결은 영구적인 것으로 간주됩니다. (또는 슬롯에서 주변 장치를 분리할 수 있는 경우 슬롯은 이 디바이스 전용입니다.) 따라서 사용 가능한 GPIO 리소스는 고정되며 플랫폼 펌웨어에서 지정할 수 있습니다. 마찬가지로 GPIO 리소스를 사용하는 주변 장치 드라이버는 전용 GPIO 리소스 집합을 사용하는 것으로 간주됩니다. 따라서 이러한 디바이스 드라이버에 대한 리소스 요구 사항은 플랫폼 펌웨어에 지정할 수 있습니다.
플랫폼 펌웨어가 GPIO I/O 리소스로 GPIO 핀 집합을 지정하는 경우 펌웨어는 읽기, 쓰기 또는 읽기 및 쓰기 모두에 대해 이 리소스의 핀을 열 수 있는지 여부를 나타냅니다.
주변 장치 드라이버가 둘 이상의 GPIO I/O 리소스를 사용하는 경우 이 드라이버는 PnP 관리자가 이러한 리소스를 열거하는 순서를 알고 있어야 합니다. 예를 들어 드라이버가 두 개의 GPIO I/O 핀을 사용하지만 이러한 핀에 독립적으로 액세스해야 하는 경우 플랫폼 펌웨어는 각 핀을 별도의 GPIO I/O 리소스로 설명해야 합니다. PnP 관리자는 이러한 리소스를 플랫폼 펌웨어에 설명된 순서대로 열거합니다. 이 순서는 드라이버가 예상하는 순서와 일치해야 합니다.
주변 장치 드라이버가 GPIO I/O 리소스에 대한 연결을 열면 이 드라이버가 이 연결로 보내는 IOCTL_GPIO_READ_PINS 또는 IOCTL_GPIO_WRITE_PINS 요청이 리소스의 모든 핀에 액세스합니다. 드라이버가 이러한 핀의 하위 집합에만 액세스해야 하는 경우 이 하위 집합을 드라이버에 별도의 리소스로 할당해야 합니다.
데이터 입력 핀을 요청 출력 버퍼의 비트에 매핑하는 등 IOCTL_GPIO_READ_PINS 요청에 대한 자세한 내용은 IOCTL_GPIO_READ_PINS 참조하세요. 요청 입력 버퍼의 비트를 데이터 출력 핀에 매핑하는 등 IOCTL_GPIO_WRITE_PINS 요청에 대한 자세한 내용은 IOCTL_GPIO_WRITE_PINS.