2 puntos por GN⁺ 2024-09-18 | 1 comentarios | Compartir por WhatsApp
  • El Elgato Game Capture HD60 S, que no era reconocido por USB, recuperó correctamente la captura HDMI y el passthrough tras reemplazar tres circuitos integrados de alimentación que estaban tirando hacia abajo los rieles de energía
  • Mediante imágenes térmicas, mediciones de voltaje y búsquedas de marcados SMD, se identificaron dos reguladores Fitipower FP6373A y un inversor de voltaje TI TPS60403DBV; el costo de los componentes era inferior a 1 dólar según LCSC
  • La función de captura volvió a funcionar, pero los LED de estado —7 blancos y 7 rojos— seguían apagados; se confirmó mediante control directo con una Raspberry Pi Pico que tanto el driver de LED como el arreglo de LED estaban en buen estado
  • Al rastrear con Ghidra el firmware del Nuvoton M031LD2AE y la flash SPI para el Cypress/Infineon CYUSB3014, se encontró que los datos de animación de LED que debían estar desde 0x300000 estaban vacíos o dañados
  • Al combinar en la flash SPI del dispositivo problemático solo el área de datos de LED de un HD60 S funcional, los LED de estado revivieron; la falla restante no era de hardware, sino del software, la programación o la ruta de actualización

Reparación de la etapa de alimentación del HD60 S que no era reconocido por USB

  • El Elgato Game Capture HD60 S USB 3.0 defectuoso comprado en eBay no mostraba nada en la computadora al conectarlo
  • Al abrir la placa y medir los voltajes, se observó que un riel de alimentación estaba siendo arrastrado a un nivel bajo, y con una cámara térmica se buscó el chip que se calentaba
  • Los componentes problemáticos eran pequeños circuitos integrados de alimentación con solo marcados diminutos
    • Dos chips marcados como fiVJVE estaban cerca de inductores de 2.2 µH, por lo que se sospechó que eran reguladores conmutados
    • Tras buscar marcados SMD y revisar documentación de Fitipower, se acotó la identificación a FP6373A
    • El chip marcado como PFNI fue identificado mediante una búsqueda en Google como un inversor de voltaje TI TPS60403DBV
  • Los tres chips recibían entrada de 5 V y tenían baja resistencia en la salida; al inyectar directamente 2.7 V en el riel de salida de un FP6373A, ese regulador se calentaba
  • El FP6373A podía comprarse en LCSC por US$0.17 cada uno, y el chip de TI por US$0.58; el envío costaba mucho más que los componentes

El problema restante de los LED de estado tras cambiar los componentes

  • Después de reemplazar los tres circuitos integrados de alimentación, el HD60 S fue reconocido como dispositivo USB y la captura HDMI y el passthrough funcionaron correctamente
  • Sin embargo, los indicadores de estado del dispositivo seguían sin encender
    • Hay 7 LED blancos y 7 LED rojos
    • Los LED blancos deberían parpadear dos veces justo después de la conexión
  • El chip relacionado con los LED era el IT1504 de Innochip, que según la hoja de datos era un driver de LED de 16 canales
  • Al observar los pines de entrada del IT1504 con un osciloscopio, se veía tráfico serial similar a SPI
  • Al rastrear la PCB, se encontró que el IT1504 era controlado por un microcontrolador ARM Cortex-M0 Nuvoton M031LD2AE

Búsqueda de reemplazos para el IT1504 y validación del circuito

  • El IT1504 era difícil de conseguir en canales de distribución comunes, e Innochip no podía enviar muestras porque el stock solo estaba disponible en carretes completos
  • Durante la búsqueda de alternativas se encontró el MBI5040 de Macroblock
    • La hoja de datos del MBI5040 tenía una configuración y un diagrama de bloques casi iguales a los de la hoja de datos del IT1504
    • La especificación de corriente de salida difería un poco, pero las funciones y el sistema de comandos eran muy similares
    • La información de comandos en la hoja de datos del MBI5040 ayudó a entender el método de control de los LED
  • Se compró un MBI5040GF y se instaló en lugar del IT1504, pero los LED seguían sin encender
  • Al encender los LED uno por uno con una fuente de banco y resistencias, se comprobó que los LED en sí estaban bien
  • Al conectar una Raspberry Pi Pico directamente a la entrada del MBI5040 y enviar comandos, fue posible controlar los LED por completo
    • Se concluyó que no había problemas físicos en el circuito del driver de LED ni en el arreglo de LED
    • Incluso al volver a montar el IT1504 original, el control con la Pico funcionaba correctamente, por lo que el driver de LED original tampoco estaba averiado

