Consertando um dispositivo de captura HDMI Elgato HD60 S com a ajuda do Ghidra
(downtowndougbrown.com)- O Elgato Game Capture HD60 S que não era reconhecido via USB voltou a funcionar normalmente na captura HDMI e no passthrough após a substituição de 3 CIs de alimentação que estavam derrubando as linhas de energia
- Com termografia, medição de tensão e busca por marcações SMD, foram identificados 2 reguladores Fitipower FP6373A e um inversor de tensão TI TPS60403DBV; o custo das peças era inferior a 1 dólar na LCSC
- A função de captura voltou, mas os LEDs de status — 7 brancos e 7 vermelhos — continuavam apagados; foi confirmado, com controle direto via Raspberry Pi Pico, que tanto o driver de LED quanto a própria matriz de LEDs estavam normais
- Ao analisar o firmware do Nuvoton M031LD2AE e a flash SPI do Cypress/Infineon CYUSB3014 com o Ghidra, foi descoberto que os dados de animação dos LEDs, que deveriam existir a partir de 0x300000, estavam vazios ou corrompidos
- Ao inserir na flash SPI do aparelho com defeito apenas a região de dados dos LEDs extraída de um HD60 S funcional, os LEDs de status voltaram a acender; a falha restante não era de hardware, mas sim de software, programação ou do processo de atualização
Reparo da alimentação do HD60 S que não era reconhecido via USB
- O Elgato Game Capture HD60 S USB 3.0 com defeito, comprado no eBay, não mostrava absolutamente nada no computador quando conectado
- Ao abrir a placa e medir as tensões, foi constatado que uma linha de alimentação estava sendo puxada para baixo, e um chip que esquentava foi localizado com uma câmera térmica
- As peças com problema eram CIs de alimentação com apenas pequenas marcações
- 2 chips marcados como
fiVJVEficavam perto de indutores de 2.2µH, então foram considerados reguladores chaveados - Após busca pelas marcações SMD e consulta a material da Fitipower, chegou-se ao FP6373A
- Um chip marcado como
PFNIfoi identificado, via busca no Google, como o inversor de tensão TI TPS60403DBV
- 2 chips marcados como
- Os três chips recebiam 5V na entrada e apresentavam baixa resistência no lado da saída; ao injetar diretamente 2.7V na linha de saída de um dos FP6373A, o regulador correspondente começou a aquecer
- O FP6373A podia ser comprado na LCSC por US$0,17 cada, e o chip da TI por US$0,58; o frete era muito maior que o valor das peças
O problema restante dos LEDs de status após a troca das peças
- Depois da substituição dos três CIs de alimentação, o HD60 S passou a ser reconhecido como dispositivo USB, e a captura HDMI e o passthrough funcionaram normalmente
- Porém, os LEDs de status do aparelho continuavam sem acender
- Há 7 LEDs brancos e 7 vermelhos
- Os LEDs brancos deveriam piscar duas vezes logo após a conexão
- O chip ligado aos LEDs era o IT1504 da Innochip, identificado no datasheet como um driver de LED de 16 canais
- Observando o pino de entrada do IT1504 com um osciloscópio, foi visto tráfego serial semelhante a SPI
- Seguindo as trilhas da PCB, foi descoberto que o IT1504 era controlado por um microcontrolador ARM Cortex-M0 Nuvoton M031LD2AE
Busca por substituto do IT1504 e verificação do circuito
- O IT1504 era difícil de encontrar em distribuidores comuns, e a Innochip só tinha estoque em rolos completos, sem possibilidade de envio de amostras
- Durante a busca por um substituto, foi encontrado o MBI5040 da Macroblock
- O datasheet do MBI5040 era quase idêntico ao do IT1504 em estrutura e diagrama de blocos
- A especificação de corrente de saída era um pouco diferente, mas a função e o conjunto de comandos eram muito parecidos
- As informações de comandos no datasheet do MBI5040 ajudaram a entender como o controle dos LEDs funcionava
- Um MBI5040GF foi comprado e instalado no lugar do IT1504, mas os LEDs continuaram apagados
- Ao acender cada LED individualmente com uma fonte de bancada e resistores, foi confirmado que os próprios LEDs estavam bons
- Quando um Raspberry Pi Pico foi ligado diretamente à entrada do MBI5040 para enviar comandos, foi possível controlar totalmente os LEDs
- Concluiu-se que não havia problema físico no circuito do driver de LED nem na matriz de LEDs
- Mesmo recolocando o IT1504 original, o controle via Pico funcionou normalmente, mostrando que o driver original também não estava com defeito
Analisando o firmware do MCU Nuvoton com o Ghidra
- Foi perguntado ao suporte da Elgato se havia algum problema conhecido ou configuração relacionada aos LEDs de status, mas não foi obtida nenhuma solução prática
- Para verificar o firmware do MCU Nuvoton, foi seguido o traçado de um conector JST de 4 pinos na placa, confirmando que ele era o conector de programação do MCU
- Tentativas de leitura com Nu-Link2-Me e NuMicro ICP Programming Tool falharam porque o conteúdo do chip estava protegido
- Em vez disso, foi encontrado o arquivo
FW_HD60_S_MCU.binincluído no 4K Capture Utility da Elgato- Segundo o
ElgatoDeviceCapabilities.json, esse firmware era para dispositivos com USB product ID 0x0076 - A Elgato o chamava de “Game Capture HD60 S Rev.4”
- Segundo o
- O binário parecia ser firmware de Cortex-M0; a primeira word
0x20000E70parecia um ponteiro de stack válido, e as words seguintes pareciam uma tabela de vetores com endereços em flash - O firmware foi carregado no Ghidra e o SVD-Loader foi usado para tentar mapear os registradores
- O
M031AE_v1.svddo NuMicro_DFP foi modificado para que pudesse ser carregado pelo plugin - O M031BSP da Nuvoton ajudou na identificação de funções
- O
Troca e desbloqueio do MCU para depuração
- Ao instalar um chip vazio novo no lugar do M031LD2AE original e gravar nele o firmware da Elgato, o aparelho voltou a funcionar, mas o chip ficou novamente protegido e não pôde ser depurado
- No Ghidra, foi localizada a função que atualizava a configuração de proteção e ela foi alterada para não bloquear o chip
- Com o firmware modificado gravado, foi possível depurar o código de inicialização com OpenOCD e GDB
- O caminho de código de controle dos LEDs existia no firmware, mas estava sendo ignorado no fluxo normal de execução
- Ao forçar registradores e valores de RAM no GDB para fazer o código de controle dos LEDs rodar, foi possível acender as luzes
- O firmware continha o código de controle dos LEDs
- O problema era que esse código não era executado em condições normais
Bootloader e backup completo do firmware
- Foi feito um experimento instalando, em outro HD60 S, um firmware modificado que desativava os bits de proteção, usando o caminho de atualização da Elgato, para então ler todo o conteúdo originalmente protegido
- Após a atualização, o dispositivo parecia não funcionar mais como placa de captura, mas o chip havia sido desbloqueado com sucesso
- Com isso, foi possível ler as seguintes áreas
- LDROM: o bootloader de primeiro estágio da Elgato
- data flash
- valores originais dos registradores de configuração
- firmware de aplicação na APROM
- O bootloader em LDROM podia receber comandos e dados por I2C e regravar a APROM
- Quando o chip estava sem proteção, o bootloader não passava para o firmware de aplicação e ficava aguardando comandos de atualização
- A Elgato aparentemente usava os bits de bloqueio/desbloqueio como um sinal para indicar se o bootloader deveria esperar
- Isso também explicava por que o dispositivo parecia travado após instalar o firmware desbloqueado
Entendendo a arquitetura interna do HD60 S
- Dentro do aparelho, dois processadores da família ARM trabalhavam em conjunto
- O chip periférico USB 3.0 Cypress/Infineon CYUSB3014 usa ARM926EJ-S e se comunica com o PC por USB 3.0
- O MCU Nuvoton M031LD2AE Cortex-M0 controla os chips de vídeo ITE e os LEDs
- O MCU Nuvoton configura e monitora os chips ITE por um barramento I2C separado
- O ITE IT6802E parece ser o receptor HDMI
- O ITE IT66121FN parece ser responsável por enviar um fluxo de dados paralelo como HDMI
- O CYUSB3014 envia comandos ao MCU Nuvoton por I2C, e o Nuvoton devolve informações de status ao CYUSB3014
- O CYUSB3014 recebe o fluxo de dados de vídeo vindo do IT6802E e o envia ao computador via USB
- A placa também tem um CPLD Altera MAX II, que aparentemente ajuda a fazer os dados de vídeo chegarem ao CYUSB3014 em um formato que ele consiga receber
Descoberta da flash SPI e dos dados de animação dos LEDs
- O firmware do CYUSB3014 era armazenado sem proteção em uma flash SPI Winbond W25Q32JVSSIQ de 4MB
- Ao examinar o dump da flash SPI, foram encontrados blocos de dados a partir do offset 0x300000 que pareciam pequenas imagens
- Seguindo 5 GPIOs ainda não identificados no firmware do Nuvoton, foi descoberto que esses pinos iam para um switch de barramento mux/demux 2:1 quádruplo PI5C3257 da Diodes Incorporated
- Esse switch de barramento selecionava se a flash SPI seria conectada ao CYUSB3014 ou ao MCU Nuvoton
- No começo, parecia que a flash SPI era exclusiva do CYUSB3014
- Na prática, depois que o CYUSB3014 iniciava, o MCU Nuvoton assumia o controle da flash SPI
- No Ghidra, as novas funções identificadas estavam relacionadas a transações SPI por bit-banging e a apagar, ler e gravar a flash SPI
A verdadeira causa da falha dos LEDs
- Os dados a partir de 0x300000 na flash SPI não eram imagens comuns, mas sim frames de animação dos LEDs
- Cada bloco de 16 bytes correspondia a um frame de animação usado pelos 14 LEDs
- Os 2 últimos bytes de cada linha eram o tempo de espera antes de passar para o próximo frame
- O firmware do Nuvoton verificava se os 2 primeiros bytes do endereço inicial 0x300000 continham o valor de 16 bits 0xAA55
- Nos dumps da flash SPI de dois dispositivos com LEDs defeituosos, essa região estava vazia ou corrompida
- Em um dos dumps, a região 0x300000 estava quase toda preenchida com
0x00 - Algumas animações começavam com cabeçalhos estranhos, como
AB 03 12 39
- Em um dos dumps, a região 0x300000 estava quase toda preenchida com
- Na flash SPI de um terceiro HD60 S funcional, havia no endereço 0x300000 o cabeçalho correto e os dados dos LEDs
- A primeira word de 16 bits era o
0xAA55esperado pelo firmware - O cabeçalho continha informações relacionadas a 26 animações de LED
- Os dados de correção de ponto carregados no IT1504 estavam em 0x3007F8, e o valor seguinte
0x521114A7era o CRC-32 dos 16 bytes anteriores
- A primeira word de 16 bits era o
Recuperação dos LEDs com patch na flash SPI
- Na flash SPI do aparelho com defeito, o trecho de 0x000000 a 0x2FFFFF preservava dados exclusivos de cada unidade
- Isso porque o número de série USB estava incluído em algum ponto dessa região
- Foi criada uma imagem híbrida substituindo apenas a região de dados dos LEDs, a partir de 0x300000, pelos dados extraídos do dump de um aparelho funcional
- Ao gravar essa imagem no dispositivo com defeito nos LEDs, os LEDs brancos piscaram duas vezes e os vermelhos acenderam uma vez rapidamente
- Embora o aparelho funcional fosse de uma revisão mais antiga e usasse outro modelo de MCU Nuvoton, os dados dos LEDs correspondiam ao formato esperado pelo firmware mais novo
- Os dados brutos das animações também existiam no aplicativo antigo Game Capture para Windows e Mac
- No Windows, o caminho era
C:\Program Files\Elgato\GameCapture\Animations - No Mac, o caminho era
/Applications/Game Capture HD.app/Contents/Resources/Animations - Ao reorganizar os dados de arquivos como
01.ani,02.anietc. na ordem dos LEDs, eles coincidiam com os dados de animação de um dump de flash funcional
- No Windows, o caminho era
Limitações da ferramenta de atualização e do procedimento de recuperação
- A atualização de firmware no Windows pelo 4K Capture Utility da Elgato não esperava tempo suficiente
- O programa mostrava falha mesmo com a atualização ainda em andamento
- Se fosse deixado em paz, os LEDs do dispositivo piscavam e ele reiniciava normalmente com o novo firmware
- Se o dispositivo fosse desconectado logo após a mensagem de erro, poderia ficar uma gravação incompleta na flash
- Aumentar o valor
updateDurationSecde 40 para 80 emElgatoDeviceCapabilities.jsonresolveu esse problema - A Elgato recomenda não atualizar o firmware do HD60 S a menos que isso seja orientado pelo suporte técnico, e a função fica escondida atrás de uma combinação especial de teclas na tela de configurações
- O procedimento para recuperar os LEDs é complexo
- modificar o
ElgatoDeviceCapabilities.jsonpara permitir a atualização de firmware - desconectar o aparelho logo após iniciar a atualização para forçar o chip Cypress a assumir o controle da flash SPI
- remover um jumper na PCB para fazer o CYUSB3014 inicializar pela USB
- usar o
download_fx3do Cypress SDK para carregarcyfxflashprog.imgna RAM - usar uma versão modificada de
fx3_spitestpara extrair o dump completo da flash SPI e aplicar o patch na região dos LEDs - recolocar o jumper e executar uma atualização de firmware normal pelo 4K Capture Utility para restaurar o firmware do Nuvoton
- modificar o
- No fim, o reparo original foi resolvido com a troca de 3 chips que custavam menos de 1 dólar no total, e o problema dos LEDs foi identificado como uma falha de software, programação ou do processo de atualização que afeta alguns HD60 S
1 comentários
Comentários do Hacker News
Era difícil entender o propósito dentro da estrutura geral, e às vezes ele ficava enterrado bem fundo em várias camadas de chamadas de função
Isso também acontece com frequência quando se olha diretamente o código-fonte. A maior parte do software é abstraída em excesso, e os MCUs ficaram tão grandes e baratos que coisas como colocar dois núcleos ARM em um dispositivo de captura HDMI começaram a aparecer também no mundo embarcado. Acho que esse dispositivo não precisava de mais de um MCU
Quando eu cresci na Índia, uns 20 anos atrás, o poder de compra era baixo e as coisas eram caras, então consertávamos ou reformávamos quase tudo
Usávamos todo tipo de improviso, chamado jugaad, para fazer as coisas funcionarem, e também reutilizávamos roupas, com alfaiates fazendo remendos chamados rafu para aumentar sua vida útil. Isso era especialmente comum em famílias de classe média como a minha
Meu pai, que trabalhava numa empresa exportadora de roupas, dizia com frequência que os ocidentais preferiam coisas descartáveis e novas, fossem carros, eletrônicos ou roupas, e na época eu não entendia essa mentalidade. Mas agora, com o aumento do poder de compra e a queda dos preços graças à China, nós também estamos tendendo a simplesmente jogar fora e comprar novo
Tenho enorme respeito por quem não desiste no meio do caminho e não pensa apenas que comprar novo é mais fácil. Essa persistência e engenhosidade realmente merecem elogios
Se você consegue consertar por conta própria e obter as peças necessárias, tudo bem. Mas, se é algo em que precisa pagar pela experiência e conhecimento de alguém, pelo menos onde eu moro fica bem caro, e também é difícil encontrar quem faça o reparo. Vejo muitos anúncios de conserto de TV do lado de fora de lojas vazias
Felizmente estou semiaposentado e recebendo por hora, então meu tempo extra não tem custo monetário. Por isso posso gastar um dia tentando consertar a lava-louças e, se ela quebrar de novo alguns dias depois, gastar outro dia instalando uma nova. Um instalador profissional teria instalado uma nova em uma hora, mas pelo menos não precisei esperar para agendar
Só nos últimos 50 anos mais ou menos é que o consumismo cresceu, e a qualidade e o preço de itens como roupas caíram
Recentemente tenho feito eu mesmo a manutenção da minha moto; no começo é preciso investir um pouco em ferramentas, como uma chave para soltar o filtro de óleo, e também conseguir peças e consumíveis. Coisas como óleos, arruelas de cobre e parafusos para substituir os parafusos velhos do reservatório do fluido de freio. Mesmo assim, sai por algo em torno de €100~€150, em vez dos €1000 que a oficina orçou
Minha mãe encurtava as barras das calças quando éramos pequenos e depois as soltava de novo conforme crescíamos; quando joelhos ou cotovelos gastavam, ela remendava
Esse ambiente incutiu tanto bons quanto maus hábitos. Faço quase todos os reparos da casa por conta própria, mas trabalho demais e nem sempre tenho tempo ou energia suficientes. Tenho dificuldade de pagar alguém para fazer algo que eu poderia perfeitamente assumir, e por isso acabo deixando coisas quebradas paradas por mais tempo do que deveria
Se eu tivesse usado esse tempo em projetos paralelos em vez de manutenção e reparos, talvez tivesse mais dinheiro
Essas pessoas ensinavam o básico aos outros e ajudavam quando surgiam problemas inesperados. Era como se conhecimento e uma forma básica de aprendizado por aprendizagem estivessem incorporados à comunidade inteira
Hoje, consertar virou uma atividade solitária. Coisas como o YouTube ajudam muito, mas o aspecto comunitário desapareceu
Como efeito colateral lamentável, consertar e reutilizar passaram a ser vistos como menos atraentes, e a reparabilidade e a longa vida útil também se tornaram menos importantes como características de produto. Agora que o crescimento econômico dos EUA estagnou, especialmente para os 99%, o que perdemos está ficando evidente. Não há coisas feitas para durar, e as empresas não oferecem, ou não conseguem oferecer, produtos reparáveis e duradouros. Por isso, até as pessoas que se esforçam de propósito para consertar suas próprias coisas se deparam com inúmeros obstáculos
Achei interessante a parte em que ele percebe que um bloco de dados dentro do chip flash era uma imagem. Não uma imagem no sentido comum, mas dados que descreviam várias animações de LED
Já criei independentemente um formato desse tipo para animações de lâmpadas Hue. Só que era texto, não binário
bulb1 bulb2dly R G B WW CW R G B WW CW100 10 25 20 0 0 25 10 20 0 0200 10 50 20 0 0 50 10 20 0 0O primeiro valor é o atraso em milissegundos antes de passar para a próxima linha; depois vêm os brilhos de cada canal de LED, numa escala de 100. Linhas que começam com algo que não seja número são comentários, e pode haver qualquer quantidade de um ou mais espaços entre os canais
Foi divertido ver um formato binário parecido em um produto comercial. Na verdade é uma abordagem bem óbvia, mas ainda assim é interessante ver na prática
https://en.wikipedia.org/wiki/Piano_roll
Foi um texto que dá humildade. Isso é engenharia full-stack de verdade
Quero ver como a Elgato vai reagir a esse texto
Na minha experiência, os produtos da Elgato são baratos, mas terrivelmente instáveis. Este texto mostra em grande detalhe o porquê
O software também tem todos os recursos que eu quero, dá para criar plugins próprios, e o processo de criação de plugins é documentado. Tudo isso é realmente bom
Mas, na prática, preciso ficar desligando e ligando o Key Light, e no Windows também preciso reiniciar o app do Stream Deck o tempo todo
Fico me perguntando como manter a motivação nesse tipo de projeto. É preciso pedir peças repetidamente e esperar que cheguem, e especialmente quando vêm da China, acabo abandonando muitos projetos durante a espera
Se contei direito, o autor fez pelo menos três pedidos. Ainda assim, é realmente fascinante
Se você não tiver uma câmera térmica, pode passar álcool isopropílico na placa e ver onde ele evapora mais rápido
Claro, esse método só serve para dispositivos de baixa tensão
A capacidade de buscar a verdade e segui-la até o fim é o que nos torna divinos, o aspecto humano de criar e melhorar algo. Ao investigar um objeto mundano, essa pessoa percorreu um caminho espiritual muito profundo
É muito triste, frustrante e infernal que os dispositivos resistam a nós. Computadores e aparelhos deveriam amplificar e irradiar as verdades que os compõem. Mas a humanidade está presa dentro das cascas que ela mesma criou, em um consumismo de cima para baixo que nega a possibilidade de participação e aprendizado. Computadores, em especial, muitas vezes se tornam os principais dispositivos de opacização que encobrem a verdade e a compreensão. Um potencial imenso está sendo desperdiçado
Espero ver, ainda em vida, uma onda de ruptura em que surjam máquinas abertas. Aplausos para Doug