Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo fornece diretrizes sobre o gerenciamento cuidadoso da largura de banda USB. É responsabilidade de cada driver cliente USB minimizar a largura de banda USB que ele usa e retornar a largura de banda não utilizada para o pool de largura de banda livre o mais rápido possível.
Por que meu driver USB está saindo de erros de largura de banda?
A concorrência pela largura de banda no barramento USB vem de várias fontes, hardware e software. É difícil prever exatamente quanta largura de banda está disponível para um driver cliente USB. O controlador de host USB requer uma certa quantidade de largura de banda para suas operações. A quantidade necessária depende se o controlador é de alta velocidade ou não. Varia de sistema para sistema. Os hubs USB que operam em alta velocidade às vezes devem traduzir transações entre portas upstream de alta velocidade e dispositivos de baixa velocidade downstream, e esse processo de tradução consome largura de banda. Mas se a largura de banda é necessária para a tradução de transações depende do tipo de dispositivos conectados e da topologia da árvore de dispositivos.
A tensão mais grave no recurso de largura de banda geralmente vem de drivers de cliente USB que monopolizam a largura de banda. O sistema aloca a largura de banda por ordem de chegada. Se o primeiro driver USB carregado solicitar toda a largura de banda disponível, um driver USB carregado posteriormente não terá nenhuma largura de banda permitida para seu dispositivo. O sistema não pode configurar o dispositivo e falha ao enumerá-lo. Como não é evidente por que a enumeração falhou, o usuário tem uma experiência ruim.
Ocasionalmente, um driver de cliente esgota a largura de banda disponível com uma transferência de interrupção em alta velocidade. Mas o caso mais comum, de longe, é o de um driver cliente que aloca muita largura de banda para uma transferência isocrona e, em seguida, não consegue liberar a largura de banda em tempo hábil. O sistema reserva largura de banda alocada até que o driver que o solicitou feche seu ponto de extremidade (abrindo outro ponto de extremidade) ou o dispositivo para o qual a largura de banda foi alocada seja removido. O sistema não aloca largura de banda garantida para transferências em massa, portanto, transferências em massa nunca são a causa de falhas de enumeração. No entanto, o desempenho dos dispositivos de transferência em massa depende da quantidade de largura de banda alocada para dispositivos que fazem transferências periódicas (isocronas e interrompidas).
A especificação USB 2.0 requer que um dispositivo isocrono tenha pontos de extremidade de largura de banda zero em sua configuração de interface padrão. Isso garante que nenhuma largura de banda seja reservada para o dispositivo até que um driver de função abra uma interface não padrão, o que ajuda a evitar falhas de enumeração causadas por solicitações de largura de banda excessivas durante a configuração do dispositivo. Isso não impede que um driver cliente aloque muita largura de banda depois de configurar seu dispositivo, impedindo assim que outros dispositivos funcionem corretamente.
A chave para o gerenciamento adequado de largura de banda é que cada dispositivo USB no sistema que realiza transferências isócronas deve oferecer várias configurações alternativas (Alt) para cada interface que contém endpoints isócronas, e os drivers cliente devem fazer uso criterioso dessas configurações alternativas. Os drivers de cliente devem começar solicitando a configuração da interface com a largura de banda mais alta. Se a solicitação falhar, o driver cliente deverá solicitar configurações de interface com larguras de banda menores e menores até que uma solicitação seja bem-sucedida.
Por exemplo, suponha que um dispositivo de webcam tenha as seguintes interfaces:
Interface 0 (configuração de interface padrão: nenhum ponto de extremidade com largura de banda isocrona diferente de zero na configuração padrão)
Endpoint Isócrono 1: tamanho máximo do pacote = 0 bytes
Endpoint Isócrono 2: tamanho máximo de pacote = 0 bytes
Interface 0 Configuração Alt 1
Endpoint Isócrono 1: tamanho do pacote máximo = 256 bytes
Endpoint Isócrono 2: tamanho máximo do pacote = 256 bytes
Interface 0 Configuração Alt 2
Endpoint Isócrono 1: tamanho máximo do pacote = 512 bytes
Ponto de Extremidade Isócrono 2: tamanho máximo de pacote = 512 bytes
O driver da webcam configura a webcam para usar a configuração de interface padrão quando inicializada. A configuração padrão não tem largura de banda isocrona, portanto, usar a configuração padrão durante a inicialização evita o perigo de que a webcam possa não enumerar devido a uma solicitação com falha para largura de banda isocrona.
Quando o driver cliente estiver pronto para fazer uma transferência isocrona, ele deverá tentar usar a configuração Alt 2, pois a configuração Alt 2 tem o maior tamanho de pacote. Se a solicitação falhar, o driver poderá fazer uma segunda tentativa usando a configuração Alt 1. Como a configuração Alt 1 requer menos largura de banda, essa solicitação pode ter êxito, mesmo que a primeira solicitação tenha falhado. Várias configurações Alt permitem que o driver faça várias tentativas antes de desistir.
Depois que a webcam ficar ociosa, ela poderá retornar a largura de banda alocada para o pool de largura de banda livre selecionando a configuração padrão mais uma vez.
Os usuários podem ver quanta largura de banda um controlador USB alocou verificando as propriedades do controlador no Gerenciador de Dispositivos do Windows. Selecione as propriedades do controlador e procure na guia Avançada. Essa leitura não indica a quantidade de largura de banda alocada nos hubs USB para tradução de transações.
O recurso Gerenciador de Dispositivos que relata o uso de largura de banda de um controlador USB não funciona corretamente no Windows XP.
Tamanhos de pacote e transferência USB
Este artigo descreve os tamanhos de transferência USB permitidos em várias versões do sistema operacional Windows.
- Tamanho máximo da transferência
- Tamanho máximo do pacote
- Restrição máxima de tamanho de pacote em buffers de transferência de leitura
- Delimitando transferências de gravação com pacotes curtos
Tamanho máximo da transferência
O tamanho máximo de transferência especifica limites pré-definidos na pilha de driver USB. É possível que os tamanhos de transferência abaixo desses limites falhem devido às limitações de recursos do sistema. Para evitar esses tipos de falhas e garantir a compatibilidade em todas as versões do Windows, evite usar grandes tamanhos de transferência para transferências USB.
Observação
O membro MaximumTransferSize da estrutura USBD_PIPE_INFORMATION está obsoleto. A pilha de driver USB ignora o valor em MaximumTransferSize para dispositivos compostos e não compostos.
No Windows 2000, a pilha de driver USB define MaximumTransferSize como USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Um driver cliente pode definir um valor menor ao configurar o dispositivo. Para um dispositivo composto, o driver cliente de cada função só pode alterar MaximumTransferSize para pipes na configuração de interface não padrão.
Os tamanhos de transferência USB estão sujeitos aos seguintes limites:
| Pipe de transferência | Windows 8.1, Windows 8 | Windows 7, Windows Vista | Windows XP, Windows Server 2003 | Windows 2000 |
|---|---|---|---|---|
| Controle | 64K para SuperSpeed e alta velocidade (xHCI) 4K para velocidade total e baixa (xHCI, EHCI, UHCI, OHCI) Para UHCI, 4K no endpoint padrão; 64K nos canais de controle não padrão |
64K para EHCI (alta velocidade) 4K para velocidade total e baixa (EHCI, UHCI, OHCI) Para UHCI, 4K no ponto de extremidade padrão; 64K em tubulações de controle não padrão. |
64K para EHCI (alta velocidade) 4K para alta e baixa velocidade (EHCI, UHCI, OHCI) Para UHCI, 4K no ponto de extremidade padrão; 64K em tubos de controle não padrão (UHCI) |
4K no ponto de extremidade padrão; 64K em canais de controle não padrão (OHCI) |
| Interrupt | 4 MB para SuperSpeed, alta, completa e baixa velocidade (xHCI, EHCI, UHCI, OHCI) | 4 MB para alta, plena e baixa velocidade (EHCI, UHCI, OHCI) | Ilimitado | Undetermined(OHCI) |
| Em massa | 32 MB para SuperSpeed (xHCI) 4 MB para alta e velocidade total (xHCI) 4 MB para alta velocidade e velocidade total (EHCI e UHCI) 256 K de velocidade total (OHCI) |
4 MB para alta e plena velocidade (EHCI, UHCI) 256K para a velocidade máxima (OHCI) |
3 MB para EHCI (alta velocidade e velocidade total) Undetermined (UHCI) 256 K para a velocidade total (OHCI) |
Undetermined(OHCI) |
| Isócrono | 1024 * wBytesPerInterval for SuperSpeed (xHCI) (consulte USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR) 1024 * MaximumPacketSize para alta velocidade (xHCI, EHCI) 256 * MaximumPacketSize para velocidade total (xHCI, EHCI) 64K para velocidade total (UHCI, OHCI) |
1024 * MaximumPacketSize para EHCI (alta velocidade) 256 * MaximumPacketSize para EHCI (velocidade total) 64K para velocidade total (UHCI, OHCI) |
1024 * MaximumPacketSize para EHCI (alta velocidade) 256 * MaximumPacketSize para EHCI (velocidade total) 64K para velocidade total (UHCI, OHCI) |
64K para velocidade total (OHCI) |
Restringir o tamanho da transferência com MaximumTransferSize não afeta diretamente a quantidade de largura de banda que um dispositivo consome. O driver cliente deve alterar a configuração da interface ou restringir o tamanho máximo do pacote definido no membro MaximumPacketSize do USBD_PIPE_INFORMATION.
Tamanho máximo do pacote
O tamanho máximo do pacote é definido pelo campo wMaxPacketSize do descritor de ponto de extremidade. Um driver cliente pode regular o tamanho do pacote USB em uma solicitação de seleção de interface para o dispositivo. Alterar esse valor não altera o wMaxPacketSize no dispositivo.
Na URB para a solicitação há uma estrutura USBD_PIPE_INFORMATION para o pipe. Nessa estrutura,
- Modifique o membro MaximumPacketSize da estrutura USBD_PIPE_INFORMATION . Defina-o como um valor menor ou igual ao valor de wMaxPacketSize definido no firmware do dispositivo para a configuração de interface atual.
- Defina o sinalizador USBD_PF_CHANGE_MAX_PACKET no membro PipeFlags da estrutura USBD_PIPE_INFORMATION.
Para obter informações sobre como selecionar uma configuração de interface, consulte Como selecionar uma configuração para um dispositivo USB.
Restrição máxima de tamanho de pacote em buffers de transferência de leitura
Quando um driver cliente faz uma solicitação de leitura, o buffer de transferência deve ser um múltiplo do tamanho máximo do pacote. Mesmo quando o driver espera dados menores que o tamanho máximo do pacote, ele ainda deve solicitar o pacote inteiro. Quando o dispositivo envia um pacote menor que o tamanho máximo (um pacote curto), é uma indicação de que a transferência está concluída.
Em controladores mais antigos, o driver do cliente pode sobrepor o comportamento padrão. No membro TransferFlags do URB de transferência de dados, o driver cliente deve definir o sinalizador USBD_SHORT_TRANSFER_OK. Esse sinalizador permite que o dispositivo envie pacotes menores que wMaxPacketSize.
Em controladores de host xHCI, USBD_SHORT_TRANSFER_OK ignorado para endpoints bulk e de interrupção. A transferência de pacotes curtos em controladores EHCI não resulta em uma condição de erro.
Em controladores de host EHCI, USBD_SHORT_TRANSFER_OK é ignorado para endpoints de bulk e de interrupção.
Em controladores de anfitrião UHCI e OHCI, se USBD_SHORT_TRANSFER_OK não estiver definido para uma transferência em massa ou uma transferência de interrupção, uma transferência de pacote curto interromperá o ponto de extremidade e um código de erro é retornado para a transferência.
Delimitando transferências de gravação com pacotes curtos
O driver de pilha do USB não impõe as mesmas restrições ao tamanho do pacote ao gravar no dispositivo que são impostas ao ler do dispositivo. Alguns drivers cliente devem fazer transmissões frequentes de pequenas quantidades de dados de controle para gerenciar seus dispositivos. É impraticável restringir transmissões de dados a pacotes de tamanho uniforme nesses casos. Portanto, a pilha de driver não atribui nenhum significado especial a pacotes de tamanho menor que o tamanho máximo do ponto de extremidade durante gravações de dados. Isso permite que um driver cliente divida uma grande transferência para o dispositivo em vários URBs de qualquer tamanho menor ou igual ao máximo.
O driver deve encerrar a transmissão com um pacote de tamanho menor que o máximo ou delimitar o final da transmissão com um pacote de comprimento zero. A transmissão não é concluída até que o driver envie um pacote menor que wMaxPacketSize. Se o tamanho da transferência for um múltiplo exato do máximo, o driver deverá enviar um pacote delimitador de comprimento zero para encerrar explicitamente a transferência
O driver cliente é responsável por delimitar a transmissão de dados com pacotes de comprimento zero, conforme exigido pela especificação USB. A pilha de driver USB não gera esses pacotes automaticamente.
Delimitando transferências de dados USB com pacotes menores que wMaxPacketSize
Drivers USB 2.0 e USB 1.1 compatíveis devem transmitir pacotes de tamanho máximo (wMaxPacketSize) e, em seguida, encerrar a transmissão com um pacote de tamanho menor que o máximo ou delimitar o final da transmissão com um pacote de comprimento zero. A transmissão não é concluída até que o driver envie um pacote menor que wMaxPacketSize. Se o tamanho da transferência for um múltiplo exato do máximo, o driver deverá enviar um pacote delimitador de comprimento zero para encerrar explicitamente a transferência
O driver do dispositivo é responsável por delimitar a transmissão de dados com pacotes de comprimento zero, conforme exigido pela especificação USB. A pilha USB do sistema não gera esses pacotes automaticamente.