Análisis del firmware del MCU Nuvoton con Ghidra

  • Se consultó al soporte de Elgato por problemas conocidos o ajustes relacionados con los LED de estado, pero no se obtuvo una solución práctica
  • Para revisar el firmware del MCU Nuvoton, se rastreó el conector JST de 4 pines de la placa y se confirmó que era el conector de programación del MCU
  • Se intentó leerlo con Nu-Link2-Me y NuMicro ICP Programming Tool, pero el contenido del chip estaba protegido
  • En su lugar, se encontró el archivo FW_HD60_S_MCU.bin incluido en Elgato 4K Capture Utility
    • Según ElgatoDeviceCapabilities.json, este firmware es para dispositivos con USB product ID 0x0076
    • Elgato lo llamaba “Game Capture HD60 S Rev.4”
  • El binario parecía firmware para Cortex-M0: la primera palabra, 0x20000E70, parecía un puntero de pila válido, y las palabras siguientes tenían el aspecto de una tabla de vectores con direcciones de flash
  • Se cargó el firmware en Ghidra y se intentó mapear registros usando SVD-Loader
    • Se modificó M031AE_v1.svd de NuMicro_DFP para que pudiera cargarse en el plugin
    • El M031BSP de Nuvoton ayudó a identificar funciones

Reemplazo y desbloqueo del MCU para depuración

  • Al montar un chip nuevo y vacío en lugar del M031LD2AE original y flashear el firmware de Elgato, el dispositivo funcionó, pero el chip volvió a quedar protegido y no podía depurarse
  • En Ghidra se encontró la función que actualizaba la configuración de protección y se parcheó para no bloquear el chip
  • Al cargar el firmware parcheado, fue posible depurar el código de inicialización con OpenOCD y GDB
  • La ruta de código de control de LED estaba dentro del firmware, pero se saltaba durante el flujo de ejecución normal
  • Al forzar en GDB valores en registros y RAM para que se ejecutara el código de control de LED, se pudo encender la iluminación
    • El firmware contiene código de control de LED
    • El problema era que ese código no se ejecutaba bajo las condiciones normales

Bootloader y respaldo completo del firmware

  • Se hizo un experimento instalando, mediante la ruta de actualización de Elgato, el firmware con los bits de protección desactivados en otro HD60 S para poder leer el contenido completo que originalmente estaba protegido
  • Después de la actualización, el dispositivo parecía no funcionar como tarjeta de captura, pero el chip sí había quedado desbloqueado como se pretendía
  • Como resultado se pudieron leer las siguientes áreas
    • LDROM: bootloader de primera etapa de Elgato
    • Flash de datos
    • Valores originales de los registros de configuración
    • Firmware de aplicación APROM
  • El bootloader LDROM podía recibir comandos y datos por I2C para reflashear APROM
  • Si el chip estaba desbloqueado, el bootloader no saltaba al firmware de aplicación y esperaba comandos de actualización
    • Elgato estaba usando los bits de bloqueo/desbloqueo como una especie de señal para indicar si debía esperar en el bootloader
    • Esto también explica por qué el dispositivo quedaba detenido tras instalar el firmware desbloqueado

Comprensión de la estructura interna del HD60 S

  • Dentro del dispositivo trabajan juntos dos procesadores de la familia ARM
    • El chip periférico USB 3.0 Cypress/Infineon CYUSB3014 usa ARM926EJ-S y se comunica con la PC por USB 3.0
    • El MCU Cortex-M0 Nuvoton M031LD2AE controla los chips de video ITE y los LED
  • El MCU Nuvoton configura y supervisa los chips ITE mediante un bus I2C separado
    • El ITE IT6802E parece ser el receptor HDMI
    • El ITE IT66121FN parece encargarse de sacar un flujo de datos paralelo como HDMI
  • El CYUSB3014 envía comandos por I2C al MCU Nuvoton, y Nuvoton devuelve información de estado al CYUSB3014
  • El CYUSB3014 recibe del IT6802E el flujo de datos de video y lo entrega a la computadora por USB
  • En la placa también hay un CPLD Altera MAX II, que aparentemente participa en adaptar los datos de video al formato que el CYUSB3014 puede recibir

