이 문서에서는 USB 대역폭의 신중한 관리에 관한 지침을 제공합니다. 모든 USB 클라이언트 드라이버가 사용하는 USB 대역폭을 최소화하고 사용하지 않는 대역폭을 가능한 한 빨리 사용 가능한 대역폭 풀로 반환해야 합니다.
USB 드라이버에 대역폭 초과 오류가 발생하는 이유는 무엇인가요?
USB 버스의 대역폭 경쟁은 하드웨어와 소프트웨어의 여러 소스에서 비롯됩니다. USB 클라이언트 드라이버에 사용할 수 있는 대역폭을 정확히 예측하기는 어렵습니다. USB 호스트 컨트롤러는 작업에 대해 일정량의 대역폭이 필요합니다. 필요한 크기는 컨트롤러가 고속인지 여부에 따라 달라집니다. 시스템마다 다릅니다. 고속으로 작동하는 USB 허브는 때때로 고속 업스트림 포트와 저속 디바이스 다운스트림 간에 트랜잭션을 변환해야 하며, 이 변환 프로세스는 대역폭을 사용합니다. 그러나 트랜잭션 변환에 대역폭이 필요한지 여부는 연결된 디바이스의 종류와 디바이스 트리의 토폴로지에 따라 달라집니다.
대역폭 리소스에 대한 가장 심각한 부담은 대역폭을 독점하는 USB 클라이언트 드라이버에서 비롯됩니다. 시스템은 선착순으로 대역폭을 할당합니다. 로드된 첫 번째 USB 드라이버가 사용 가능한 모든 대역폭을 요청하는 경우 나중에 로드되는 USB 드라이버는 해당 디바이스에 대한 대역폭을 허용하지 않습니다. 시스템에서 디바이스를 구성할 수 없으며 디바이스를 열거하지 못합니다. 열거가 실패한 이유는 명백하지 않으므로 사용자에게 나쁜 환경이 있습니다.
경우에 따라 클라이언트 드라이버는 고속 인터럽트 전송으로 사용 가능한 대역폭을 소모합니다. 그러나 가장 일반적인 경우는 동시 전송에 대해 너무 많은 대역폭을 할당한 다음 적시에 대역폭을 해제하지 못하는 클라이언트 드라이버의 경우입니다. 시스템은 요청한 드라이버가 엔드포인트를 닫거나(다른 엔드포인트를 열어) 대역폭이 할당된 디바이스가 제거될 때까지 할당된 대역폭을 예약합니다. 시스템은 대량 전송에 대해 보장된 대역폭을 할당하지 않으므로 대량 전송은 열거 실패의 원인이 아닙니다. 그러나 대량 전송 디바이스의 성능은 주기적(등시 및 인터럽트) 전송을 수행하는 디바이스에 할당되는 대역폭의 양에 따라 달라집니다.
USB 2.0 사양에는 기본 인터페이스 설정에 대역폭이 0인 엔드포인트가 있는 등시 디바이스가 필요합니다. 이렇게 하면 함수 드라이버가 기본이 아닌 인터페이스를 열 때까지 디바이스에 대해 예약된 대역폭이 없으므로 디바이스 구성 중에 과도한 대역폭 요청으로 인한 열거 오류를 방지할 수 있습니다. 클라이언트 드라이버가 디바이스를 구성한 후 너무 많은 대역폭을 할당하는 것을 방지하지 않으므로 다른 디바이스가 제대로 작동하지 않습니다.
적절한 대역폭 관리의 핵심은 등시 전송을 수행하는 시스템의 모든 USB 디바이스가 등시 엔드포인트를 포함하는 각 인터페이스에 대해 여러 대체(Alt) 설정을 제공해야 하며 클라이언트 드라이버는 이러한 Alt 설정을 신중하게 사용해야 한다는 것입니다. 클라이언트 드라이버는 가장 높은 대역폭으로 인터페이스 설정을 요청하여 시작해야 합니다. 요청이 실패하면 클라이언트 드라이버는 요청이 성공할 때까지 더 작고 작은 대역폭으로 인터페이스 설정을 요청해야 합니다.
예를 들어 웹캠 디바이스에 다음 인터페이스가 있다고 가정합니다.
인터페이스 0(기본 인터페이스 설정: 기본 설정에 0이 아닌 등시 대역폭이 있는 엔드포인트 없음)
등시 엔드포인트 1: 최대 패킷 크기 = 0바이트
등시 엔드포인트 2: 최대 패킷 크기 = 0바이트
인터페이스 0 Alt 설정 1
등시 엔드포인트 1: 최대 패킷 크기 = 256바이트
등시 엔드포인트 2: 최대 패킷 크기 = 256바이트
인터페이스 0 Alt 설정 2
등시 엔드포인트 1: 최대 패킷 크기 = 512바이트
등시 엔드포인트 2: 최대 패킷 크기 = 512바이트
웹캠용 드라이버는 초기화할 때 기본 인터페이스 설정을 사용하도록 웹캠을 구성합니다. 기본 설정에는 등시 대역폭이 없으므로 초기화 중에 기본 설정을 사용하면 등시 대역폭에 대한 요청이 실패하여 웹캠이 열거되지 않을 위험이 방지됩니다.
클라이언트 드라이버가 등시 전송을 수행할 준비가 되면 Alt 설정 2가 패킷 크기가 가장 크므로 Alt 설정 2를 사용해야 합니다. 요청이 실패하면 드라이버는 Alt 설정 1을 사용하여 두 번째 시도를 할 수 있습니다. Alt 설정 1에는 더 적은 대역폭이 필요하므로 첫 번째 요청이 실패하더라도 이 요청은 성공할 수 있습니다. 드라이버가 포기하기 전에 여러 번 시도할 수 있도록 하는 여러 Alt 설정이 있습니다.
웹캠이 유휴 상태가 되면 기본 설정을 다시 선택하여 할당된 대역폭을 사용 가능한 대역폭 풀로 반환할 수 있습니다.
사용자는 Windows 디바이스 관리자에서 컨트롤러의 속성을 확인하여 USB 컨트롤러가 할당한 대역폭을 확인할 수 있습니다. 컨트롤러의 속성을 선택한 다음 고급 탭을 찾습니다. 이 읽기는 트랜잭션 변환을 위해 할당된 USB 허브의 대역폭을 나타내지 않습니다.
USB 컨트롤러의 대역폭 사용량을 보고하는 디바이스 관리자 기능이 Windows XP에서 제대로 작동하지 않습니다.
USB 전송 및 패킷 크기
이 문서에서는 다양한 버전의 Windows 운영 체제에서 허용되는 USB 전송 크기에 대해 설명합니다.
최대 전송 크기
최대 전송 크기는 USB 드라이버 스택에서 하드 코딩된 제한을 지정합니다. 시스템 리소스 제한으로 인해 이러한 제한 이하의 전송 크기가 실패할 수 있습니다. 이러한 유형의 오류를 방지하고 모든 버전의 Windows에서 호환성을 보장하려면 USB 전송에 큰 전송 크기를 사용하지 마십시오.
비고
USBD_PIPE_INFORMATION 구조체의 MaximumTransferSize 멤버는 사용되지 않습니다. USB 드라이버 스택은 복합 디바이스와 비 복합 디바이스 모두에 대한 MaximumTransferSize 의 값을 무시합니다.
Windows 2000에서 USB 드라이버 스택은 MaximumTransferSize를 USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE로 초기화합니다. 클라이언트 드라이버는 디바이스를 구성하는 동안 더 작은 값을 설정할 수 있습니다. 복합 디바이스의 경우 각 함수의 클라이언트 드라이버는 기본이 아닌 인터페이스 설정의 파이프에 대한 MaximumTransferSize 만 변경할 수 있습니다.
USB 전송 크기는 다음과 같은 제한이 적용됩니다.
| 전송 파이프 | Windows 8.1, Windows 8 | Windows 7, Windows Vista | Windows XP, Windows Server 2003 | Windows 2000 |
|---|---|---|---|---|
| 제어 | 초고속 및 고속 64K(xHCI) 전속 및 저속 4K(xHCI, EHCI, UHCI, OHCI) UHCI의 경우 기본 엔드포인트에서는 4K, 기본이 아닌 컨트롤 파이프에서는 64K입니다. |
고속 64K(EHCI) 전속 및 저속 4K(EHCI, UHCI, OHCI) UHCI의 경우 기본 엔드포인트에서 4K; UHCI의 경우 기본이 아닌 컨트롤 파이프에서 64K |
고속 64K(EHCI) 전속 및 저속 4K(EHCI, UHCI, OHCI) UHCI의 경우, 기본 엔드포인트에서는 4K, 비기본 컨트롤 파이프에서는 64K. |
기본 엔드포인트에서 4K; 기본이 아닌 제어 파이프에서 64K(OHCI) |
| Interrupt | SuperSpeed, 고속, 전속, 저속(xHCI, EHCI, UHCI, OHCI)의 경우 4MB | 높음, 완전 및 저속의 경우 4MB(EHCI, UHCI, OHCI) | 무제한 | Undetermined(OHCI) |
| 대량 | SuperSpeed의 경우 32MB(xHCI) xHCI(고속 및 전속 모드) 4MB 고속 및 전체 속도의 경우 4MB(EHCI 및 UHCI) 256K 풀 스피드(OHCI) |
고속 및 전속도 4MB(EHCI, UHCI) 최대 속도 256K(OHCI) |
고속 및 전속을 위한 EHCI 3MB 미정(UHCI) 최대 속도 256K(OHCI) |
Undetermined(OHCI) |
| 등시성 | 1024 * wBytesPerInterval for SuperSpeed(xHCI) ( USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR 참조) 고속 인터페이스(xHCI, EHCI)를 위한 최대 패킷 크기(MaximumPacketSize) * 1024 256 * MaximumPacketSize의 풀 스피드(xHCI, EHCI)용 전속 64K(UHCI, OHCI) |
고속(EHCI)을 위한 1024 * MaximumPacketSize 256 * MaximumPacketSize (전속 속도용, EHCI) 최대 전송 속도 64K(UHCI, OHCI) |
1024 * MaximumPacketSize 고속용 (EHCI) 256 * 최고 속도의 MaximumPacketSize (EHCI) 최대 전송 속도 64K(UHCI, OHCI) |
전속 64K(OHCI) |
MaximumTransferSize를 사용하여 전송 크기를 제한하는 것은 디바이스에서 사용하는 대역폭의 양에 직접적인 영향을 주지 않습니다. 클라이언트 드라이버는 인터페이스 설정을 변경하거나 USBD_PIPE_INFORMATIONMaximumPacketSize 멤버에 설정된 최대 패킷 크기를 제한해야 합니다.
최대 패킷 크기
최대 패킷 크기는 엔드포인트 설명자의 wMaxPacketSize 필드에 의해 정의됩니다. 클라이언트 드라이버는 디바이스에 대한 선택 인터페이스 요청에서 USB 패킷 크기를 조절할 수 있습니다. 이 값을 변경해도 디바이스의 wMaxPacketSize 는 변경되지 않습니다.
요청에 대한 URB에는 파이프의 USBD_PIPE_INFORMATION 구조체가 있습니다. 해당 구조에서
- USBD_PIPE_INFORMATION 구조체의 MaximumPacketSize 멤버를 수정합니다. 현재 인터페이스 설정에 대한 디바이스 펌웨어에 정의된 wMaxPacketSize 값보다 작거나 같은 값으로 설정합니다.
- PipeFlags 멤버 USBD_PIPE_INFORMATION 구조체에서 USBD_PF_CHANGE_MAX_PACKET 플래그를 설정합니다.
인터페이스 설정을 선택하는 방법에 대한 자세한 내용은 USB 디바이스에 대한 구성을 선택하는 방법을 참조하세요.
읽기 전송 버퍼에 대한 최대 패킷 크기 제한
클라이언트 드라이버가 읽기 요청을 수행하는 경우 전송 버퍼는 최대 패킷 크기의 배수여야 합니다. 드라이버가 최대 패킷 크기보다 작은 데이터를 예상하는 경우에도 전체 패킷을 요청해야 합니다. 디바이스가 최대 크기(짧은 패킷)보다 작은 패킷을 보내는 경우 전송이 완료되었음을 나타냅니다.
이전 컨트롤러에서 클라이언트 드라이버는 동작을 재정의할 수 있습니다. 데이터 전송 URB의 TransferFlags 멤버에서 클라이언트 드라이버는 USBD_SHORT_TRANSFER_OK 플래그를 설정해야 합니다. 이 플래그를 사용하면 디바이스가 wMaxPacketSize보다 작은 패킷을 보낼 수 있습니다.
xHCI 호스트 컨트롤러에서는 대량 및 인터럽트 엔드포인트에 대해 USBD_SHORT_TRANSFER_OK 무시됩니다. EHCI 컨트롤러에서 짧은 패킷을 전송해도 오류 조건이 발생하지는 않습니다.
EHCI 호스트 컨트롤러에서는 대량 및 인터럽트 엔드포인트에 대해 USBD_SHORT_TRANSFER_OK 무시됩니다.
UHCI 및 OHCI 호스트 컨트롤러에서 대량 또는 인터럽트 전송에 대해 USBD_SHORT_TRANSFER_OK 설정되지 않은 경우 짧은 패킷 전송은 엔드포인트를 중지하고 전송에 대한 오류 코드가 반환됩니다.
짧은 패킷을 사용하여 쓰기 전송을 구분하기
USB 드라이버 스택 드라이버는 디바이스에 쓸 때 디바이스에서 읽을 때 적용되는 패킷 크기에 대해 동일한 제한을 적용하지 않습니다. 일부 클라이언트 드라이버는 디바이스를 관리하기 위해 소량의 제어 데이터를 자주 전송해야 합니다. 이러한 경우 데이터 전송을 균일한 크기의 패킷으로 제한하는 것은 비현실적입니다. 따라서 드라이버 스택은 데이터 쓰기 중에 엔드포인트의 최대 크기보다 작은 크기의 패킷에 특별한 의미를 할당하지 않습니다. 이렇게 하면 클라이언트 드라이버가 디바이스에 대한 큰 전송을 최대값보다 작거나 같은 크기의 여러 URL로 분할할 수 있습니다.
드라이버는 최대 크기보다 작은 패킷으로 전송을 종료하거나 전송 끝을 길이가 0인 패킷으로 구분해야 합니다. 드라이버가 wMaxPacketSize보다 작은 패킷을 보낼 때까지 전송이 완료되지 않습니다. 전송 크기가 최대값의 정확한 배수인 경우 드라이버는 전송을 명시적으로 종료하기 위해 길이가 0인 구분 패킷을 보내야 합니다.
클라이언트 드라이버는 USB 사양에 따라 데이터 전송을 길이가 0인 패킷으로 구분해야 합니다. USB 드라이버 스택은 이러한 패킷을 자동으로 생성하지 않습니다.
wMaxPacketSize보다 작은 패킷으로 USB 데이터 전송 구분
규격 USB 2.0 및 USB 1.1 드라이버는 최대 크기(wMaxPacketSize)의 패킷을 전송한 다음 최대 크기 미만의 패킷으로 전송을 종료하거나 전송 끝을 길이가 0인 패킷으로 구분해야 합니다. 드라이버가 wMaxPacketSize보다 작은 패킷을 보낼 때까지 전송이 완료되지 않습니다. 전송 크기가 최대값의 정확한 배수인 경우 드라이버는 전송을 명시적으로 종료하기 위해 길이가 0인 구분 패킷을 보내야 합니다.
디바이스 드라이버는 USB 사양에 따라 데이터 전송을 길이가 0인 패킷으로 구분해야 합니다. 시스템 USB 스택은 이러한 패킷을 자동으로 생성하지 않습니다.