USB 대역폭 할당
이 문서에서는 USB 대역폭의 신중한 관리에 관한 지침을 제공합니다. 모든 USB 클라이언트 드라이버가 사용하는 USB 대역폭을 최소화하고 사용하지 않는 대역폭을 가능한 한 빨리 사용 가능한 대역폭 풀로 반환해야 합니다.
USB 드라이버가 대역폭 오류에서 벗어나는 이유는 무엇인가요?
USB 버스의 대역폭 경쟁은 하드웨어와 소프트웨어의 여러 소스에서 비롯됩니다. USB 클라이언트 드라이버에 사용할 수 있는 대역폭의 양을 정확히 예측하기는 어렵습니다. USB 호스트 컨트롤러는 작업에 일정량의 대역폭이 필요합니다. 필요한 양은 컨트롤러가 고속인지 여부에 따라 달라집니다. 시스템마다 다릅니다. 고속으로 작동하는 USB 허브는 고속 업스트림 포트와 저속 디바이스 다운스트림 간에 트랜잭션을 변환해야 하는 경우가 있으며, 이 변환 프로세스는 대역폭을 사용합니다. 그러나 트랜잭션 변환에 대역폭이 필요한지 여부는 연결된 디바이스의 종류와 디바이스 트리의 토폴로지에 따라 달라집니다.
대역폭 리소스에 대한 가장 심각한 부담은 대역폭을 독점하는 USB 클라이언트 드라이버에서 비롯됩니다. 시스템은 선착순으로 대역폭을 할당합니다. 로드된 첫 번째 USB 드라이버가 사용 가능한 모든 대역폭을 요청하는 경우 나중에 로드되는 USB 드라이버에는 해당 디바이스에 대한 대역폭이 허용되지 않습니다. 시스템에서 디바이스를 구성할 수 없으며 디바이스를 열거하지 못합니다. 열거형이 실패한 이유는 명확하지 않으므로 사용자에게 나쁜 환경이 있습니다.
경우에 따라 클라이언트 드라이버는 고속 인터럽트 전송으로 사용 가능한 대역폭을 소모합니다. 그러나 지금까지 가장 일반적인 경우는 등시 전송을 위해 너무 많은 대역폭을 할당한 다음 적시에 대역폭을 해제하지 못하는 클라이언트 드라이버의 경우입니다. 시스템은 요청된 드라이버가 엔드포인트를 닫거나(다른 엔드포인트를 열어) 할당된 대역폭이 할당된 디바이스가 제거될 때까지 할당된 대역폭을 예약합니다. 시스템은 대량 전송에 대해 보장된 대역폭을 할당하지 않으므로 대량 전송은 열거형 오류의 원인이 아닙니다. 그러나 대량 전송 디바이스의 성능은 주기적(등시 및 인터럽트) 전송을 수행하는 디바이스에 할당되는 대역폭의 양에 따라 달라집니다.
USB 2.0 사양을 사용하려면 기본 인터페이스 설정에 대역폭 엔드포인트가 없는 등시 디바이스가 필요합니다. 이렇게 하면 함수 드라이버가 기본이 아닌 인터페이스를 열 때까지 디바이스에 대한 대역폭이 예약되지 않습니다. 이렇게 하면 디바이스 구성 중에 과도한 대역폭 요청으로 인한 열거형 오류를 방지할 수 있습니다. 클라이언트 드라이버가 디바이스를 구성한 후 너무 많은 대역폭을 할당하지 못하게 하여 다른 디바이스가 제대로 작동하지 않도록 방지합니다.
적절한 대역폭 관리의 핵심은 등시 전송을 수행하는 시스템의 모든 USB 디바이스가 등시 엔드포인트를 포함하는 각 인터페이스에 대해 여러 대체(Alt) 설정을 제공해야 하며 클라이언트 드라이버는 이러한 Alt 설정을 신중하게 사용해야 한다는 것입니다. 클라이언트 드라이버는 대역폭이 가장 높은 인터페이스 설정을 요청하는 것으로 시작해야 합니다. 요청이 실패하면 클라이언트 드라이버는 요청이 성공할 때까지 더 작고 작은 대역폭으로 인터페이스 설정을 요청해야 합니다.
instance 웹캠 디바이스에 다음과 같은 인터페이스가 있다고 가정합니다.
인터페이스 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 |
---|---|---|---|---|
제어 | SuperSpeed 및 고속용 64K(xHCI) 전속 및 저속 4K(xHCI, EHCI, UHCI, OHCI) UHCI의 경우 기본 엔드포인트에서 4K, 기본이 아닌 컨트롤 파이프의 64K |
고속 64K(EHCI) 전속 및 저속 4K(EHCI, UHCI, OHCI) UHCI의 경우 기본 엔드포인트에서 4K, 기본이 아닌 컨트롤 파이프의 64K(UHCI) |
고속 64K(EHCI) 전속 및 저속 4K(EHCI, UHCI, OHCI) UHCI의 경우 기본 엔드포인트에서 4K, 기본이 아닌 컨트롤 파이프의 64K(UHCI) |
기본 엔드포인트의 4K; 기본이 아닌 제어 파이프의 64K(OHCI) |
Interrupt | SuperSpeed, 높음, 전체 및 저속의 경우 4MB(xHCI, EHCI, UHCI, OHCI) | 높음, 전체 및 저속의 경우 4MB(EHCI, UHCI, OHCI) | 제한 없음 | Undetermined(OHCI) |
대량 | SuperSpeed의 경우 32MB(xHCI) 고속 및 전속 4MB(xHCI) 고속 및 전속 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 참조) 1024 * 고속 최대 패키지 크기 조정 (xHCI, EHCI) 256 * 최대 속도에 대한 MaximumPacketSize (xHCI, EHCI) 전속 64K(UHCI, OHCI) |
1024 * 고속을 위한 MaximumPacketSize (EHCI) 256 * 최고 속도용 MaximumPacketSize (EHCI) 전속 64K(UHCI, OHCI) |
1024 * 고속용 MaximumPacketSize (EHCI) 256 * EHCI(최고 속도용 MaximumPacketSize ) 전속 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 스택은 이러한 패킷을 자동으로 생성하지 않습니다.