다음을 통해 공유


USB 호스트 컨트롤러 드라이버에서 I/O 요청 처리

UCX에서 보낸 I/O 요청을 처리하기 위한 호스트 컨트롤러 드라이버에 대한 모범 사례입니다.

UCX는 USB 버스의 디바이스에 대한 호스트 컨트롤러 드라이버에서 만든 모든 엔드포인트를 추적합니다. 허브 드라이버 또는 USB 디바이스 스택에서 더 높은 다른 드라이버에서 보낸 모든 데이터 전송 요청은 먼저 UCX에서 처리됩니다. UCX는 프레임워크 요청 개체를 올바른 엔드포인트 큐에 전달해야 합니다. 요청에 포함된 URB(USB 요청 블록)는 엔드포인트 핸들을 지정할 수 있습니다. 엔드포인트 핸들이 지정된 경우 UCX는 디바이스에 대해 있는 엔드포인트 중 해당 엔드포인트를 확인합니다. 지정된 엔드포인트 핸들이 있으면 요청이 엔드포인트의 큐로 전달됩니다. 지정된 엔드포인트 핸들을 찾을 수 없으면 요청이 실패합니다. 핸들이 지정되지 않은 경우 요청은 기본 엔드포인트에 대한 것이고 UCX는 해당 디바이스에 대한 호스트 컨트롤러 드라이버의 기본 엔드포인트 큐에 요청을 전달합니다.

기존 USB 드라이버와의 호환성을 보장하려면 호스트 컨트롤러가 URB 요청을 완료할 때 다음 요구 사항을 준수해야 합니다.

  • WdfRequestComplete 는 DISPATCH_LEVEL 호출해야 합니다.
  • URB가 프레임워크 큐에 전달되고 드라이버가 호출 드라이버의 스레드 또는 DPC에서 동기적으로 처리하기 시작한 경우 요청도 동기적으로 완료되지 않아야 합니다. WdfDpcEnqueue를 호출하여 예약할 수 있는 별도의 DPC에서 요청을 완료해야 합니다.
  • 이전 요구 사항과 마찬가지로 EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE 또는 EVT_WDF_REQUEST_CANCEL 수신할 때 호스트 컨트롤러 드라이버는 호출 스레드 또는 DPC와 별도의 DPC에서 URB 요청을 완료해야 합니다. 기본적으로 WDF는 큐에서 취소된 요청을 동기적으로 완료합니다. 이 동작으로 인해 URB 요청에 문제가 발생할 수 있습니다. 이러한 이유로 드라이버는 URB 큐에 대해 EvtIoCanceledOnQueue 콜백을 제공해야 합니다.

IOCTL_INTERNAL_USB_SUBMIT_URB 대한 프레임워크 요청 개체는 요청의 Parameters.Others.Arg1에 있는 URB를 포함합니다. 요청이 완료되면 URB 상태 USBD_STATUS_SUCCESS 또는 실패의 특성을 나타내는 오류 상태 설정해야 합니다. 오류 상태 값은 usb.h 헤더 파일에 정의되어 있습니다.