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.

control transfer USB, status stage, zero-length packet, endpoint zero, pacote de setup, stall USB, depuração USB

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:

  1. Capture a control transfer completa.
  2. Decodifique os campos do SETUP.
  3. Identifique a direção da transferência.
  4. Confira o tamanho de dado esperado.
  5. Verifique os bytes do data stage.
  6. Verifique a direção do status stage.
  7. Procure o zero-length packet.
  8. Confira STALL ou timeout.
  9. Compare requisições standard e vendor.
  10. 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.