Depuração de USB Remote Wakeup e Suspend/Resume: selective suspend, sinalização e eventos de wake perdidos
Como depurar USB remote wakeup, falhas de suspend/resume, desconexões por selective suspend, eventos de wake perdidos, bugs de gerenciamento de energia e sinalização de resume a partir de capturas USB.
Bugs de gerenciamento de energia em USB são difíceis de diagnosticar porque o dispositivo pode funcionar perfeitamente enquanto o sistema está ativo e falhar só depois de idle, sleep, selective suspend, sleep de dock, fechar a tampa do notebook ou desligar o monitor. Buscas como "USB remote wakeup not working", "USB selective suspend disconnect", "USB device does not wake computer", "USB resume failure", "USB suspend resume bug" e "HID keyboard wake from sleep not working" traduzem exatamente esse cenário.
O Bus Scope ajuda porque suspend e resume são eventos de barramento, não apenas erros de aplicação. Você precisa ver se o host suspendeu o dispositivo, se o remote wakeup estava habilitado, se o dispositivo sinalizou resume, se o host voltou com tráfego normal e se o dispositivo reenumerou em vez de fazer resume.
O que significa remote wakeup
O remote wakeup permite que um dispositivo USB suspenso peça que o host retome a comunicação. Exemplos comuns:
- Teclado acorda um desktop em sleep.
- Mouse acorda um notebook em idle.
- Botão em dock acorda uma workstation.
- Scanner de código de barras acorda um kiosk.
- Controlador industrial acorda um painel PC.
- Sensor HID acorda o host depois de um evento externo.
Remote wakeup não é só "o dispositivo tem energia". O host precisa permitir, o dispositivo precisa anunciar suporte, a feature precisa estar habilitada e a sinalização de resume precisa acontecer no momento certo.
Sintomas comuns
Problemas de remote wakeup e suspend aparecem como:
- Dispositivo funciona até o PC dormir.
- Dispositivo não acorda o computador.
- Dispositivo acorda o sistema imediatamente depois do suspend.
- Dispositivo some depois do resume.
- Dispositivo reenumera com novo endereço.
- Entrada HID é perdida depois do idle.
- Dispositivo serial para de transmitir depois do selective suspend.
- Dispositivo de áudio ou câmera volta do sleep sem dados.
- Firmware só recupera depois de tirar e recolocar o cabo.
Esses sintomas são frequentemente colocados na conta do driver, mas a captura pode mostrar um problema de estado de energia do firmware.
Evidência em descritor e feature
O descritor de configuração pode anunciar a capacidade de remote wakeup. O host pode então habilitar ou desabilitar a feature. Um trace útil de diagnóstico USB deve responder:
- O dispositivo anuncia remote wakeup?
- O host enviou
SET_FEATURE(DEVICE_REMOTE_WAKEUP)? - O host limpou a feature depois?
- O suspend aconteceu após o idle?
- O dispositivo tentou sinalizar resume?
- O host voltou com transferências normais?
Sem esses fatos, o diagnóstico é achismo.
Selective suspend
O selective suspend permite que o sistema operacional suspenda um dispositivo USB em idle sem colocar o sistema inteiro em sleep. Isso economiza energia, mas expõe bugs de firmware.
Padrões de falha:
- Dispositivo entra em baixo consumo, mas não restaura o estado dos endpoints.
- Firmware perde estado pendente de interrupt IN.
- Dispositivo NAKa para sempre depois do resume.
- Host reseta o dispositivo depois de timeout.
- Aplicação vê timeout ou remoção do dispositivo.
- Dispositivo composto resume em uma interface, mas não em outra.
Quem busca geralmente digita "USB selective suspend random disconnect" porque o dispositivo parece desconectar, mas o evento real é falha de suspend/resume.
Resume versus reenumeração
Depois do sleep, há dois desfechos bem diferentes:
- Resume: o mesmo dispositivo continua com a configuração existente.
- Reenumeração: o host reseta e enumera o dispositivo de novo.
Reenumeração pode ser aceitável depois de uma desconexão física, mas é suspeita depois de um suspend normal. Ela pode quebrar aplicações que mantêm handles abertos, nomes de porta serial, caminhos HID ou sessões de captura de câmera.
O Bus Scope deve ajudar a identificar se o trace contém tráfego de resume normal ou uma nova sequência de enumeração com GET_DESCRIPTOR, SET_ADDRESS e SET_CONFIGURATION.
Eventos de wake perdidos
Às vezes o dispositivo vê o evento externo, mas o host não acorda. Causas comuns:
- Remote wakeup não foi anunciado.
- Remote wakeup não foi habilitado pelo host.
- Dispositivo envia resume cedo demais.
- Dispositivo envia resume tarde demais.
- Hub bloqueia ou trata errado a sinalização de wake.
- BIOS ou política de wake do SO desabilita a porta.
- Firmware do dispositivo entra em um sleep mais profundo que o esperado.
- O evento ocorre antes do suspend terminar.
Evidência em nível de pacote não substitui a política de energia do SO, mas estreita a pergunta. O dispositivo tinha permissão para acordar o host, e ele tentou?
Wake imediato depois do suspend
O oposto também é comum: o sistema suspende e acorda imediatamente. Dispositivos USB podem causar isso quando sinalizam wake por entrada velha, estado de interrupção ruidoso, bugs de debounce ou firmware que trata suspend como novo evento.
Evidência a coletar:
- Último relatório de interrupção antes do suspend.
- Se o host habilitou wake.
- Intervalo de tempo entre suspend e resume.
- Classe e interface do dispositivo.
- Se o mesmo endpoint tinha dados pendentes.
- Se o evento se repete em toda tentativa de suspend.
Isso é especialmente comum em teclados, mouses, painéis touch, controles e dispositivos HID custom.
Checklist de depuração
Use este processo:
- Capture a enumeração desde a conexão.
- Confirme a capacidade de remote wakeup nos descritores.
- Confira se o host habilitou o remote wakeup.
- Registre o período de idle antes do suspend.
- Identifique o momento do suspend.
- Procure sinalização de resume ou tráfego de resume do host.
- Separe resume de reenumeração completa.
- Confira o comportamento dos endpoints depois do resume.
- Compare o mesmo dispositivo em porta direta e através de um hub.
- Preserve os pacotes de antes do suspend e depois do resume.
Diagnóstico final
Bugs de USB remote wakeup e suspend/resume são problemas de protocolo de estado de energia. A evidência útil é a capacidade no descritor, a seleção de feature pelo host, a temporização do suspend, a sinalização de resume, a recuperação dos endpoints e se o host fez resume ou reenumeração do dispositivo.
O Bus Scope ajuda a tornar essa evidência visível, para que "USB wake não funciona" vire um diagnóstico concreto em vez de um ciclo de culpa no driver.