Interrupt-Related 콜백
옵션으로 GPIO(범용 I/O) 컨트롤러용 드라이버는 GPIO 인터럽트를 지원할 수 있습니다. GPIO 인터럽트 지원을 위해 GPIO 컨트롤러 드라이버는 이러한 인터럽트 관리를 위한 콜백 함수 집합을 구현합니다. 드라이버에는 GPIO 프레임워크 확장(GpioClx)의 클라이언트로 등록할 때 드라이버가 제공하는 등록 패킷에 이러한 콜백 함수에 대한 포인터가 포함됩니다. 이 등록 패킷에 대한 자세한 내용은 GPIO_CLIENT_REGISTRATION_PACKET 참조하세요.
일반적으로 System on a Chip(SoC) 칩의 통합 부분인 GPIO 컨트롤러에는 SoC 칩의 프로세서에서 직접 액세스할 수 있는 메모리 매핑 하드웨어 레지스터가 있습니다. 그러나 다음 다이어그램과 같이 별도의 GPIO 컨트롤러 디바이스가 직렬 버스를 통해 SoC 칩에 외부에서 연결될 수 있습니다.
이 다이어그램에서 외부 GPIO 컨트롤러는 I²C 버스에 연결됩니다. 이 버스는 SoC 칩의 통합된 부분인 I²C 버스 컨트롤러에 의해 제어됩니다. 외부 GPIO 컨트롤러의 인터럽트 요청 줄이 통합 GPIO 컨트롤러의 핀에 연결됩니다. GpioClx DDI는 이 예제에서 통합 GPIO 컨트롤러와 외부 GPIO 컨트롤러를 모두 수용할 수 있습니다.
GPIO 컨트롤러 디바이스가 메모리 매핑된 경우 GPIO 컨트롤러 드라이버는 DIRQL에서 컨트롤러의 하드웨어 레지스터에 직접 액세스할 수 있습니다. 그러나 GPIO 컨트롤러가 직렬로 연결된 경우 GPIO 컨트롤러 드라이버는 수동 수준 ISR에 설명된 대로 IRQL = PASSIVE_LEVEL 하드웨어 레지스터에만 액세스할 수 있습니다.
메모리 매핑 하드웨어 레지스터가 있는 GPIO 컨트롤러의 드라이버는 드라이버가 GpioClx에 제공하는 디바이스 정보에 MemoryMappedController 플래그 비트를 설정해야 합니다. 그렇지 않으면 GpioClx는 하드웨어 레지스터가 메모리 매핑되지 않고 드라이버가 IRQL = PASSIVE_LEVEL 이러한 레지스터에만 액세스할 수 있다고 가정합니다. 이 플래그 비트에 대한 자세한 내용은 CONTROLLER_ATTRIBUTE_FLAGS 참조 하세요.
GpioClx는 GPIO 컨트롤러의 인터럽트 요청을 서비스하는 ISR(인터럽트 서비스 루틴)을 구현합니다. 이 ISR은 다음 인터럽트 관련 콜백 함수를 호출합니다.
CLIENT_ClearActiveInterruptsCLIENT_MaskInterruptsCLIENT_QueryActiveInterruptsCLIENT_QueryEnabledInterruptsCLIENT_UnmaskInterrupt 이러한 함수는 GPioClx의 ISR이 DIRQL에서 실행되는지 아니면 PASSIVE_LEVEL 실행되는지에 따라 DIRQL 또는 PASSIVE_LEVEL 호출됩니다. ISR은 MemoryMappedController = 1이면 DIRQL에서, PASSIVE_LEVEL 경우 MemoryMappedController = 0에서 이러한 함수를 호출합니다. 두 경우 모두 ISR은 이러한 함수 중 하나에 대한 호출이 이러한 함수 중 다른 함수에 대한 호출 중간에 발생하지 않도록 해당 콜백을 자동으로 직렬화합니다.
GPIO 프레임워크 확장은 MemoryMappedController 플래그가 설정되었는지 여부에 관계없이 PASSIVE_LEVEL 다음 인터럽트 관련 콜백 함수를 호출합니다.
CLIENT_DisableInterruptCLIENT_EnableInterruptMemoryMappedController 플래그가 설정되지 않으면 모든 인터럽트 관련 콜백 함수가 PASSIVE_LEVEL 호출됩니다. GpioClx는 이러한 함수 중 하나에 대한 호출이 이러한 함수의 다른 호출 중간에 발생하지 않도록 이러한 함수에 대한 호출을 자동으로 직렬화합니다.
그러나 MemoryMappedController 플래그가 설정된 경우 CLIENT_EnableInterrupt 및 CLIENT_DisableInterrupt 함수는 인터럽트 사용을 명시적으로 동기화하고 작업을 사용하지 않도록 설정해야 합니다. 이 함수는 DIRQL에서 다른 4개의 인터럽트 관련 콜백 함수를 호출하는 GpioClx ISR에 대해 작업을 사용하지 않도록 설정해야 합니다.
일반적으로 다른 CLIENT_Xxx 콜백 함수(이름에 "인터럽트"가 포함되어 있지 않음)는 인터럽트 관련 처리를 수행하지 않으므로 GpioClx ISR과 동기화할 필요가 없습니다. 그러나 이러한 함수가 PASSIVE_LEVEL 호출되고 DIRQL의 인터럽트 관련 함수에서 액세스하는 인터럽트 설정에 액세스하는 코드를 포함하는 경우 이 코드를 ISR에 동기화해야 합니다.
인터럽트 동기화를 지원하기 위해 GpioClx는 인터럽트 잠금 집합을 구현합니다. PASSIVE_LEVEL 실행되는 콜백 함수는 GPIO_CLX_AcquireInterruptLock 메서드를 호출하여 인터럽트 잠금을 획득하고 GPIO_CLX_ReleaseInterruptLock 메서드를 호출하여 잠금을 해제할 수 있습니다. 함수가 인터럽트 잠금을 보유하면 GpioClx ISR을 실행할 수 없으며 이 ISR은 인터럽트 관련 콜백 함수를 호출할 수 없습니다. GPIO 인터럽트 처리가 적시에 가능하도록 하려면 드라이버가 인터럽트 잠금을 필요 이상으로 유지해야 합니다.
자세한 내용은 GPIO 컨트롤러 드라이버에 대한 인터럽트 동기화를 참조하세요.