Windows의 USB 호스트 쪽 드라이버

이 문서에서는 USB(유니버설 직렬 버스) 드라이버 스택 아키텍처에 대한 개요를 제공합니다.

다음 그림에서는 Windows용 USB 드라이버 스택의 아키텍처 블록 다이어그램을 보여줍니다. 다이어그램은 USB 2.0 및 USB 3.0용 별도의 USB 드라이버 스택을 보여줍니다. 장치가 xHCI 컨트롤러에 연결되면 Windows에서 USB 3.0 드라이버 스택을 로드합니다.

USB 2.0 및 3.0 드라이버 스택에 대한 아키텍처 블록 다이어그램

Windows는 eHCI, oHCI 또는 uHCI 컨트롤러에 연결된 디바이스에 대한 USB 2.0 드라이버 스택을 로드합니다. USB 2.0 드라이버 스택은 Windows XP SP1(서비스 팩 1) 이상 버전의 Windows 운영 체제와 함께 제공됩니다.

USB 3.0 드라이버 스택

Microsoft는 KMDF(커널 모드 드라이버 프레임워크) 인터페이스를 사용하여 USB 3.0 드라이버를 만들었습니다. KMDF 드라이버 모델은 복잡성을 줄이고 안정성을 개선합니다.

USB 3.0 호스트 컨트롤러 드라이버(Usbxhci.sys)

xHCI 드라이버는 USB 3.0 호스트 컨트롤러 드라이버입니다. xHCI 드라이버의 책임에는 xHCI 컨트롤러 하드웨어에 대한 MMIO 레지스터 및 호스트 메모리 기반 데이터 구조를 초기화하고, 상층 드라이버에서 전송 요청을 전송 요청 블록으로 매핑하고, 요청을 하드웨어에 제출하는 작업이 포함됩니다. 전송을 완료한 후 드라이버는 하드웨어에서 전송 완료 이벤트를 처리하고 드라이버 스택에 이벤트를 전파합니다. 또한 xHCI 컨트롤러 디바이스 슬롯 및 엔드포인트 컨텍스트를 제어합니다.

Windows는 호스트 컨트롤러에 대한 디바이스 스택에서 xHCI 드라이버를 FDO(함수 디바이스 개체)로 로드합니다.

USB 호스트 컨트롤러 확장(Ucx01000.sys)

USB 호스트 컨트롤러 확장 드라이버(KMDF에 대한 확장)는 xHCI 드라이버와 같은 기본 클래스별 호스트 컨트롤러 드라이버에 대한 새로운 확장입니다. 새 드라이버는 확장 가능하며 향후 개발될 것으로 예상되는 다른 유형의 호스트 컨트롤러 드라이버를 지원하도록 설계되었습니다. USB 호스트 컨트롤러 확장은 허브 드라이버에 대한 일반적인 추상화된 인터페이스 역할을 하며, 호스트 컨트롤러 드라이버에 요청을 큐에 대기하기 위한 일반 메커니즘을 제공하며, 선택한 특정 함수를 재정의합니다. 상위 드라이버에서 시작한 모든 I/O 요청은 xHCI 드라이버 이전에 호스트 컨트롤러 확장 드라이버에 도달합니다. I/O 요청을 받으면 호스트 컨트롤러 확장은 요청의 유효성을 검사한 다음, 대상 엔드포인트와 연결된 적절한 KMDF 큐에 요청을 전달합니다. xHCI 드라이버는 처리 준비가 되면 큐에서 요청을 검색합니다. USB 호스트 컨트롤러 확장 드라이버의 책임은 다음과 같습니다.

  • xHCI 드라이버에 USB 관련 개체를 제공합니다.
  • xHCI 드라이버에 KMDF 이벤트 콜백 루틴을 제공합니다.
  • 호스트 컨트롤러와 연결된 루트 허브의 작업을 관리하고 제어합니다.
  • 연결된 MDL, 스트림 등 클라이언트 드라이버에서 구성할 수 있는 기능을 구현합니다.

USB 허브 드라이버(Usbhub3.sys)

새 허브 드라이버는 3.0 디바이스용 USB 드라이버 스택에서 KMDF 드라이버 모델을 사용합니다. 허브 드라이버는 주로 다음 작업을 수행합니다.

  • USB 허브 및 해당 포트를 관리합니다.
  • 다운스트림 포트에 연결된 디바이스 및 기타 허브를 열거합니다.
  • 열거된 디바이스 및 허브에 대한 PDO(물리적 디바이스 개체)를 만듭니다.

Windows는 허브 디바이스 스택에서 허브 드라이버를 FDO로 로드합니다. 새 드라이버의 디바이스 열거형 및 허브 관리는 상태 컴퓨터 집합을 통해 구현됩니다. 허브 드라이버는 전원 관리 및 PnP 함수에 KMDF를 사용합니다. 허브 관리 외에도 허브 드라이버는 USB 클라이언트 드라이버 계층에서 보낸 특정 요청의 예비 검사 및 처리를 수행합니다. instance 경우 허브 드라이버는 select-configuration 요청을 구문 분석하여 요청에 의해 구성될 엔드포인트를 결정합니다. 정보를 구문 분석한 후 허브 드라이버는 USB 호스트 컨트롤러 확장 또는 추가 처리에 요청을 제출합니다.

