다음을 통해 공유


SerCx2-Managed 직렬 포트의 디바이스용 주변 장치 드라이버

일반적으로 SerCx2에서 관리하는 직렬 포트는 주변 디바이스에 영구적으로 연결됩니다. 이 디바이스는 I/O 요청을 직렬 포트로 보내는 주변 장치 드라이버에 의해 제어됩니다. 이러한 요청은 디바이스와 데이터를 전송하고 직렬 포트의 상태를 구성합니다. 주변기기 드라이버에서 보낸 I/O 요청은 SerCx2 및 연결된 직렬 컨트롤러 드라이버에서 공동으로 처리됩니다.

직렬 컨트롤러는 SoC(System on a Chip) 통합 회로에 포함된 경우가 많습니다. SoC 칩에서 직렬 컨트롤러의 직렬 포트에 연결될 수 있는 주변 장치의 예로는 GPS, 무선 LAN, 카메라 및 Bluetooth 디바이스가 있습니다.

직렬로 연결된 주변 디바이스의 주변 장치 드라이버는 일반적으로 KMDF( 커널 모드 드라이버 프레임워크 ) 또는 UMDF( 사용자 모드 드라이버 프레임워크 ) 드라이버입니다. 이 디바이스와 통신하려면 주변 장치 드라이버가 먼저 직렬 컨트롤러에 대한 논리적 연결을 열고 드라이버가 I/O 요청을 보낼 수 있는 파일 핸들을 받아야 합니다. 자세한 내용은 SerCx2-Managed 직렬 포트 열기를 참조하세요.

이 페이지에서

직렬 드라이버 아키텍처

다음 블록 다이어그램은 주변 장치(다이어그램 아래쪽)와 이 디바이스의 주변 장치 드라이버(다이어그램 맨 위) 간의 통신 경로를 형성하는 소프트웨어 및 하드웨어 계층을 보여 줍니다. 이 예제에서 주변 장치는 직렬 컨트롤러의 포트 및 GPIO 컨트롤러의 인터럽트 핀에 연결됩니다.

SerCx2 관리 직렬 포트의 주변 디바이스에 대한 소프트웨어 및 하드웨어 계층을 보여 주는 다이어그램

이 예제의 주변 장치 드라이버는 주변 장치 디바이스에 I/O 요청을 보내는 UMDF 드라이버입니다. 이러한 요청은 다이어그램의 왼쪽에 표시된 통신 경로를 통해 이동합니다. 요청은 SerCx2 및 직렬 컨트롤러 드라이버에서 처리됩니다. 주변 장치 드라이버는 직렬 포트의 하드웨어 구성을 설정하고(예: 전송 속도 변경) 직렬 포트를 통해 주변 장치와 데이터를 전송하는 I/O 작업을 요청할 수 있습니다. 자세한 내용은 I/O 요청 경로를 참조하세요.

주변 장치의 인터럽트는 이전 다이어그램의 오른쪽에 있는 통신 경로를 통해 위쪽으로 이동합니다. 이 다이어그램의 오른쪽 아래 모서리에 표시된 것처럼 주변 장치의 인터럽트 핀은 GPIO(범용 I/O) 컨트롤러의 핀에 연결됩니다. 이 GPIO 핀은 주변 장치에서 인터럽트 신호를 받도록 구성됩니다. SoC 기반 하드웨어 플랫폼에서 GPIO 컨트롤러는 프로그래밍 가능한 인터럽트 컨트롤러의 역할을 자주 수행합니다. 자세한 내용은 인터럽트 경로를 참조하세요.

다이어그램에 회색으로 표시된 두 블록은 시스템 제공 모듈입니다. GPIO 프레임워크 확장(GpioClx)은 Windows 8 시작하여 사용할 수 있습니다. SerCx2와 마찬가지로 GpioClx는 KMDF에 대한 확장입니다. GpioClx는 다양한 GPIO 컨트롤러에 공통적인 함수를 수행합니다. GpioClx는 GPIO 컨트롤러의 모든 하드웨어 관련 작업을 관리하는 GPIO 컨트롤러 드라이버와 함께 작동합니다. 자세한 내용은 GPIO 드라이버 지원 개요를 참조하세요.

I O 요청 경로

주변 장치로 데이터를 전송하기 위해 주변 장치 드라이버는 직렬 컨트롤러에 쓰기(IRP_MJ_WRITE) 요청을 보냅니다. 주변 장치에서 데이터를 수신하기 위해 주변 장치 드라이버는 직렬 컨트롤러에 읽기(IRP_MJ_READ) 요청을 보냅니다.

