SPB 연결 주변 장치에서 인터럽트

PCI와 같은 버스와 달리 I2C 또는 SPI와 같은 간단한 SPB(주변 버스)는 주변 장치에서 프로세서로 인터럽트 요청을 전달하는 표준화된 버스 관련 수단을 제공하지 않습니다. 대신 SPB 연결 주변 장치는 SPB 및 SPB 컨트롤러 외부에 있는 별도의 하드웨어 경로를 통해 인터럽트 신호를 보냅니다. 이 인터럽트 경로의 세부 정보는 하드웨어 플랫폼마다 다르지만 Windows는 SPB 연결 주변 장치용 드라이버에서 이러한 세부 정보를 숨겨 드라이버가 다양한 하드웨어 플랫폼에서 작동할 수 있도록 합니다.

일반적으로 SPB 연결 주변 디바이스의 인터럽트 요청 줄은 GPIO(범용 I/O) 컨트롤러의 핀에 연결되고 GPIO 컨트롤러는 디바이스에서 프로세서로 인터럽트를 릴레이합니다. 자세한 내용은 GPIO 인터럽트 를 참조하세요.

주변 장치 드라이버는 추상 Windows 인터럽트 리소스(CmResourceTypeInterrupt)로 이 GPIO 인터럽트를 획득하고 인터럽트를 드라이버의 ISR(인터럽트 서비스 루틴)에 연결합니다. 인터럽트 리소스 추상화는 드라이버에서 인터럽트 플랫폼별 세부 정보를 숨깁니다. 예를 들어 드라이버는 GPIO 핀 또는 다른 원본에서 인터럽트 수신 여부와 같은 세부 정보를 무시할 수 있습니다. 이 추상화 유지를 위해 DIRQL에서 실행되는 커널의 인터럽트 트랩 처리기는 GPIO 핀에서 인터럽트를 지우거나 일시적으로 마스킹하여 활성 인터럽트 요청을 비워야 할 수 있습니다. GPIO 컨트롤러의 하드웨어 레지스터는 일반적으로 메모리 매핑되며 DIRQL에서 액세스할 수 있습니다.

반면 SPB 연결 주변 장치는 메모리 매핑되지 않으며 이 디바이스의 ISR은 일반적으로 IRQL = PASSIVE_LEVEL 실행해야 합니다. 디바이스의 하드웨어 레지스터에 액세스하기 위해 ISR은 SPB를 통해 직렬 전송을 수행하기 위해 I/O 요청을 보냅니다. 이러한 전송은 비교적 느리며 DIRQL에서 실행되는 ISR에서 수행할 수 없습니다. 그러나 수동 수준 ISR은 I/O 요청을 동기적으로 보낸 다음 요청이 완료될 때까지 차단할 수 있습니다.

에지 트리거 인터럽트의 경우 커널의 트랩 처리기는 GPIO 핀에서 인터럽트 요청을 자동으로 지우고 디바이스의 ISR이 수동 수준에서 실행되도록 예약합니다. 트랩 처리기가 반환된 후 동일한 인터럽트 발생을 방지하려면 트랩 처리기가 인터럽트 지우기를 취소해야 합니다.

수준 트리거 인터럽트의 경우 커널의 인터럽트 트랩 처리기는 GPIO 핀에서 인터럽트 요청을 자동으로 마스킹한 다음 디바이스의 ISR이 수동 수준에서 실행되도록 예약합니다. ISR은 디바이스에서 인터럽트 요청을 지워야 합니다. ISR이 반환되면 커널은 GPIO 핀에서 인터럽트 요청의 마스크를 해제합니다.

디바이스의 수동 수준 ISR은 인터럽트의 초기 서비스만 수행한 다음, 다른 디바이스에 대해 수동 수준 ISR이 지연되지 않도록 반환해야 합니다. 일반적으로 드라이버는 ISR보다 낮은 우선 순위로 실행되는 인터럽트 작업자 스레드에 대한 추가 인터럽트 관련 처리를 연기해야 합니다.

Windows 8 UMDF(사용자 모드 드라이버 프레임워크)는 UMDF 드라이버에 대한 ISR을 지원합니다. SPB 주변 디바이스에 대한 UMDF 드라이버는 IWDFDevice3::CreateInterrupt 메서드를 호출하여 ISR을 디바이스의 인터럽트에 연결합니다. 디바이스가 인터럽트 요청에 신호를 보낼 때 커널의 트랩 처리기는 ISR이 수동 수준에서 실행되도록 예약합니다. 자세한 내용은 하드웨어 액세스 및 인터럽트 처리를 참조하세요.

Windows 8 시작하여 KMDF(커널 모드 드라이버 프레임워크)는 수동 수준 ISR을 지원합니다. SPB 주변 디바이스에 대한 KMDF 드라이버는 WdfInterruptCreate 메서드를 호출하여 수동 수준 ISR을 디바이스의 인터럽트에 연결합니다. 이 메서드의 입력 매개 변수 중 하나는 인터럽트 구성 정보를 포함하는 WDF_INTERRUPT_CONFIG 구조체에 대한 포인터입니다. 수동 수준에서 실행되도록 ISR을 구성하려면 이 구조체의 PassiveHandling 멤버를 TRUE로 설정합니다. 자세한 내용은 Passive-Level 인터럽트 지원을 참조하세요.