Descubrimiento de la flash SPI y los datos de animación de LED

  • El firmware del CYUSB3014 estaba almacenado sin protección en una flash SPI Winbond W25Q32JVSSIQ de 4 MB
  • Al revisar el volcado de la flash SPI, desde el offset 0x300000 había bloques de datos que parecían pequeñas imágenes
  • Al rastrear cinco GPIO desconocidos del firmware Nuvoton, se encontró que esos pines iban a un bus switch mux/demux quad 2:1 PI5C3257 de Diodes Incorporated
  • Este bus switch selecciona si el CYUSB3014 o el MCU Nuvoton es quien se conecta a la flash SPI
    • Al principio se pensó que la flash SPI era exclusiva del CYUSB3014
    • En realidad, después de que arranca el CYUSB3014, el MCU Nuvoton toma el control de la flash SPI
  • Las funciones recién identificadas en Ghidra correspondían a transacciones SPI por bit banging y a código para borrar, leer y escribir la flash SPI

La causa real de la falla de los LED

  • Los datos posteriores a 0x300000 en la flash SPI no eran imágenes comunes, sino fotogramas de animación para los LED
    • Cada bloque de 16 bytes es un fotograma de animación usado para los 14 LED
    • Los últimos 2 bytes de cada fila son el tiempo de espera antes de pasar al siguiente fotograma
  • El firmware Nuvoton verificaba si los primeros 2 bytes en la posición inicial 0x300000 eran el valor de 16 bits 0xAA55
  • En los volcados de la flash SPI de dos dispositivos cuyos LED no funcionaban, esa área estaba vacía o dañada
    • En un volcado, el área 0x300000 estaba casi totalmente llena de 0x00
    • Algunas animaciones empezaban con encabezados extraños como AB 03 12 39
  • La flash SPI de un tercer HD60 S que funcionaba correctamente sí tenía en 0x300000 el encabezado y los datos de LED correctos
    • La primera palabra de 16 bits era el 0xAA55 que buscaba el firmware
    • El encabezado incluía información relacionada con 26 animaciones de LED
    • Los datos de dot correction cargados en el IT1504 estaban en 0x3007F8, y el 0x521114A7 que venía después era el CRC-32 de los 16 bytes anteriores

Recuperación de los LED parcheando la flash SPI

  • En la flash SPI del dispositivo problemático se preservaron los datos propios de cada unidad desde 0x000000 hasta 0x2FFFFF
    • Porque el número de serie USB estaba incluido en algún lugar de esa área
  • Se creó una imagen híbrida reemplazando solo el área de datos de LED desde 0x300000 con datos tomados del volcado de un dispositivo funcional
  • Al flashear esta imagen en el dispositivo con LED defectuosos, los LED blancos parpadearon dos veces y los LED rojos se encendieron brevemente una vez
  • Aunque el dispositivo funcional era una revisión más antigua y también tenía otro modelo de MCU Nuvoton, los datos de LED coincidían con el formato que esperaba el firmware nuevo
  • Las apps Game Capture existentes para Windows y Mac también contenían los datos crudos de animación
    • La ruta en Windows es C:\Program Files\Elgato\GameCapture\Animations
    • La ruta en Mac es /Applications/Game Capture HD.app/Contents/Resources/Animations
    • Al reordenar los datos de archivos como 01.ani, 02.ani, etc., según el orden de los LED, coincidían con los datos de animación del volcado de flash correcto

Limitaciones de la herramienta de actualización y del procedimiento de recuperación

  • La actualización de firmware para Windows de Elgato 4K Capture Utility tenía el problema de no esperar el tiempo suficiente
    • Mostraba un fallo cuando la actualización todavía estaba en curso
    • Si se seguía esperando, los LED del dispositivo parpadeaban y reiniciaba correctamente con el firmware nuevo
    • Si se desconectaba el dispositivo justo después del mensaje de error, podía quedar una flash incompleta
  • Al aumentar el valor updateDurationSec de ElgatoDeviceCapabilities.json de 40 a 80, el problema se resolvió
  • Elgato recomienda no actualizar el firmware del HD60 S salvo que soporte técnico lo indique, y la función además está oculta detrás de una combinación especial de teclas en la pantalla de configuración
  • El procedimiento de recuperación de los LED es complejo
    • Modificar ElgatoDeviceCapabilities.json para permitir la actualización de firmware
    • Desconectar el dispositivo justo después de iniciar la actualización para hacer que el chip Cypress controle la flash SPI
    • Retirar un jumper de la PCB para que el CYUSB3014 arranque desde USB
    • Cargar cyfxflashprog.img en RAM con download_fx3 del Cypress SDK
    • Volcar toda la flash SPI con un fx3_spitest modificado y parchear el área de LED
    • Restaurar el jumper y realizar una actualización normal de firmware desde 4K Capture Utility para restaurar el firmware Nuvoton
  • Al final, la reparación original se resolvió reemplazando tres chips de menos de 1 dólar en total, y el problema de los LED se identificó como un defecto relacionado con software, programación o actualización que afecta a algunos HD60 S

