USB 드라이버

USB 버스용 커널 모드 스틸 이미지 드라이버는 여러 인터럽트, 대량 IN 및 대량 OUT 엔드포인트와 함께 단일 제어 엔드포인트를 지원합니다. 컨트롤 및 인터럽트 엔드포인트는 I/O 컨트롤 코드 및 DeviceIoControl을 사용하여 액세스할 수 있습니다. 대량 엔드포인트는 ReadFile 및 WriteFile 을 사용하여 액세스할 수 있습니다.

DeviceIoControl, ReadFile 또는 WriteFile을 호출하기 전에 CreateFile(Microsoft Windows SDK 설명서에 설명된 모든 항목)을 호출하여 디바이스 핸들을 가져와야 합니다. 각 엔드포인트 유형(제어, 인터럽트, 대량 IN, 대량 OUT)을 하나 이상 지원하지 않는 디바이스의 경우 CreateFile 을 한 번 호출하면 각 엔드포인트로의 전송 파이프가 열립니다.

여러 인터럽트 또는 대량 엔드포인트를 지원하는 디바이스의 경우 CreateFile 을 한 번 호출하면 각 유형의 가장 높은 번호의 엔드포인트로 전송 파이프가 열립니다. 다른 엔드포인트를 사용하려면 다음을 수행해야 합니다.

  1. deviceIoControl을 호출하여 IOCTL_GET_PIPE_CONFIGURATION I/O 제어 코드를 지정하여 포트의 엔드포인트 인덱스 번호(즉, 반환된 USBSCAN_PIPE_INFORMATION 구조 배열에 대한 인덱스)를 확인합니다. 이러한 인덱스 번호는 유니버설 직렬 버스 사양에 설명된 엔드포인트 번호가 아닙니다.

  2. CreateFile을 호출할 때 IStiDeviceControl::GetMyDevicePortName 에서 반환하는 포트 이름에 백슬래시 및 엔드포인트의 인덱스 번호를 추가합니다.

예를 들어 포트 이름이 "usbscan0"인 디바이스에 다음과 같이 인덱스 번호가 있는 각 유형의 두 엔드포인트(인터럽트, bulk IN, bulk OUT)가 있다고 가정합니다.

인덱스 Type 끝점#
0 Interrupt 0x01
1 Bulk IN 0x82
2 Bulk IN 0x83
3 대량 출력 0x04
4 대량 출력 0x05
5 Interrupt 0x06

포트 이름이 "usbscan0"인 CreateFile 을 호출하는 경우 함수는 컨트롤 엔드포인트뿐만 아니라 인덱스 값이 2, 4 및 5인 엔드포인트로의 전송 파이프를 엽니다.

포트 이름이 "usbscan0\1"인 CreateFile 을 호출하는 경우 함수는 컨트롤 엔드포인트뿐만 아니라 인덱스 값이 1, 4 및 5인 엔드포인트로 파이프 전송을 엽니다.

이 디바이스의 경우 인터럽트 엔드포인트 0, bulk IN 엔드포인트 1 및 bulk OUT 엔드포인트 3을 사용하려면 CreateFile 을 세 번 호출하여 "usbscan0\0", "usbscan0\1" 및 "usbscan0\3"의 포트 이름을 지정합니다. 이렇게 하면 세 개의 디바이스 핸들이 만들어집니다. DeviceIoControl, ReadFile 또는 WriteFile에 대한 후속 호출이 이루어질 때마다 원하는 파이프와 연결된 디바이스 핸들을 지정해야 합니다.

하나의 컨트롤 엔드포인트만 지원되므로 컨트롤 파이프를 사용하는 I/O 컨트롤 코드를 지정하면 드라이버가 CreateFile에 지정된 엔드포인트(있는 경우)에 관계없이 적절한 엔드포인트를 사용합니다.

모든 I/O 컨트롤 코드에 대한 설명은 USB 스틸 이미지 I/O 컨트롤 코드를 참조하세요.

커널 모드 USB 드라이버는 패키지 또는 메시지 프로토콜을 구현하지 않습니다. 읽기 작업에는 특정 패킷 맞춤이 필요하지 않지만 읽기 요청이 최대 패킷 크기 경계에 맞춰지면 더 나은 성능을 달성할 수 있습니다. 최대 패킷 크기는 IOCTL_GET_CHANNEL_ALIGN_RQST I/O 제어 코드를 사용하여 가져올 수 있습니다.