다음을 통해 공유


GpioClx DDI의 드라이버 지원 메서드

GPIO 프레임워크 확장(GpioClx)은 Windows 8 부터 사용할 수 있습니다. GpioClx DDI의 시스템 제공 메서드는 gpioClx 커널 모드 드라이버 Msgpioclx.sys 구현됩니다. 이 드라이버는 GpioClx 드라이버 지원 메서드에 대한 진입점을 내보냅니다. Windows 8 Msgpioclx.sys 운영 체제의 표준 구성 요소입니다.

빌드 시 GPIO 컨트롤러 드라이버는 GpioClx 스텁 라이브러리 Msgpioclxstub.lib의 DDI 진입점에 정적으로 연결됩니다. 런타임에 이 라이브러리는 필요한 드라이버 버전 협상을 수행하여 Msgpioclx.sys 해당 진입점에 동적으로 연결합니다.

특정 버전의 Msgpioclx.sys 필요한 GPIO 컨트롤러 드라이버는 버전 번호가 더 높은 Msgpioclx.sys 버전에 안전하게 연결할 수 있습니다. 그러나 이 드라이버는 버전 번호가 낮은 Msgpioclx.sys 버전에 연결할 수 없습니다.

드라이버 등록

GpioClx의 클라이언트로 등록하기 위해 GPIO 컨트롤러 드라이버는 GPIO_CLX_RegisterClient 메서드를 호출합니다. 일반적으로 드라이버는 DriverEntry 루틴에서 이 메서드를 호출합니다. 이 호출 중에 드라이버는 등록 패킷을 메서드에 전달합니다. 이 패킷에는 드라이버 구현 이벤트 콜백 함수 집합에 대한 포인터가 포함되어 있습니다. 이러한 함수는 GPIO 컨트롤러 디바이스의 하드웨어 레지스터에 액세스합니다. GpioClx는 이러한 함수를 호출하여 I/O 요청을 처리하고 인터럽트를 관리합니다.

GPIO 컨트롤러 드라이버는 GPIO_CLX_UnregisterClient 메서드를 호출하여 GpioClx에 대한 등록을 취소합니다. 일반적으로 드라이버는 EvtDriverUnload 이벤트 콜백 함수에서 이 메서드를 호출합니다.

디바이스 개체 초기화

GpioClx를 초기화하려면 GPIO 컨트롤러 드라이버가 EvtDriverDeviceAdd 콜백 함수에서 두 개의 GpioClx 메서드를 호출해야 합니다. 첫 번째 메서드 인 GPIO_CLX_ProcessAddDevicePreDeviceCreate 디바이스 개체를 만드는 WdfDeviceCreate 메서드를 호출하기 전에 호출해야 합니다. 두 번째 메서드 인 GPIO_CLX_ProcessAddDevicePostDeviceCreateWdfDeviceCreate 호출 후에 호출해야 합니다.

인터럽트 잠금

드라이버 구현 이벤트 콜백 함수의 대부분은 GPioClx에서 IRQL = PASSIVE_LEVEL 호출됩니다. 그러나 다음 목록의 콜백 함수는 CLIENT_QueryControllerBasicInformation 콜백 함수가 GpioClx에 제공하는 디바이스 정보에 따라 PASSIVE_LEVEL 또는 DIRQL에서 호출됩니다.

이러한 함수는 GPIO 컨트롤러의 하드웨어 레지스터가 메모리 매핑인지 여부에 따라 DIRQL 또는 PASSIVE_LEVEL 실행되는 GpioClx의 ISR(인터럽트 서비스 루틴)에서 호출됩니다.

CLIENT_QueryControllerBasicInformation 함수는 CLIENT_CONTROLLER_BASIC_INFORMATION 구조체 형태로 디바이스 정보를 제공합니다. MemoryMappedController 플래그 비트가 이 구조체의 Flags 멤버에 설정된 경우 GpioClx ISR은 DIRQL의 이전 목록에 있는 콜백 함수를 호출합니다. 그렇지 않으면 ISR은 PASSIVE_LEVEL 드라이버 구현 콜백 함수를 모두 호출합니다. 이 플래그 비트에 대한 자세한 내용은 인터럽트 관련 콜백을 참조하세요.

GpioClx는 PASSIVE_LEVEL 실행되고 GpioClx ISR에서 호출되지 않는 드라이버 구현 콜백 함수에 대한 호출을 자동으로 동기화합니다. 따라서 이러한 함수 중 하나만 한 번에 실행할 수 있습니다. 그러나 GpioClx는 이러한 PASSIVE_LEVEL 콜백을 GPioClx가 ISR에서 만드는 콜백과 자동으로 동기화하지 않습니다. 필요한 경우 GPIO 컨트롤러 드라이버는 이러한 동기화를 명시적으로 제공해야 합니다.

잠재적인 동기화 오류를 방지하기 위해 GpioClx는 GPIO 컨트롤러 드라이버가 획득하고 해제할 수 있는 인터럽트 잠금 을 구현합니다. 인터럽트 잠금은 주로 드라이버의 CLIENT_EnableInterruptCLIENT_DisableInterrupt 콜백 함수에서 사용됩니다. 드라이버는 GPIO_CLX_AcquireInterruptLock 메서드를 호출하여 잠금을 획득하고 GPIO_CLX_ReleaseInterruptLock 메서드를 호출하여 잠금을 해제합니다. 드라이버는 PASSIVE_LEVEL 호출되고 GpioClx의 ISR에서 호출되지 않는 콜백 함수에서 이러한 메서드를 호출합니다. 드라이버가 잠금을 보유하는 동안 GpioClx ISR을 실행할 수 없습니다. 드라이버는 ISR과 동기화해야 하는 중요한 작업 중에만 잠금을 짧게 유지해야 합니다.

GpioClx ISR이 드라이버 구현 콜백 함수를 호출하는 경우 ISR이 이미 잠금을 보유하고 있기 때문에 이 함수는 인터럽트 잠금을 획득(또는 해제)할 필요가 없습니다. 이 함수의 GPIO_CLX_AcquireInterruptLockGPIO_CLX_ReleaseInterruptLock 메서드에 대한 호출은 영향을 주지 않지만 오류로 처리되지 않습니다.