1 comentarios

 
GN⁺ 2024-09-18
Opiniones en Hacker News
  • Era difícil entender el propósito dentro de la estructura general, y a veces estaba enterrado muy adentro de varias capas de llamadas a funciones.
    Esto pasa seguido incluso cuando uno puede ver directamente el código fuente. La mayor parte del software está demasiado abstraído, y como los MCU se volvieron tan grandes y baratos, en sistemas embebidos ya se empieza a ver cosas como dispositivos de captura HDMI con dos núcleos ARM. No creo que este dispositivo necesitara más de un MCU.

  • Hace unos 20 años, cuando crecía en India, como el poder adquisitivo era bajo y las cosas eran caras, arreglábamos o reacondicionábamos casi todo.
    Para hacer que las cosas funcionaran usábamos todo tipo de soluciones improvisadas, llamadas jugaad, y también reutilizábamos la ropa; los sastres hacían remiendos llamados rafu para alargarle la vida útil. Era especialmente común en familias de clase media como la mía.
    Mi padre, que trabajaba en una empresa exportadora de ropa, solía decir que la gente de Occidente prefería las cosas desechables y nuevas, ya fueran autos, electrónicos o ropa; en ese momento no entendía esa mentalidad. Pero ahora, con el aumento del poder adquisitivo y la baja de precios gracias a China, nosotros también nos estamos inclinando por tirar y comprar nuevo.
    Respeto profundamente a quienes no se rinden a mitad de camino ni piensan simplemente que comprar algo nuevo es más fácil. Esa perseverancia e ingenio realmente merecen elogios.

    • El precio de los productos nuevos bajó, mientras que el costo de reparación subió.
      Si puedes arreglarlo tú mismo y conseguir las piezas necesarias, está bien. Pero si hay que pagar por la experiencia y el conocimiento de alguien, al menos donde vivo, es bastante caro y también es difícil encontrar a alguien que lo repare. Veo muchos letreros de reparación de televisores afuera de locales vacíos.
      Por suerte estoy semirretirado y me pagan por hora, así que mi tiempo extra no tiene costo monetario. Por eso puedo dedicar un día a intentar reparar el lavavajillas y, si se vuelve a romper unos días después, dedicar otro día a instalar uno nuevo. Un instalador profesional habría instalado el equipo nuevo en una hora, pero al menos no tuve que esperar a que me dieran turno.
    • En Europa occidental también fue parecido durante mucho tiempo. La generación de mis padres creció remendando ropa y reparando muchas cosas.
      Recién en los últimos 50 años, más o menos, creció el consumismo y bajaron la calidad y el precio de cosas como la ropa.
      Últimamente estoy haciendo yo mismo el mantenimiento de mi moto; al principio hace falta invertir un poco en herramientas, como una para aflojar el filtro de aceite, y también conseguir piezas y consumibles: aceites, arandelas de cobre, tornillos para reemplazar los tornillos viejos del depósito de líquido de frenos, etc. Aun así, termina costando alrededor de €100~€150 en lugar de los €1000 que me cotizó el taller.
    • También era así cuando crecí en una familia obrera del noreste de Estados Unidos en los años 80. Mi padre arreglaba todo lo de la casa y los vehículos; yo heredaba la ropa de mis hermanos, y mis hermanos menores heredaban la mía.
      Mi madre nos acortaba los dobladillos de los pantalones cuando éramos chicos y los volvía a alargar cuando crecíamos; si se gastaban las rodillas o los codos, los remendaba.
      Ese entorno me inculcó tanto buenos como malos hábitos. Hago casi todas las reparaciones de la casa yo mismo, pero trabajo demasiado y no siempre tengo el tiempo o la energía suficiente. Me cuesta pagarle a otra persona para que haga algo, aunque perfectamente podría permitírmelo, y por eso termino dejando cosas rotas más tiempo del necesario.
      Quizá tendría más dinero si hubiera dedicado ese tiempo a proyectos paralelos en vez de mantenimiento y reparaciones.
    • Antes, reparar era más bien conocimiento de la comunidad. Alguien del barrio sabía de soldadura, otra persona de electricidad, albañilería, arreglos de ropa, etc.
      Esas personas enseñaban a otras hasta un nivel básico y ayudaban cuando aparecían problemas inesperados. En cierto modo, el conocimiento y una forma básica de aprendizaje por oficio estaban integrados en toda la comunidad.
      Hoy reparar se volvió una tarea solitaria. Cosas como YouTube ayudan muchísimo, pero el aspecto comunitario desapareció.
    • La mentalidad del consumismo es casi un lujo creado por una economía fuerte y una alta movilidad ascendente.
      Como efecto secundario lamentable, al volverse menos atractivas la reparación y la reutilización, la reparabilidad y la larga vida útil también pasaron a importar menos como características de los productos. Ahora que el crecimiento económico en EE. UU. está estancado, especialmente para el 99%, se vuelve evidente lo que perdimos. Ya no hay cosas hechas para durar, y las empresas no ofrecen —o no pueden ofrecer— productos reparables y duraderos. Por eso, incluso quienes se esfuerzan deliberadamente por arreglar sus propias cosas se topan con innumerables obstáculos.
  • Me pareció interesante el momento en que se da cuenta de que el bloque de datos dentro del chip flash eran imágenes. No imágenes en el sentido habitual, sino datos que describían varias animaciones LED.
    Una vez hice por mi cuenta un formato similar para animaciones de lámparas Hue, aunque era de texto, no binario.
    bulb1 bulb2
    dly R G B WW CW R G B WW CW
    100 10 25 20 0 0 25 10 20 0 0
    200 10 50 20 0 0 50 10 20 0 0
    El primer valor son los milisegundos de demora antes de pasar a la siguiente línea, y después se indica el brillo de cada canal LED sobre una base de 100. Las líneas que empiezan con algo que no sea un número son comentarios, y puede haber cualquier cantidad de uno o más espacios entre los canales.
    Es divertido ver un formato binario parecido en un producto comercial. En realidad es una forma bastante obvia, pero aun así resulta interesante verla directamente.

  • Fue un texto que te pone humilde. Esto sí es ingeniería full-stack de verdad.

    • De verdad te pone humilde. Incluso tomando este artículo como punto de partida, creo que me tomaría semanas lograrlo.
  • Me gustaría ver cómo responde Elgato a este artículo.

    • A mí también. Es fácil imaginar a los ingenieros leyendo este artículo fascinante con los ojos llenos de entusiasmo, y a los gerentes enojados exigiendo mejores formas de proteger la propiedad intelectual de la empresa.
    • Ahora tendría que responder Corsair, que es dueña de Elgato. Personalmente la veo más como una empresa tradicional que cotiza en bolsa, así que si hubiera una respuesta, me sorprendería gratamente.
    • Ahora me da curiosidad si ellos conocen la causa del problema de los LED o la causa de la corrupción de memoria subyacente.
  • En mi experiencia, los productos de Elgato son baratos pero terriblemente inestables. Este artículo muestra con lujo de detalle por qué.

    • Los problemas de parpadeo y corrupción apuntan a una cultura de ingeniería de software muy mala.
    • Lo triste es que los productos en sí, como Key Light o Stream Deck, son geniales y realmente útiles.
      El software también tiene todas las funciones que uno quiere, permite crear plugins propios y el proceso para hacerlos está documentado. Todo eso está realmente bien.
      Pero en la práctica tengo que apagar y prender todo el tiempo la Key Light, y en Windows también tengo que reiniciar constantemente la app de Stream Deck.
  • Me pregunto cómo se mantiene la motivación en proyectos así. Hay que pedir piezas una y otra vez y esperar a que lleguen; sobre todo con piezas que vienen de China, la espera hace que uno abandone bastantes proyectos.

    • El tiempo es un problema, pero también lo es el costo de pedir esas piezas. Cada una cuesta apenas unos centavos, pero no se puede saber de antemano todas las piezas que vas a necesitar.
      Si conté bien, el autor hizo al menos tres pedidos. Aun así, es realmente interesante.
  • Si no tienes una cámara térmica, puedes poner alcohol isopropílico sobre la placa y ver dónde se evapora más rápido.
    Claro que es un método viable solo en dispositivos de bajo voltaje.

  • La capacidad de buscar la verdad y seguirla hasta el final es lo que nos vuelve sagrados, la faceta humana de crear y mejorar cosas. Esta persona, al explorar un objeto mundano, recorrió un camino espiritual muy profundo.
    Es muy triste, frustrante e infernal que los dispositivos se resistan a nosotros. Las computadoras y los aparatos deberían amplificar y emitir la verdad de la que están hechos. Pero la humanidad está atrapada dentro de las carcasas que ella misma creó, en un consumismo vertical que niega la participación y la posibilidad de aprender. En especial, las computadoras muchas veces se convierten en el ejemplo típico de dispositivos de opacificación que ocultan la verdad y la comprensión. Se desperdicia un potencial enorme.
    Espero ver, mientras viva, una ola de avances que traiga máquinas abiertas. Aplausos para Doug.