또한 Windows는 주변 드라이버가 직렬 컨트롤러와 관련된 다양한 I/O 제어 작업을 수행하는 데 사용할 수 있는 IOCTL(디바이스 I/O 제어 요청) 집합을 정의합니다. 다음은 주변 장치 드라이버가 요청할 수 있는 I/O 제어 작업의 예입니다.

  • 직렬 포트가 데이터를 전송하고 수신하는 전송 속도를 설정합니다.
  • 읽기 및 쓰기 요청에 대한 제한 시간 간격을 설정합니다.
  • 주변 장치 드라이버가 알림을 수신하는 직렬 포트에서 하드웨어 이벤트 집합을 지정합니다.

SerCx2는 SerCx(직렬 프레임워크 확장)의 받은 편지함 직렬 드라이버, Serial.sys 및 버전 1과 동일한 많은 직렬 IOCTL을 지원합니다. 자세한 내용은 다음을 참조하세요.

  • SerCx2가 특정 직렬 IOCTL을 지원하는지 여부를 확인하려면 직렬 I/O 요청 인터페이스 의 표를 참조하세요.
  • Windows 직렬 I/O 요청 인터페이스에 의해 정의된 모든 직렬 IOCTL에 대한 자세한 설명은 직렬 디바이스 제어 요청을 참조하세요.
  • Serial.sys, SerCx 및 SerCx2에 대한 간략한 소개는 직렬 컨트롤러 드라이버 개요 를 참조하세요.

인터럽트 경로

직렬 드라이버 아키텍처 다이어그램에 표시된 것처럼 주변 장치 디바이스는 GPIO 핀을 사용하여 디바이스 인터럽트 를 주변 장치 드라이버에 보냅니다. 주변 장치의 인터럽트 신호에 대한 응답으로 GPIO 컨트롤러는 하드웨어 인터럽트( 기본 인터럽트라고 함)를 프로세서에 신호합니다. 운영 체제는 이 인터럽트를 GpioClx의 ISR로 전달합니다. 다음으로 GpioClx는 인터럽트를 발생시킨 GPIO 핀을 식별하고 주변 장치에서 가상 인터럽트( 보조 인터럽트라고 함)에 대한 GSI(전역 시스템 인터럽트) 식별자를 조회합니다. GpioClx는 HAL에 GSI를 제공하고 HAL은 주변 장치 드라이버의 ISR을 호출합니다. 인터럽트 처리를 위해 주변 장치 드라이버는 일반적으로 SerCx2 및 직렬 컨트롤러 드라이버를 통해 하나 이상의 I/O 요청을 주변 장치로 보냅니다. 기본 및 보조 인터럽트에 대한 자세한 내용은 GPIO 인터럽트 를 참조하세요.

GPIO 인터럽트는 주변 장치 드라이버가 주변 디바이스에서 하드웨어 이벤트에 대한 알림을 수신하는 한 가지 방법일 뿐입니다. 또 다른 방법은 특정 유형의 하드웨어 이벤트가 직렬 포트에서 발생할 때 주변 장치 드라이버가 SerCx2 및 직렬 컨트롤러 드라이버에서 알림을 요청하는 것입니다. 예를 들어 주변 장치 드라이버는 직렬 컨트롤러가 주변 장치 디바이스에서 직렬 데이터를 수신할 때 알림을 받도록 요청할 수 있습니다. 이러한 알림을 요청하기 위해 주변 장치 드라이버는 주변 디바이스에 IOCTL_SERIAL_SET_WAIT_MASK 요청을 보내 모니터링할 이벤트 집합을 지정한 다음, IOCTL_SERIAL_WAIT_ON_MASK 요청을 보내 이러한 이벤트 수신 대기를 시작합니다. 이러한 요청은 직렬 컨트롤러 드라이버의 도움을 받아 SerCx2에서 처리됩니다. 주변 장치 드라이버가 모니터링할 수 있는 이벤트 유형에 대한 자세한 내용은 IOCTL_SERIAL_SET_WAIT_MASK 설명된 SERIAL_EV_XXX를 참조하세요.

그러나 직렬 컨트롤러는 D0 디바이스 전원 상태일 때만 하드웨어 이벤트를 검색할 수 있습니다. 직렬 컨트롤러가 저전력 상태인 경우 주변 장치 드라이버는 직렬 컨트롤러의 알림에 의존하여 주변 장치에 드라이버가 읽을 새 데이터가 있는 경우를 알 수 없습니다. 이 경우 주변 장치는 GPIO 핀을 통해 인터럽트 신호(또는 절전 모드 해제 신호)를 보내야 합니다. GPIO 컨트롤러는 전원을 거의 사용하지 않으며 대부분의 다른 디바이스가 저전력 상태로 진입한 후에도 일반적으로 활성 상태로 유지됩니다.