USB 2.0 드라이버 스택

Windows는 eHCI, oHCI 또는 uHCI 컨트롤러에 연결된 디바이스에 대한 USB 2.0 드라이버 스택을 로드합니다. USB 2.0 드라이버 스택의 드라이버는 WINDOWS 운영 체제의 SP1 이상 버전과 함께 Windows XP에 제공됩니다. USB 2.0 드라이버 스택은 USB 2.0 사양에 정의된 고속 USB 디바이스를 용이하게 하도록 설계되었습니다.

USB 드라이버 스택의 맨 아래에 호스트 컨트롤러 드라이버가 있습니다. 포트 드라이버, Usbport.sys 및 동시에 실행되는 세 개의 미니포트 드라이버 중 하나 이상으로 구성됩니다. 시스템에서 호스트 컨트롤러 하드웨어를 검색하면 이러한 미니포트 드라이버 중 하나가 로드됩니다. 미니포트 드라이버는 로드된 후 포트 드라이버를 로드하고 Usbport.sys. 포트 드라이버는 특정 프로토콜과 독립적인 호스트 컨트롤러 드라이버의 업무에서 이러한 측면을 처리합니다.

Usbuhci.sys(유니버설 호스트 컨트롤러 인터페이스) 미니포트 드라이버는 Windows 2000과 함께 제공되는 Uhcd.sys 미니클래스 드라이버를 대체합니다. Usbohci.sys(열린 호스트 컨트롤러 인터페이스) 미니포트 드라이버는 Openhci.sys 대체합니다. Usbehci.sys 미니포트 드라이버는 고속 USB 디바이스를 지원하며 WINDOWS XP SP1 이상 및 Windows Server 2003 이상 운영 체제에서 도입되었습니다.

USB 2.0을 지원하는 모든 버전의 Windows에서 운영 체제는 USB 1.1 및 USB 2.0 호스트 컨트롤러를 동시에 관리할 수 있습니다. 운영 체제에서 두 가지 유형의 컨트롤러가 모두 있음을 감지할 때마다 각 호스트 컨트롤러에 대해 하나씩 두 개의 개별 디바이스 노드를 만듭니다. 이후 Windows는 USB 2.0 규격 호스트 컨트롤러 하드웨어용 Usbehci.sys 미니포트 드라이버를 로드하고 시스템 구성에 따라 USB 1.1 규격 하드웨어에 대한 Usbohci.sys 또는 Openhci.sys 로드합니다.

포트 드라이버 위에는 허브 드라이버라고도 하는 USB 버스 드라이버 Usbhub.sys 있습니다. 시스템의 각 허브에 대한 디바이스 드라이버입니다.

USB 공통 클래스 제네릭 부모 드라이버(Usbccgp.sys)

USB 공통 클래스 일반 부모 드라이버는 복합 디바이스에 대해 Microsoft에서 제공하는 부모 드라이버입니다. deviceClass가 0이거나 0xef numInterfaces가 디바이스 설명자에서 1보다 큰 경우 허브 드라이버가 부모 복합 드라이버를 열거하고 로드합니다. 허브 드라이버는 부모 복합 드라이버의 호환 ID를 "USB\COMPOSITE"로 생성합니다. Usbccgp.sys WDM(Windows 드라이버 모델) 루틴을 사용합니다.

부모 복합 드라이버는 복합 디바이스의 모든 함수를 열거하고 각 함수에 대해 PDO를 만듭니다. 이렇게 하면 디바이스의 각 함수에 대해 적절한 클래스 또는 클라이언트 드라이버가 로드됩니다. 각 함수 드라이버(자식 PDO)는 부모 드라이버에 요청을 보내 USB 허브 드라이버에 제출합니다.

Usbccgp.sys WINDOWS 운영 체제의 SP1 이상 버전이 포함된 Windows XP에 포함되어 있습니다. Windows 8 드라이버는 USB 3.0 사양에 정의된 대로 함수 일시 중단 및 원격 절전 모드 해제 기능을 구현하도록 업데이트되었습니다.

자세한 내용은 USB 일반 부모 드라이버(Usbccgp.sys)를 참조하세요.

WinUSB(Winusb.sys)

Windows USB(WinUSB)는 USB 디바이스용 Microsoft에서 제공하는 일반 드라이버입니다. WinUSB 아키텍처는 커널 모드 드라이버(Winusb.sys) 및 사용자 모드 동적 링크 라이브러리(Winusb.dll)로 구성됩니다. 사용자 지정 함수 드라이버가 필요하지 않은 디바이스의 경우 Winusb.sys 함수 드라이버로 디바이스의 커널 모드 스택에 설치할 수 있습니다. 그런 다음 사용자 모드 프로세스는 디바이스 I/O 제어 요청 집합을 사용하거나 WinUsb_Xxx 함수를 호출하여 Winusb.sys 통신할 수 있습니다. 자세한 내용은 WinUSB를 참조하세요.

