Réparer un boîtier de capture HDMI Elgato HD60 S avec Ghidra
(downtowndougbrown.com)- L’Elgato Game Capture HD60 S qui n’était pas reconnu en USB a retrouvé un fonctionnement normal en capture HDMI et en passthrough après le remplacement de trois circuits d’alimentation qui tiraient vers le bas les rails de tension
- Grâce à l’imagerie thermique, à des mesures de tension et à la recherche des marquages SMD, deux régulateurs Fitipower FP6373A et un inverseur de tension TI TPS60403DBV ont été identifiés ; leur coût total était inférieur à 1 dollar chez LCSC
- La fonction de capture était revenue, mais les LED d’état — 7 blanches et 7 rouges — restaient éteintes ; il a été confirmé via un pilotage direct avec un Raspberry Pi Pico que le driver LED et l’ensemble des LED eux-mêmes fonctionnaient normalement
- L’analyse avec Ghidra du firmware du Nuvoton M031LD2AE et de la flash SPI du Cypress/Infineon CYUSB3014 a montré que les données d’animation LED attendues à partir de
0x300000étaient absentes ou corrompues - Après avoir injecté uniquement la zone de données LED d’un HD60 S sain dans la flash SPI de l’appareil défectueux, les LED d’état ont repris vie ; la panne restante venait donc non du matériel mais d’un problème logiciel, de programmation ou de chaîne de mise à jour
Réparation de l’alimentation d’un HD60 S non reconnu en USB
- L’Elgato Game Capture HD60 S USB 3.0 acheté en panne sur eBay ne faisait apparaître aucun périphérique sur l’ordinateur une fois branché
- Après ouverture du PCB et mesure des tensions, il est apparu qu’un rail d’alimentation était tiré vers le bas, puis une caméra thermique a permis de repérer les puces qui chauffaient
- Les composants en cause étaient de petits circuits d’alimentation ne portant qu’un marquage minimal
- deux puces marquées
fiVJVE, placées près d’inductances de 2,2µH, ont été supposées être des régulateurs à découpage - après recherche des marquages SMD et vérification de la documentation Fitipower, la piste FP6373A a été retenue
- la puce marquée
PFNIa été identifiée via Google comme étant l’inverseur de tension TI TPS60403DBV
- deux puces marquées
- Les trois puces recevaient bien du 5V en entrée, leurs sorties présentaient une faible résistance, et en injectant directement 2,7V sur le rail de sortie d’un des FP6373A, ce régulateur s’est mis à chauffer
- Les FP6373A étaient disponibles chez LCSC à 0,17 $ pièce, et la puce TI à 0,58 $ ; les frais de port coûtaient largement plus cher que les composants
Problème persistant des LED d’état après remplacement des composants
- Après remplacement des trois circuits d’alimentation, le HD60 S a de nouveau été reconnu comme périphérique USB, et la capture HDMI ainsi que le passthrough fonctionnaient normalement
- En revanche, les voyants d’état de l’appareil ne s’allumaient toujours pas
- il y a 7 LED blanches et 7 LED rouges
- les LED blanches sont censées clignoter deux fois juste après la connexion
- La puce liée aux LED était une IT1504 d’Innochip, donnée comme driver LED 16 canaux dans sa documentation
- À l’oscilloscope, les broches d’entrée de l’IT1504 recevaient un trafic série proche du SPI
- En retraçant le PCB, il est apparu que l’IT1504 était piloté par un microcontrôleur Nuvoton M031LD2AE ARM Cortex-M0
Recherche d’un remplaçant pour l’IT1504 et vérification du circuit
- L’IT1504 était difficile à obtenir via les circuits de distribution classiques, et Innochip ne pouvait pas fournir d’échantillons car le stock n’était disponible qu’en bobines complètes
- En cherchant un équivalent, le MBI5040 de Macroblock a été trouvé
- sa documentation était presque identique à celle de l’IT1504 en termes de structure et de schéma blocs
- les spécifications de courant de sortie différaient légèrement, mais les fonctions et le jeu de commandes étaient très proches
- les informations de commande de la documentation du MBI5040 ont aidé à comprendre le mode de contrôle des LED
- Un MBI5040GF a été acheté et monté à la place de l’IT1504, mais les LED restaient éteintes
- En allumant les LED une par une avec une alimentation de labo et une résistance, il a été confirmé que les LED elles-mêmes étaient en bon état
- En connectant directement un Raspberry Pi Pico à l’entrée du MBI5040 pour lui envoyer des commandes, il a été possible de piloter complètement les LED
- cela a permis de conclure à l’absence de problème physique dans le circuit du driver LED et dans la matrice de LED
- après remise en place de l’IT1504 d’origine, le pilotage via le Pico fonctionnait toujours, montrant que le driver LED initial n’était pas défectueux non plus
Analyse du firmware du MCU Nuvoton avec Ghidra
- Une demande adressée au support Elgato au sujet d’un problème connu ou d’un éventuel réglage lié aux LED d’état n’a pas apporté de solution concrète
- Pour examiner le firmware du MCU Nuvoton, le connecteur JST 4 broches du PCB a été retracé, puis identifié comme connecteur de programmation du MCU
- Une tentative de lecture avec Nu-Link2-Me et NuMicro ICP Programming Tool a échoué car le contenu de la puce était protégé
- À la place, le fichier
FW_HD60_S_MCU.bininclus dans 4K Capture Utility d’Elgato a été retrouvé- d’après
ElgatoDeviceCapabilities.json, ce firmware vise les appareils USB avec le product ID 0x0076 - Elgato l’appelle « Game Capture HD60 S Rev.4 »
- d’après
- Le binaire ressemblait à un firmware Cortex-M0 ; son premier mot
0x20000E70avait l’apparence d’un pointeur de pile valide, et les mots suivants ressemblaient à une table des vecteurs pointant vers des adresses flash - Le firmware a été chargé dans Ghidra et le plugin SVD-Loader a été utilisé pour tenter de mapper les registres
- le fichier
M031AE_v1.svdde NuMicro_DFP a été modifié pour pouvoir être chargé par le plugin - le M031BSP de Nuvoton a aidé à identifier des fonctions
- le fichier
Remplacement du MCU et déverrouillage pour le débogage
- En remplaçant le M031LD2AE d’origine par une puce neuve vierge puis en y flashant le firmware Elgato, l’appareil fonctionnait, mais la puce se reprotégeait aussitôt, empêchant tout débogage
- Dans Ghidra, la fonction qui mettait à jour les paramètres de protection a été trouvée et patchée afin d’empêcher le verrouillage de la puce
- Une fois ce firmware patché installé, le code d’initialisation a pu être débogué avec OpenOCD et GDB
- Le chemin de code pilotant les LED était bien présent dans le firmware, mais il était ignoré dans le flux d’exécution normal
- En forçant à la main des registres et des valeurs RAM dans GDB pour faire exécuter ce code, il a été possible d’allumer l’éclairage
- le firmware contient bien le code de contrôle des LED
- le problème est que ce code n’est pas exécuté dans des conditions normales
Bootloader et sauvegarde complète du firmware
- Une expérience a consisté à installer sur un autre HD60 S le firmware avec bits de protection désactivés via la procédure de mise à jour Elgato, afin de lire l’intégralité du contenu normalement protégé
- Après la mise à jour, l’appareil semblait ne plus fonctionner comme carte de capture, mais la puce était bien déverrouillée comme prévu
- Il a alors été possible de lire les zones suivantes
- LDROM : le bootloader de premier niveau d’Elgato
- la data flash
- les valeurs d’origine des registres de configuration
- le firmware applicatif APROM
- Le bootloader LDROM pouvait recevoir des commandes et des données via I2C puis reflasher l’APROM
- Lorsque la puce est déprotégée, le bootloader ne passe pas au firmware applicatif et attend à la place des commandes de mise à jour
- Elgato utilisait donc les bits de verrouillage/déverrouillage comme un signal indiquant s’il fallait rester en attente dans le bootloader
- cela explique aussi pourquoi l’appareil semblait figé après installation du firmware déverrouillé
Comprendre l’architecture interne du HD60 S
- Deux processeurs de type ARM fonctionnent ensemble dans l’appareil
- la puce USB 3.0 Cypress/Infineon CYUSB3014, basée sur un ARM926EJ-S, communique avec le PC en USB 3.0
- le MCU Nuvoton M031LD2AE Cortex-M0 contrôle les puces vidéo ITE et les LED
- Le MCU Nuvoton configure et surveille les puces ITE via un bus I2C dédié
- l’ITE IT6802E semble être le récepteur HDMI
- l’ITE IT66121FN semble renvoyer le flux de données parallèle vers une sortie HDMI
- Le CYUSB3014 envoie des commandes au MCU Nuvoton via I2C, et le Nuvoton lui renvoie des informations d’état
- Le CYUSB3014 reçoit le flux vidéo venant de l’IT6802E et le transmet à l’ordinateur via USB
- La carte comporte aussi un CPLD Altera MAX II, qui semble contribuer à adapter les données vidéo dans un format recevable par le CYUSB3014
Découverte de la flash SPI et des données d’animation LED
- Le firmware du CYUSB3014 était stocké sans protection dans une flash SPI Winbond W25Q32JVSSIQ de 4 Mo
- En examinant le dump de cette flash SPI, des blocs de données ressemblant à de petites images ont été observés à partir de l’offset 0x300000
- En retraçant cinq GPIO auparavant non identifiés dans le firmware Nuvoton, il est apparu qu’ils aboutissaient à un commutateur de bus quad 2:1 mux/demux PI5C3257 de Diodes Incorporated
- Ce commutateur de bus choisit lequel du CYUSB3014 ou du MCU Nuvoton accède à la flash SPI
- au départ, la flash SPI était supposée réservée au seul CYUSB3014
- en réalité, après le démarrage du CYUSB3014, le MCU Nuvoton prend le contrôle de la flash SPI
- Dans Ghidra, les fonctions nouvellement identifiées correspondaient à des transactions SPI bit-bang ainsi qu’à du code d’effacement, de lecture et d’écriture de la flash SPI
La véritable cause de la panne des LED
- Les données stockées après
0x300000dans la flash SPI n’étaient pas de simples images mais des trames d’animation LED- chaque bloc de 16 octets correspond à une trame d’animation destinée aux 14 LED
- les 2 derniers octets de chaque ligne représentent le délai avant le passage à la trame suivante
- Le firmware Nuvoton vérifiait que les 2 premiers octets à l’adresse de départ
0x300000contenaient la valeur 16 bits 0xAA55 - Dans les dumps de flash SPI de deux appareils dont les LED ne fonctionnaient pas, cette zone était vide ou corrompue
- dans l’un des dumps, la zone
0x300000était presque entièrement remplie de0x00 - certaines animations commençaient par des en-têtes anormaux comme
AB 03 12 39
- dans l’un des dumps, la zone
- Dans la flash SPI d’un troisième HD60 S fonctionnel,
0x300000contenait bien l’en-tête correct et les données LED- le premier mot 16 bits était bien
0xAA55, comme attendu par le firmware - l’en-tête contenait des informations relatives à 26 animations LED
- les données de dot correction chargées dans l’IT1504 se trouvaient à
0x3007F8, et la valeur suivante0x521114A7était le CRC-32 des 16 octets précédents
- le premier mot 16 bits était bien
Restauration des LED via patch de la flash SPI
- Dans la flash SPI de l’appareil défectueux, la zone de
0x000000à0x2FFFFFconservait des données propres à chaque appareil- le numéro de série USB se trouvait quelque part dans cette zone
- Une image hybride a donc été créée en ne remplaçant que la zone de données LED à partir de
0x300000par celle extraite du dump d’un appareil sain - Après flash de cette image sur l’appareil aux LED défaillantes, les LED blanches ont clignoté deux fois et les LED rouges se sont brièvement allumées une fois
- Bien que l’appareil sain utilisé comme source soit une révision plus ancienne avec un modèle de MCU Nuvoton différent, les données LED restaient compatibles avec le format attendu par le firmware plus récent
- Les anciennes applications Game Capture pour Windows et Mac contenaient elles aussi les données brutes des animations
- sous Windows, le chemin est
C:\Program Files\Elgato\GameCapture\Animations - sous Mac, le chemin est
/Applications/Game Capture HD.app/Contents/Resources/Animations - en réordonnant les données des fichiers
01.ani,02.ani, etc. selon l’ordre des LED, elles correspondent aux données d’animation du dump flash fonctionnel
- sous Windows, le chemin est
Limites de l’outil de mise à jour et procédure de récupération
- L’outil de mise à jour du firmware Windows de 4K Capture Utility d’Elgato n’attendait pas assez longtemps
- il affichait un échec alors que la mise à jour était encore en cours
- si l’on continuait simplement à attendre, les LED de l’appareil se mettaient à clignoter et le redémarrage sur le nouveau firmware se faisait correctement
- débrancher l’appareil juste après le message d’échec pouvait laisser une écriture incomplète en flash
- Le problème a été résolu en augmentant la valeur
updateDurationSecde 40 à 80 dansElgatoDeviceCapabilities.json - Elgato recommande de ne pas mettre à jour le firmware du HD60 S sauf sur instruction du support technique, et la fonction est de toute façon masquée derrière une combinaison de touches spéciale dans l’écran des paramètres
- La procédure de restauration des LED reste complexe
- modifier
ElgatoDeviceCapabilities.jsonpour autoriser la mise à jour du firmware - débrancher l’appareil juste après le début de la mise à jour pour forcer la puce Cypress à prendre le contrôle de la flash SPI
- retirer un jumper du PCB pour que le CYUSB3014 démarre depuis l’USB
- charger
cyfxflashprog.imgen RAM avecdownload_fx3du SDK Cypress - utiliser une version modifiée de
fx3_spitestpour dumper l’intégralité de la flash SPI puis patcher la zone LED - remettre le jumper en place et effectuer ensuite une mise à jour normale du firmware avec 4K Capture Utility afin de restaurer le firmware Nuvoton
- modifier
- Au final, la réparation d’origine s’est résumée au remplacement de trois puces coûtant moins de 1 dollar au total, et le problème des LED a été identifié comme un défaut logiciel, de programmation ou de procédure de mise à jour touchant certains HD60 S
1 commentaires
Avis de Hacker News
Il était difficile de comprendre l’objectif dans l’architecture globale, et il était parfois enfoui profondément dans plusieurs niveaux d’appels de fonctions
Cela arrive souvent même quand on peut consulter directement le code source. La plupart des logiciels sont excessivement abstraits, et les MCU sont devenus tellement gros et peu chers qu’on commence à voir ce genre de choses même dans l’embarqué, comme deux cœurs ARM dans un boîtier de capture HDMI. Cet appareil n’aurait probablement pas eu besoin de plus d’un MCU
Quand j’ai grandi en Inde il y a une vingtaine d’années, le pouvoir d’achat était faible et les objets coûtaient cher, donc on réparait ou remettait en état presque tout
On utilisait toutes sortes de solutions de fortune, appelées jugaad, pour faire fonctionner les choses, et on réutilisait aussi les vêtements, dont un tailleur prolongeait la durée de vie avec des reprises appelées rafu. C’était particulièrement courant dans les familles de classe moyenne comme la mienne
Mon père, qui travaillait dans une entreprise d’exportation de vêtements, disait souvent que les Occidentaux préféraient les objets jetables et les choses neuves, qu’il s’agisse de voitures, d’électronique ou de vêtements ; à l’époque, je ne comprenais pas cet état d’esprit. Mais aujourd’hui, avec la hausse du pouvoir d’achat et la baisse des prix grâce à la Chine, nous aussi nous penchons vers le fait de jeter et de racheter
J’ai un profond respect pour les gens qui n’abandonnent pas à mi-chemin et ne pensent pas seulement qu’il est plus simple d’acheter du neuf. Cette persévérance et cette débrouillardise méritent vraiment d’être saluées
Si l’on peut réparer soi-même et se procurer les pièces nécessaires, ça va. Mais s’il faut payer l’expérience et les connaissances de quelqu’un, du moins là où je vis, cela coûte assez cher et il est difficile de trouver quelqu’un qui répare. Je vois surtout des enseignes de réparation de téléviseurs devant des boutiques vides
Heureusement, je suis à moitié retraité et payé à l’heure, donc mon temps supplémentaire n’a pas de coût monétaire. Je peux donc passer une journée à essayer de réparer le lave-vaisselle, puis, s’il retombe en panne quelques jours plus tard, passer encore une journée à en installer un neuf. Un installateur professionnel aurait installé le nouvel appareil en une heure, mais au moins je n’ai pas eu à attendre qu’on me donne un créneau
Ce n’est qu’au cours des quelque 50 dernières années que le consumérisme s’est développé et que la qualité comme le prix d’objets tels que les vêtements ont baissé
Récemment, je fais moi-même l’entretien de ma moto : au début, il faut investir un peu dans des outils, comme une clé pour dévisser le filtre à huile, et se procurer des pièces et consommables. Des huiles, des rondelles en cuivre, des vis de remplacement pour les vieilles vis du réservoir de liquide de frein, etc. Mais au final, cela revient à environ 100 à 150 € au lieu des 1 000 € annoncés par le garage
Quand nous étions petits, ma mère raccourcissait les ourlets des pantalons, puis les rallongeait quand nous grandissions, et elle rapiéçait les genoux ou les coudes usés
Cet environnement m’a inculqué à la fois de bonnes et de mauvaises habitudes. Je fais presque toutes les réparations de la maison moi-même, mais je travaille tellement que je n’ai pas toujours assez de temps ou d’énergie. J’ai du mal à payer quelqu’un d’autre pour le faire, même quand je pourrais largement me le permettre, et je finis donc par laisser des objets cassés beaucoup plus longtemps que nécessaire
Si j’avais consacré ce temps à des side projects plutôt qu’à l’entretien et aux réparations, j’aurais peut-être plus d’argent
Ces personnes apprenaient les bases aux autres et aidaient quand un problème inattendu survenait. En quelque sorte, le savoir et un apprentissage de base par compagnonnage étaient intégrés à toute la communauté
Aujourd’hui, réparer est devenu une activité solitaire. YouTube et autres sont d’une grande aide, mais la dimension communautaire a disparu
Effet secondaire regrettable : la réparation et la réutilisation étant devenues moins attirantes, la réparabilité et la longévité ont aussi perdu de l’importance en tant que fonctionnalités des produits. Maintenant que la croissance économique américaine stagne, surtout pour les 99 %, on voit ce que nous avons perdu. Rien n’est conçu pour durer, et les entreprises ne proposent pas, ou ne savent pas proposer, des produits réparables et durables. Ainsi, même les personnes qui font délibérément l’effort de réparer leurs biens se heurtent à d’innombrables obstacles
J’ai trouvé intéressant le moment où il comprend que le bloc de données dans la puce flash est une image. Pas une image au sens habituel, mais des données décrivant plusieurs animations LED
J’avais déjà créé indépendamment un format de ce type pour des animations de lampes Hue. Sauf qu’il était textuel, pas binaire
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 0La première valeur correspond au délai en millisecondes avant de passer à la ligne suivante, puis viennent les niveaux de luminosité de chaque canal LED sur une base 100. Les lignes qui ne commencent pas par un nombre sont des commentaires, et on peut mettre autant d’espaces que l’on veut entre les canaux, à condition qu’il y en ait au moins un
C’est amusant de voir un format binaire similaire dans un produit commercial. En réalité, c’est une approche assez évidente, mais c’est quand même intéressant de la voir directement
https://en.wikipedia.org/wiki/Piano_roll
Un article qui rend humble. Ça, c’est du vrai full-stack engineering
J’aimerais voir comment Elgato va réagir à cet article
D’après mon expérience, les produits Elgato sont bon marché, mais terriblement instables. Cet article montre très précisément pourquoi
Le logiciel a aussi toutes les fonctionnalités souhaitées, on peut créer ses propres plugins, et le processus de création de plugins est documenté. Tout cela est vraiment correct
Mais dans la pratique, il faut constamment éteindre et rallumer la Key Light, et redémarrer sans cesse l’application Stream Deck sous Windows
Je me demande comment on garde la motivation sur ce genre de projet. Il faut commander des composants à répétition et attendre qu’ils arrivent, et surtout quand ils viennent de Chine, l’attente finit par faire abandonner pas mal de projets
Si j’ai bien compté, l’auteur a passé au moins trois commandes. Cela reste vraiment intéressant
Si vous n’avez pas de caméra thermique, vous pouvez appliquer de l’alcool isopropylique sur la carte et regarder où il s’évapore le plus vite
Bien sûr, c’est une méthode réservée aux appareils basse tension
La capacité à chercher la vérité et à la poursuivre jusqu’au bout nous rend divins ; c’est une facette humaine qui consiste à créer et à améliorer les choses. En explorant un objet profane, cette personne a suivi un chemin spirituel très profond
Le fait que les appareils nous résistent est tellement triste, frustrant et infernal. Les ordinateurs et les machines devraient amplifier et diffuser la vérité dont ils sont faits. Mais l’humanité est prisonnière des coquilles qu’elle a elle-même créées, dans un consumérisme descendant qui refuse la participation et la possibilité d’apprendre. Les ordinateurs, en particulier, deviennent souvent des dispositifs d’opacification emblématiques, qui masquent la vérité et la compréhension. Un potentiel immense est terriblement gaspillé
J’espère voir de mon vivant une vague de percées faisant émerger des machines ouvertes. Bravo à Doug