Incompatibilidade de max packet size em endpoint USB: wMaxPacketSize, short packet e firmware
Como depurar incompatibilidades de max packet size em endpoint USB, erros em wMaxPacketSize, short packets, stalls em bulk, diferenças entre high-speed e full-speed e bugs de buffer no firmware.
O wMaxPacketSize do endpoint USB parece um campo pequeno do descritor, mas um valor errado pode quebrar transferências bulk, relatórios de interrupção, operação em high-speed, buffer de firmware e suposições do driver de host. Quem passa por isso costuma pesquisar "USB wMaxPacketSize mismatch", "USB short packet problem", "bulk transfer stops at 64 bytes", "USB endpoint packet size high speed full speed" e "USB descriptor max packet size bug" quando as transferências falham em certos tamanhos ou velocidades.
O Bus Scope é útil porque a falha só aparece quando descritores e pacotes de transferência são comparados juntos. O descritor pode anunciar um packet size enquanto o firmware, o código de host ou o hardware do endpoint se comportam como se fosse outro.
O que o wMaxPacketSize controla
Cada descritor de endpoint inclui o wMaxPacketSize. Ele informa ao host qual é o payload máximo de pacote para aquele endpoint. Os valores típicos dependem da velocidade e do tipo de endpoint.
Exemplos:
- Endpoint bulk em full-speed geralmente usa 64 bytes.
- Endpoint bulk em high-speed geralmente usa 512 bytes.
- Endpoints de interrupção variam conforme a velocidade e o intervalo.
- Endpoints isochronous usam packet sizes específicos da banda disponível.
Se o firmware configura os buffers do endpoint para 64 bytes mas anuncia 512, o host pode mandar transferências que o dispositivo não consegue tratar corretamente.
Sintomas comuns
Bugs de max packet size em endpoint podem aparecer como:
- Transferência bulk funciona para mensagens pequenas e falha para mensagens grandes.
- O dispositivo funciona em full-speed mas falha em high-speed.
- A transferência para exatamente depois de 64 bytes.
- O host espera para sempre por um short packet.
- O firmware recebe dados quebrados inesperadamente.
- O dispositivo trava transferências OUT.
- Transferências IN voltam com dados truncados.
- O driver reporta timeout mesmo com tráfego rolando.
- Dispositivo composto funciona em uma interface e não funciona em outra.
A contagem exata de bytes costuma ser a pista.
Comportamento de short packet
Transferências bulk em USB geralmente usam short packets para sinalizar o fim de uma transferência quando o tamanho requisitado é maior do que o dado real. Se o dispositivo devolve exatamente um múltiplo do max packet size, o host pode esperar mais dados, a menos que o protocolo defina tamanho separado ou envie um pacote de comprimento zero.
Exemplo:
max packet size: 64
payload length: 128
packets: 64 + 64
end condition: ambiguous unless length is known or ZLP is sent
É por isso que "USB short packet" e "USB zero length packet" são termos fortes de busca. Um dispositivo pode passar em testes simples e travar quando o tamanho do payload cai exatamente em uma fronteira de pacote.
Incompatibilidade high-speed vs full-speed
Alguns dispositivos se comportam corretamente em full-speed, mas falham em high-speed. Causas comuns:
- O descritor em high-speed anuncia 512 bytes.
- O buffer do firmware continua em 64 bytes.
- O alinhamento de DMA muda em high-speed.
- O FIFO do endpoint é pequeno demais.
- O driver de host assume a packetização típica de high-speed.
- O descritor de dispositivo difere entre os modos de velocidade.
O Bus Scope deve ajudar a comparar a velocidade de enumeração, os valores do descritor de endpoint e o chunking real das transferências.
Erros de copiar e colar descritor
Equipes de firmware frequentemente copiam descritores de endpoint entre interfaces ou modos. Isso pode criar bugs sutis:
- Endpoint de interrupção anuncia tamanho típico de bulk.
- Tamanho do endpoint OUT difere do IN sem razão.
- Alternate setting tem tamanho diferente, mas o firmware não reconfigura o endpoint.
- Árvores de descritor de full-speed e high-speed discordam.
- Descritores complementares não batem com a vazão esperada.
A visão de diagnóstico correta liga o endereço do endpoint ao seu descritor e a cada transferência naquele endpoint.
Bugs de buffer no firmware
Mesmo com o descritor correto, o firmware pode processar os dados de forma errada:
- Assume que um pacote USB equivale a uma mensagem da aplicação.
- Não trata mensagens quebradas em múltiplos pacotes.
- Perde pacotes de comprimento zero.
- Trata short packet como erro.
- Sobrescreve o buffer de recepção depois do primeiro pacote.
- Falha quando o tamanho da transferência é igual ao max packet size.
- Não esvazia o endpoint IN depois do short packet final.
Esses bugs são comuns em dispositivos vendor-specific e bootloaders porque o protocolo costuma ser customizado.
Suposições do driver de host
O código de host também pode estar errado. Ele pode:
- Requisitar um buffer pequeno demais.
- Esperar que uma chamada de leitura equivalha a uma mensagem do dispositivo.
- Ignorar terminação por short packet.
- Usar timeout em vez de framing por tamanho de protocolo.
- Enviar um comando maior do que o buffer do firmware aguenta.
- Esquecer o comportamento de pacote de comprimento zero.
Quando os dois lados são customizados, o trace de pacotes vira o contrato.
Evidências a coletar
Para um diagnóstico de max packet size, colete:
- Velocidade do dispositivo.
- Descritor do endpoint.
- Endereço e direção do endpoint.
wMaxPacketSize.- Tamanho da transferência requisitada pelo host.
- Tamanhos de pacote efetivamente observados.
- Presença de short packet ou zero-length packet.
- STALL, NAK, timeout ou reset depois da transferência.
- Diferença entre enumeração em full-speed e high-speed.
- Logs do firmware, se disponíveis.
Os melhores relatórios incluem a contagem exata de bytes. Mecanismos de busca também combinam bem com esses detalhes práticos.
Checklist de depuração
Use este processo:
- Identifique o descritor do endpoint.
- Registre o
wMaxPacketSize. - Compare o modo de velocidade.
- Envie payloads menores, iguais e maiores que o max packet size.
- Teste múltiplos exatos do max packet size.
- Procure short packet ou zero-length packet.
- Confira se o host fica esperando depois do pacote final.
- Compare o comportamento entre IN e OUT.
- Confira mudanças de alternate setting.
- Preserve a sequência de transferência que falhou.
Diagnóstico final
Bugs de max packet size em endpoint USB são problemas de descritor, transferência e contrato com o firmware. A evidência útil é o wMaxPacketSize anunciado, a packetização real, o comportamento de short packet, o tratamento de zero-length packet, o modo de velocidade e falhas específicas do endpoint.
O Bus Scope ajuda o engenheiro a provar se o bug está no descritor, no tratamento de buffer do firmware, nas suposições do driver de host ou no framing da transferência.