Falha em DFU no USB: depuração de bootloader, transferências de controle, timeouts e reconexões
Como diagnosticar falhas em update de firmware via USB DFU, detecção de bootloader, reconexões de dispositivo, stalls em transferência de controle, timeouts, driver binding e downloads de firmware com falha.
Falhas em update de firmware são estressantes porque o dispositivo pode sumir, entrar em bootloader, reconectar com um VID/PID diferente ou parecer travado em "inicializando", "apagando", "baixando" ou "reiniciando". Buscas como "USB DFU failed", "firmware update stuck initializing", "USB bootloader not detected", "DFU device not found" e "firmware update timeout" acontecem porque o atualizador raramente mostra a máquina de estado do USB.
Fluxos de USB Device Firmware Upgrade são normalmente construídos em cima de transferências de controle e transições de estado do dispositivo. O atualizador pode falar com o firmware de aplicação normal, comandar um reboot para o bootloader, esperar um dispositivo USB diferente enumerar, enviar blocos de firmware, pedir status e, no fim, comandar detach ou reset.
O Bus Scope ajuda porque cada etapa fica visível no barramento se a captura começar cedo.
Update de firmware costuma ser dois dispositivos
Muitos produtos enumeram como um dispositivo USB durante a operação normal e como outro durante o modo bootloader. O VID/PID, a product string, as interfaces e o driver binding podem mudar.
A sequência costuma ser:
- O dispositivo normal está conectado.
- O atualizador envia o comando para entrar no bootloader.
- O dispositivo se desconecta.
- O dispositivo bootloader enumera.
- O atualizador envia blocos de download do DFU.
- O dispositivo reporta status.
- O dispositivo reseta de volta para o modo normal.
Se o usuário começa a captura depois que o dispositivo desapareceu, a transição importante já se perdeu.
Pontos comuns de falha
Updates DFU falham quando:
- O modo bootloader nunca é entrado.
- O bootloader enumera, mas o driver não vincula.
- O atualizador espera um VID/PID, mas o dispositivo expõe outro.
- A transferência de controle trava.
- O tamanho do bloco de firmware está errado.
- O dispositivo dá timeout durante o erase.
- O polling de status é agressivo demais.
- O dispositivo se desconecta durante o download.
- Cabo ou energia causam reset.
- Verificação de segurança/versão rejeita a imagem.
O atualizador pode reportar todas essas como "firmware update failed".
Evidência em transferência de controle
Operações da classe DFU usam transferências de controle. Um trace pode mostrar se o atualizador enviou dados de download, pediu status, limpou estado ou bateu em um stall.
Procure por:
DFU_DNLOADDFU_UPLOADDFU_GETSTATUSDFU_CLRSTATUSDFU_ABORT- Reset ou desconexão do dispositivo
- STALL no endpoint zero
Se uma transferência de controle trava no mesmo bloco toda vez, a imagem de firmware, o tamanho do bloco, o comportamento de erase/write da flash ou um bug do bootloader entram na lista.
Temporização da reconexão
Depois de entrar no modo bootloader, o atualizador precisa esperar pela reenumeração. Se ele procura rápido demais, pode dizer "device not found" mesmo com o bootloader aparecendo um segundo depois.
Um trace do barramento mostra a temporização:
- Momento do detach do dispositivo normal.
- Momento do attach do bootloader.
- Leituras de descritor.
- Vínculo de driver.
- Primeira requisição DFU.
Essa evidência ajuda a separar timeout do atualizador de falha no dispositivo.
Problemas de driver binding
No Windows, um bootloader pode precisar de um driver diferente do dispositivo normal. No Linux, as permissões podem variar por VID/PID. No macOS, o comportamento de classe pode ser diferente de novo.
Se o bootloader enumera corretamente, mas o atualizador não consegue abrir, o problema está acima da enumeração USB básica. Se o bootloader nunca enumera, investigue firmware, cabo, reset e energia primeiro.
Checklist de depuração
Use este processo:
- Capture antes de iniciar o atualizador.
- Registre os descritores do dispositivo normal.
- Capture o comando de entrada no bootloader.
- Acompanhe o disconnect e a reenumeração do bootloader.
- Registre o VID/PID e os descritores do bootloader.
- Inspecione as transferências de controle DFU.
- Encontre o primeiro STALL, timeout, reset ou resposta ausente.
- Compare o número do bloco que falhou, se for repetível.
- Confira driver binding e permissões depois da enumeração.
- Preserve toda a linha do tempo do update antes de cortar.
Diagnóstico final
Falhas em USB DFU são falhas de máquina de estado. A causa raiz pode estar na entrada no bootloader, na reenumeração, no driver binding, no comportamento da transferência de controle DFU, no tamanho de bloco, na temporização da flash, na validação da imagem ou na temporização do reset.
O Bus Scope ajuda expondo o update de firmware como evidência USB, não apenas como uma barra de progresso que parou.