Depuração do status stage em transferências de controle USB: zero-length packets, endpoint zero e stalls
Como depurar problemas de status stage em transferências de controle USB, zero-length packets, stalls no endpoint zero, sequência SETUP/DATA/STATUS, requisições de descritor e falhas de vendor command.
Transferências de controle USB parecem simples até o dispositivo falhar no status stage. Buscas como "USB control transfer status stage", "zero length packet USB", "endpoint zero stall", "SETUP DATA STATUS USB", "control transfer timeout" e "vendor request fails" acontecem quando os descritores funcionam, mas um comando trava ou dá timeout.
O Bus Scope ajuda porque falhas em control transfer exigem ver as etapas juntas. Só o pacote de setup não basta. O data stage e o status stage provam se o host e o dispositivo completaram a transação.
Etapas da control transfer
Uma control transfer costuma ter:
- SETUP stage.
- DATA stage opcional.
- STATUS stage.
O status stage geralmente usa um zero-length packet na direção oposta ao data stage. Ele confirma a conclusão.
Se o status stage falha, o host pode reportar timeout mesmo que o dispositivo já tenha trocado alguns dados.
Confusão com zero-length packet
Um zero-length packet não significa automaticamente "sem dados" no sentido de aplicação. Em control transfers, ele pode ser o handshake obrigatório de status.
Erros comuns:
- Firmware não dá ACK no status stage.
- Host espera um zero-length status packet e recebe STALL.
- Dispositivo envia dados quando o status deveria estar vazio.
- Vendor command completa o data stage mas falha no handshake final.
- Máquina de estado do firmware esquece de armar o endpoint zero.
Esses bugs são comuns em vendor commands custom e bootloaders.
Endpoint zero é especial
Endpoint zero cuida da enumeração e das control requests. Se o estado do endpoint zero for corrompido, o dispositivo inteiro pode ficar instável.
Sintomas:
- A enumeração começa, mas falha em um descritor mais adiante.
- Vendor request funciona uma vez e depois trava.
- Dispositivo precisa tirar e recolocar o cabo depois de uma control transfer.
- SET_ADDRESS ou SET_CONFIGURATION é instável.
- HID Feature Report pelo caminho de controle falha.
- DFU detach request volta, mas o dispositivo nunca muda de modo.
O Bus Scope deve mostrar se o endpoint zero se recuperou depois de um stall ou se continuou quebrado.
IN versus OUT em control transfers
A direção da control transfer muda a direção do status stage.
Para uma requisição IN:
- Host envia SETUP.
- Dispositivo envia DATA.
- Host envia status OUT zero-length packet.
Para uma requisição OUT:
- Host envia SETUP.
- Host envia DATA, se houver.
- Dispositivo envia status IN zero-length packet.
Bugs de firmware costumam aparecer quando uma direção é testada mais do que a outra.
Falhas em descritor versus vendor command
Requisições de descritor padrão podem funcionar porque usam caminhos de firmware bem testados. Vendor-specific requests podem falhar porque um handler custom trata errado length, direção ou status stage.
Evidência:
bmRequestType.bRequest.wValue.wIndex.wLength.- Tamanho real do data stage.
- Resultado do status stage.
- STALL, NAK, timeout ou reset.
Os campos do pacote de setup precisam ser interpretados junto com o comportamento observado de cada etapa.
Checklist de depuração
Use este fluxo:
- Capture a control transfer completa.
- Decodifique os campos do SETUP.
- Identifique a direção da transferência.
- Confira o tamanho de dado esperado.
- Verifique os bytes do data stage.
- Verifique a direção do status stage.
- Procure o zero-length packet.
- Confira STALL ou timeout.
- Compare requisições standard e vendor.
- Preserve o comportamento de recuperação do endpoint zero.
Diagnóstico final
Falhas em control transfer USB são, com frequência, falhas no status stage, não só problemas de pacote de setup. Zero-length packets, estado do endpoint zero, direção e handshake final importam.
O Bus Scope ajuda o engenheiro a provar se um dispositivo falhou no SETUP, no DATA, no STATUS, no tratamento de ZLP, na recuperação do endpoint zero ou no processamento do vendor command.