perri.to: Un mejunje de cosas

Ingeniería inversa de mi escritorio de pie kqueo, parte 1

  2022-12-29


Cómo empezó

Cuando me mudé a Francia tuve que rearmar mi oficina en casa. Para el escritorio opté por una marca local: kqueo. Supuse que, en el mejor de los casos, era un producto local, y en el peor, una remarca genérica para la cual podrían proveerme repuestos si hiciera falta. Elegí este modelo: dos motores, una caja de control central y un panel con 3 botones para posición de memoria, subir, bajar y M (para guardar posiciones), más un display de 3 dígitos.

Hace unos meses noté que el panel, que la mayor parte del tiempo está apagado salvo que se lo despierte, no se despertaba ni movía el escritorio. El soporte técnico me mandó un reemplazo enseguida solo con mi número de serie, eso estuvo buenísimo, y acá es donde empieza la diversión.

Al enchufar el panel nuevo, inmediatamente mostró la posición real del escritorio y parecía recordar mis alturas memorizadas. Esto significa que la mayor parte de la lógica está en la caja y, por lo tanto, yo podría construir una unidad de control alternativa comandada por voz.

Un poco de forense sobre el roto

El panel se ve, desde afuera, prácticamente igual a cualquier otro panel del mercado.

KQUEO control panel

Por dentro es bastante distinto

KQUEO control panel board front

KQUEO control panel board back

Los componentes relevantes de esto son:

  • MC96F8208s, un microcontrolador CMOS de 8 bits en un solo chip con conversor A/D de 12 bits
  • 74HC595D, un registro de desplazamiento de 8 bits con entrada serie y salida serie o paralela con latches de salida
  • Un display de 3 dígitos de 7 segmentos y 11 pines, completamente genérico; el pinout de todos los que están a la venta parece ser el mismo.

La principal diferencia con todos los otros modelos a los que la gente les hizo algún nivel de ingeniería inversa es que este tiene solo 4 cables.

  • VCC (5v)
  • GND
  • Tx
  • Rx

Un poco de forense sobre el que funciona.

En ese momento no sabía muy bien qué eran TX y RX. Le pregunté a un amigo que resulta ser ingeniero en electrónica y experto en el tema (hace consultoría, no duden en contratarlo :p). Me orientó hacia un dispositivo que podía usar para interceptar lo que el panel hablaba con la caja de control, junto con el software apropiado.

Logic Analyzer

Breadboard wiring for logic analyzer

Breadboard wiring for logic analyzer

Breadboard wiring for logic analyzer

Pasé un rato subiendo y bajando el escritorio mientras mis perros me miraban bastante confundidos, capturando la conversación con Saleae Logic 2

No tenía idea de qué protocolo usaba exactamente esta conexión, así que directamente adiviné basándome en el hecho de que los dos pines de datos del cable están conectados a los pines 6 y 7 del MCU, que son TXD(SCL)/RXD(SDA) respectivamente.

Saleae permite pasar la señal capturada por varios analizadores incorporados; el correcto terminó siendo UART a 57600 Bits/s, serie asincrónico de 8 bits.

Dándole sentido a los datos capturados.

Capturé una buena cantidad de datos:

Ahora bien, para darle sentido a estos datos, necesitaba saber qué hace la placa.

Algunos datos:

  • El display de 3 dígitos es un modelo de cátodo común; los pines 12, 9 y 8 deben ir a masa para encender los dígitos 1, 2 y 3 respectivamente
  • Los pines 12, 9 y 8 están conectados a AN10, AN8 y AN9 del MCU respectivamente a través de un diodo.
  • El registro de desplazamiento es controlado directamente por el MCU; recibe 8 bits en serie, luego un reset de clk y envía los datos (creo)
  • Las letras usadas para el pinout del LCD son las comunes A-G y . para representar los segmentos de un dígito, tal como se muestra en este gráfico de wikipedia

LCD Pinout

Continuará

Suponiendo que mapeé el circuito correctamente y que entendí bien el protocolo, la única pieza que falta es mapear los mensajes del gist a los bits enviados a la pantalla LCD.

Actualmente estoy tratando de mapear la última línea del gist:

0xE4,0xF7,0x00,0x00,0x00,0x00,0x55,0x10,0x98,0x00,0x00,0x01,0x53,0x61

Para que de alguna manera produzca:

0x22,0x22,CB para enviar al registro de desplazamiento