Compartilhar via


Alocação de largura de banda USB

Este artigo fornece diretrizes sobre o gerenciamento cuidadoso da largura de banda USB. É responsabilidade de cada driver de cliente USB minimizar a largura de banda USB que ele usa e retornar 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á ficando sem 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 de cliente USB. O controlador de host USB requer uma certa quantidade de largura de banda para suas operações. O valor necessário 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 de 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 largura de banda por 1 a 0. Se o primeiro driver USB carregado solicitar toda a largura de banda disponível, um driver USB carregado posteriormente não permitirá nenhuma largura de banda 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 de alta velocidade. Mas o caso mais comum, de longe, é o de um driver de cliente que aloca muita largura de banda para uma transferência isócrona 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 solicitado 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 (isócronas e interrompidas).

A especificação USB 2.0 requer que um dispositivo isócrono 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 de 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 faz transferências isocronas deve oferecer várias configurações alternativas (Alt) para cada interface que contém pontos de extremidade isócronos e os drivers de cliente devem fazer uso criterioso dessas configurações Alt. Os drivers de cliente devem começar solicitando a configuração da interface com a maior largura de banda. Se a solicitação falhar, o driver do 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 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)

Ponto de extremidade isocrono 1: tamanho máximo do pacote = 0 bytes

Ponto de Extremidade Isocrono 2: tamanho máximo do pacote = 0 bytes

Interface 0 Configuração Alt 1

Ponto de Extremidade Isocrono 1: tamanho máximo do pacote = 256 bytes

Ponto de Extremidade Isocrono 2: tamanho máximo do pacote = 256 bytes

Interface 0 Configuração Alt 2

Ponto de Extremidade Isocrono 1: tamanho máximo do pacote = 512 bytes

Ponto de Extremidade Isocrono 2: tamanho máximo do 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 isócrona, portanto, usar a configuração padrão durante a inicialização evita o perigo de que a webcam possa falhar ao enumerar, devido a uma solicitação com falha para largura de banda isocrona.

Quando o driver do cliente estiver pronto para fazer uma transferência isócrona, 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 Windows Gerenciador de Dispositivos. Selecione as propriedades do controlador e procure na guia Avançado. Essa leitura não indica quanto hubs USB de largura de banda alocaram 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 transferência USB e pacotes

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

O tamanho máximo de transferência especifica limites embutidos na pilha do driver USB. É possível que os tamanhos de transferência abaixo desses limites falhem devido a 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 inicializa MaximumTransferSize para USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Um driver cliente pode definir um valor menor ao configurar o dispositivo. Para um dispositivo composto, o driver do cliente para 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
Control 64K para SuperSpeed e alta velocidade (xHCI)

4K para velocidade total e baixa (xHCI, EHCI, UHCI, OHCI)

Para UHCI, 4K no ponto de extremidade padrão; 64K em pipes 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 pipes de controle não padrão (UHCI)
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 pipes de controle não padrão (UHCI)
4K no ponto de extremidade padrão; 64K em pipes de controle não padrão (OHCI)
Interrupção 4 MB para SuperSpeed, alta, completa e baixa velocidade (xHCI, EHCI, UHCI, OHCI) 4 MB para alta, completa e baixa velocidade (EHCI, UHCI, OHCI) Ilimitado Undetermined(OHCI)
Em massa 32 MB para SuperSpeed (xHCI)

4 MB para velocidade alta e completa (xHCI)

4 MB para alta e velocidade total (EHCI e UHCI)

256K de velocidade total (OHCI)
4 MB para alta e velocidade total (EHCI, UHCI)

256K para velocidade total (OHCI)
3 MB para EHCI (alta e velocidade total)

Indeterminado (UHCI)

256K para velocidade total (OHCI)
Undetermined(OHCI)
Isócrono 1024 * wBytesPerInterval para 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 do cliente deve alterar a configuração da interface ou restringir o tamanho máximo do pacote definido no membro MaximumPacketSize de 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 select-interface para o dispositivo. Alterar esse valor não altera o wMaxPacketSize no dispositivo.

No 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 da interface atual.
  • Defina o sinalizador USBD_PF_CHANGE_MAX_PACKET na estrutura USBD_PIPE_INFORMATION membro PipeFlags.

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 todo o pacote. 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 substituir o comportamento. No membro TransferFlags da 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 ignorados para pontos de extremidade em massa 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 pontos de extremidade em massa e interrupção.

Em controladores de host UHCI e OHCI, se USBD_SHORT_TRANSFER_OK não estiver definido para uma transferência em massa ou interrupção, uma transferência de pacote curta interromperá o ponto de extremidade e um código de erro será retornado para a transferência.

Delimitando transferências de gravação com pacotes curtos

O driver de pilha do driver USB não impõe as mesmas restrições ao tamanho do pacote, ao gravar no dispositivo, que ele impõe ao ler do dispositivo. Alguns drivers de 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 as 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 de delimitação 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

Os drivers USB 2.0 e USB 1.1 em conformidade 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 de delimitação 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.