Windows 8 WinUSB, Winusb.inf에 대한 Microsoft 제공 정보(INF) 파일에는 USB\MS_COMP_WINUSB 디바이스 식별자 문자열로 포함되어 있습니다. 이렇게 하면 Winusb.sys MS OS 설명자에서 WinUSB 호환 ID가 일치하는 디바이스의 함수 드라이버로 자동으로 로드됩니다. 이러한 디바이스를 WinUSB 디바이스라고 합니다. 하드웨어 제조업체는 WinUSB 디바이스에 대한 INF 파일을 배포할 필요가 없으므로 최종 사용자가 드라이버 설치 프로세스를 더 간단하게 수행할 수 있습니다. 자세한 내용은 WinUSB 디바이스를 참조하세요.

USB 클라이언트 드라이버

복합 또는 복합이 아닌 각 USB 디바이스는 클라이언트 드라이버에서 관리됩니다. USB 클라이언트 드라이버는 USB 드라이버 스택의 클라이언트인 클래스 또는 디바이스 드라이버입니다. 이러한 드라이버에는 Microsoft 또는 타사 공급업체의 클래스 및 디바이스별 드라이버가 포함되었습니다. Microsoft에서 제공하는 클래스 드라이버 목록을 보려면 지원되는 USB 디바이스 클래스용 드라이버를 참조하세요. 클라이언트 드라이버는 USB 드라이버 스택에 의해 노출되는 공용 인터페이스를 호출하여 디바이스와 통신하는 요청을 만듭니다.

복합 디바이스의 클라이언트 드라이버는 드라이버 스택의 위치를 제외하고 비 복합 디바이스의 클라이언트 드라이버와 다르지 않습니다.

비 복합 디바이스에 대한 클라이언트 드라이버는 허브 드라이버 바로 위에 계층화됩니다.

여러 함수를 노출하고 부모 클래스 드라이버가 없는 복합 USB 디바이스의 경우 Windows는 허브 드라이버와 클라이언트 드라이버 계층 간에 USB 일반 부모 드라이버(Usbccgp.sys) 를 로드합니다. 부모 드라이버는 복합 디바이스의 각 함수에 대해 별도의 PDO를 만듭니다. 클라이언트 드라이버(함수의 경우 FDO)는 제네릭 부모 드라이버 위에 로드됩니다. 공급업체는 각 함수에 대해 별도의 클라이언트 드라이버를 제공하도록 선택할 수 있습니다.

USB 클라이언트 드라이버는 드라이버의 요구 사항에 따라 사용자 모드 또는 커널 모드에서 실행할 수 있습니다. USB 클라이언트 드라이버는 KMDF, UMDF 또는 WDM 루틴을 사용하여 작성할 수 있습니다.

클라이언트 드라이버용 도우미 라이브러리

Microsoft는 커널 모드 드라이버 및 애플리케이션이 USB 드라이버 스택과 통신하는 데 도움이 되는 다음과 같은 도우미 라이브러리를 제공합니다.

  • Usbd.sys

    Microsoft는 USB 클라이언트 드라이버에 대한 루틴을 내보내는 Usbd.sys 라이브러리를 제공합니다. 도우미 루틴은 클라이언트 드라이버의 운영 작업을 간소화합니다. instance 경우 USB 클라이언트 드라이버는 도우미 루틴을 사용하여 구성 선택과 같은 특정 작업에 대해 USB URL(요청 블록)을 빌드하고 해당 URL을 USB 드라이버 스택에 제출할 수 있습니다.

  • Usbdex.lib

    이 도우미 라이브러리는 Windows 8 새로운 기능입니다. 라이브러리는 주로 URL을 할당하고 빌드하기 위한 루틴을 내보냅니다. 이러한 루틴은 Usbd.sys 내보낸 일부 레거시 루틴을 대체합니다. 새 루틴을 사용하려면 클라이언트 드라이버가 등록 핸들을 유지하는 USB 드라이버 스택에 등록해야 합니다. 해당 핸들은 다른 Usbdex.lib 루틴에 대한 호출에 사용됩니다. 새 루틴에 의해 할당된 특정 URL에는 USB 드라이버가 더 나은 추적 및 처리를 위해 사용하는 URB 컨텍스트가 있습니다. 자세한 내용은 URL 할당 및 빌드를 참조하세요.

  • Winusb.dll

    Winusb.dll 커널 모드에서 디바이스의 함수 드라이버로 로드되는 Winusb.sys 통신하기 위한 WinUSB 함수를 노출하는 사용자 모드 DLL입니다. 애플리케이션은 이러한 함수를 사용하여 디바이스를 구성하고, 디바이스에 대한 정보를 검색하고, I/O 작업을 수행합니다. 이러한 함수 사용에 대한 자세한 내용은 WinUSB 함수를 사용하여 USB 디바이스에 액세스하는 방법을 참조하세요.