Ingeniería inversa de algunos vaporizadores desechables recargables que incluyen una pequeña pantalla LCD TFT a color (Raz TN9000/Kraze HD7K/etc.).
Se pueden encontrar más actualizaciones en https://github.com/ginbot86/ColorLCDVape-RE
Algunos vaporizadores desechables en el mercado incluyen accesorios como una pantalla LCD en color y capacidad de recarga USB-C, pero son dispositivos desechables de un solo uso; esto hace que estos dispositivos sean bastante perjudiciales para el medio ambiente. Por otro lado, esto abre oportunidades para que los aficionados/ingenieros puedan recuperar el hardware, reutilizar el vaporizador tal como está rellenándolo con jugo de vaporizador fresco y reiniciando el medidor interno, o incluso personalizarlo editando las imágenes integradas.
El vaporizador específico que se investiga en este proyecto tiene varios nombres, pero el que se investigó específicamente se llamó Kraze HD7K. Sin embargo, este vaporizador también se ha visto bajo la marca "RAZ", como el RAZ TN9000.
Los vaporizadores desechables generalmente utilizan baterías de iones de litio sin ningún circuito de protección. Los cortocircuitos podrían disipar cantidades incontroladas de energía, causando lesiones personales y/o daños a la propiedad. Cualquier trabajo realizado en estos vaporizadores se realiza bajo su propio riesgo.
Se ha determinado que existen múltiples revisiones de circuitos de estos vaporizadores, que pueden tener incompatibilidades que podrían provocar daños en el dispositivo si las versiones no coinciden. Verifique las conexiones y la compatibilidad del firmware antes de realizar cualquier modificación.
Además, el jugo/"e-líquido" para vapear puede contener altas concentraciones de nicotina, que se absorbe a través de la piel. La manipulación de las partes internas del vaporizador debe realizarse con guantes hasta que las partes internas estén limpias de jugo y/o residuos.
El trabajo de otras personas con estos vaporizadores incluye, entre otros:
El trabajo realizado en los repositorios antes mencionados puede basarse o no en el trabajo realizado en este proyecto; está destinado a vincular proyectos similares con la esperanza de que se puedan realizar más esfuerzos comunitarios en estos vaporizadores.
El vaporizador utiliza el siguiente hardware:
El vaporizador utiliza una pantalla LCD IPS de 0,96 pulgadas con resolución de 80x160, con un cable plano flexible (FPC) de 13 pines y 0,7 mm de paso que está soldado a la placa base del vaporizador. Se conecta a través de SPI de 4 cables (datos, reloj, datos/comando, selección de chip) y parece usar el controlador ST7735S. Incluso utiliza el mismo pinout para pantallas disponibles comercialmente, como Smart Prototyping #102106.
Alfiler | Nombre | Función |
---|---|---|
1 | TP0/NC | No usado |
2 | TP1/NC | No usado |
3 | SDIN | Datos SPI a LCD |
4 | SCLK | reloj SPI |
5 | RS | Lógica baja = comando, alta = datos |
6 | /RST | Restablecer (activo-bajo) |
7 | /CS | Selección de chip (activo-bajo) |
8 | Tierra | Fuente de alimentación/tierra de señal |
9 | CAROLINA DEL NORTE | No conectado |
10 | VDD | Fuente de alimentación (3,3 V) |
11 | LEDK | Cátodo de retroiluminación LED |
12 | LEDA | Ánodo de retroiluminación LED |
13 | Tierra | Fuente de alimentación/tierra de señal |
Hay dos formas de memoria Flash en el vaporizador: Flash interna en el microcontrolador y 1 megabyte (8 megabits) de Flash SPI NOR externo. El primero contiene el firmware, mientras que el segundo contiene todas las imágenes que se muestran en la pantalla LCD, así como el tiempo total que estuvo en uso la bobina de calentamiento del vapeo; Este contador se utiliza para derivar el número de "barras" que se muestran en el medidor de jugo de vapeo. El análisis del bus de datos de la pantalla LCD (consulte la captura lógica .dsl utilizando DreamSourceLab DSView) sugiere que el microcontrolador utiliza DMA (acceso directo a la memoria) para transmitir datos de imágenes desde el flash externo a la pantalla LCD, ya que las transferencias de datos se producen como fragmentos contiguos de 4096 bytes. , correspondiente a una única página NOR Flash. El análisis de la memoria del microcontrolador indica que el búfer de memoria DMA se encuentra en las direcciones RAM 0x2000022C-0x2000062B.
Todas las imágenes se almacenan en el Flash externo como mapas de bits RGB565 sin procesar de 16 bits (es decir, cada píxel ocupa 2 bytes de datos). Las herramientas de conversión, como ImageConverter565 de la biblioteca UTFT de Rinky-Dink Electronics, se pueden utilizar para convertir formatos de imagen como JPEG/PNG en un archivo binario sin formato que se puede parchear en el Flash externo con el desplazamiento correspondiente. No hay metadatos almacenados con las imágenes sin procesar, por lo que las dimensiones de la imagen deben proporcionarse manualmente, como se muestra en la siguiente tabla.
Índice (#) | Desplazamiento (hexadecimal) | Longitud (hexadecimal) | Marco H (px) | Cuadro V (píxeles) | Categoría | ¿No usado? | Sec. (#) | Notas |
---|---|---|---|---|---|---|---|---|
0 | 0 | 6400 | 80 | 160 | Fondo | 0 | ||
1 | 6400 | 2880 | 72 | 72 | Icono de batería | 0 | ||
2 | 8C80 | 2880 | 72 | 72 | Icono de batería | 1 | ||
3 | B500 | 2880 | 72 | 72 | Icono de batería | 2 | ||
4 | DD80 | 2880 | 72 | 72 | Icono de batería | 3 | ||
5 | 10600 | 2880 | 72 | 72 | Icono de batería | 4 | ||
6 | 12E80 | 2880 | 72 | 72 | Icono de batería | 5 | ||
7 | 15700 | 2880 | 72 | 72 | Icono de batería | 6 | ||
8 | 17F80 | 2880 | 72 | 72 | Icono de batería | 7 | ||
9 | 1A800 | 2880 | 72 | 72 | Icono de batería | 8 | ||
10 | 1D080 | 2880 | 72 | 72 | Icono de batería | 9 | ||
11 | 1F900 | 2880 | 72 | 72 | Icono de batería | 10 | ||
12 | 22180 | 2880 | 72 | 72 | Icono de jugo | 0 | ||
13 | 24A00 | 2880 | 72 | 72 | Icono de jugo | 1 | ||
14 | 27280 | 2880 | 72 | 72 | Icono de jugo | 2 | ||
15 | 29B00 | 2880 | 72 | 72 | Icono de jugo | 3 | ||
16 | 2C380 | 2880 | 72 | 72 | Icono de jugo | 4 | ||
17 | 2EC00 | 2880 | 72 | 72 | Icono de jugo | 5 | ||
18 | 31480 | 2880 | 72 | 72 | Icono de jugo | 6 | ||
19 | 33D00 | 6400 | 80 | 160 | Animación de vapeo | 0 | ||
20 | 3A100 | 6400 | 80 | 160 | Animación de vapeo | 1 | ||
21 | 40500 | 6400 | 80 | 160 | Animación de vapeo | 2 | ||
22 | 46900 | 6400 | 80 | 160 | Animación de vapeo | 3 | ||
23 | 4CD00 | 6400 | 80 | 160 | Animación de vapeo | 4 | ||
24 | 53100 | 6400 | 80 | 160 | Animación de vapeo | 5 | ||
25 | 59500 | 6400 | 80 | 160 | Animación de vapeo | 6 | ||
26 | 5F900 | 6400 | 80 | 160 | Animación de vapeo | 7 | ||
27 | 65D00 | 6400 | 80 | 160 | Animación de vapeo | 8 | ||
28 | 6C100 | 6400 | 80 | 160 | Animación de vapeo | 9 | ||
29 | 72500 | 6400 | 80 | 160 | Animación de vapeo | 10 | ||
30 | 78900 | 6400 | 80 | 160 | Animación de vapeo | 11 | ||
31 | 7ED00 | 6400 | 80 | 160 | Animación de vapeo | 12 | ||
32 | 85100 | 6400 | 80 | 160 | Animación de vapeo | 13 | ||
33 | 8B500 | 6400 | 80 | 160 | Animación de vapeo | 14 | ||
34 | 91900 | 6400 | 80 | 160 | Animación de vapeo | 15 | ||
35 | 97D00 | 6400 | 80 | 160 | Fondo del complemento 1 | No usado | 16 | 1 |
36 | 9E100 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 0 | 1 |
37 | 9F8CA | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 1 | 1 |
38 | A1094 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 2 | 1 |
39 | A285E | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 3 | 1 |
40 | A4028 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 4 | 1 |
41 | A57F2 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 5 | 1 |
42 | A6FBC | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 6 | 1 |
43 | A8786 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 7 | 1 |
44 | A9F50 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 8 | 1 |
45 | AB71A | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 9 | 1 |
46 | ACEE4 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 10 | 1 |
47 | AE6AE | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 11 | 1 |
48 | AFE78 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 12 | 1 |
49 | B1642 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 13 | 1 |
50 | B2E0C | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 14 | 1 |
51 | B45D6 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 15 | 1 |
52 | B5DA0 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 16 | 1 |
53 | B756A | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 17 | 1 |
54 | B8D34 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 18 | 1 |
55 | BA4FE | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 19 | 1 |
56 | BBCC8 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 20 | 1 |
57 | BD492 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 21 | 1 |
58 | BEC5C | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 22 | 1 |
59 | C0426 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 23 | 1 |
60 | C1BF0 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 24 | 1 |
61 | C33BA | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 25 | 1 |
62 | C4B84 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 26 | 1 |
63 | C634E | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 27 | 1 |
64 | C7B18 | 17CA | 35 | 87 | Limpiar el logotipo | No usado | 28 | 1 |
65 | C92E2 | 6400 | 80 | 160 | Fondo del complemento 2 | No usado | 0 | 1 |
66 | CF6E2 | F80 | 31 | 64 | Animación de barras de batería | No usado | 0 | 1 |
67 | D0662 | F80 | 31 | 64 | Animación de barras de batería | No usado | 1 | 1 |
68 | D15E2 | F80 | 31 | 64 | Animación de barras de batería | No usado | 2 | 1 |
69 | D2562 | F80 | 31 | 64 | Animación de barras de batería | No usado | 3 | 1 |
70 | D34E2 | F80 | 31 | 64 | Animación de barras de batería | No usado | 4 | 1 |
71 | D4462 | F80 | 31 | 64 | Animación de barras de batería | No usado | 5 | 1 |
72 | D53E2 | 6400 | 80 | 160 | Fondo del complemento 3 | 0 | ||
73 | DB7E2 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 0 | ||
74 | DC67C | E9A | 21 | 89 | Limpiar el logotipo del cargador | 1 | ||
75 | DD516 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 2 | ||
76 | DE3B0 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 3 | ||
77 | DF24A | E9A | 21 | 89 | Limpiar el logotipo del cargador | 4 | ||
78 | E00E4 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 5 | ||
79 | E0F7E | E9A | 21 | 89 | Limpiar el logotipo del cargador | 6 | ||
80 | E1E18 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 7 | ||
81 | E2CB2 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 8 | ||
82 | E3B4C | E9A | 21 | 89 | Limpiar el logotipo del cargador | 9 | ||
83 | E49E6 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 10 | ||
84 | E5880 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 11 | ||
85 | E671A | E9A | 21 | 89 | Limpiar el logotipo del cargador | 12 | ||
86 | E75B4 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 13 | ||
87 | E844E | E9A | 21 | 89 | Limpiar el logotipo del cargador | 14 | ||
88 | E92E8 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 15 | ||
89 | EA182 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 16 | ||
90 | EB01C | E9A | 21 | 89 | Limpiar el logotipo del cargador | 17 | ||
91 | EBEB6 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 18 | ||
92 | ECD50 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 19 | ||
93 | EDBEA | E9A | 21 | 89 | Limpiar el logotipo del cargador | 20 | ||
94 | EEE84 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 21 | ||
95 | EF91E | E9A | 21 | 89 | Limpiar el logotipo del cargador | 22 | ||
96 | F07B8 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 23 | ||
97 | F1652 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 24 | ||
98 | F24EC | E9A | 21 | 89 | Limpiar el logotipo del cargador | 25 | ||
99 | F3386 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 26 | ||
100 | F4220 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 27 | ||
101 | F50BA | E9A | 21 | 89 | Limpiar el logotipo del cargador | 28 | ||
102 | F5F54 | E9A | 21 | 89 | Limpiar el logotipo del cargador | 29 | ||
103 | F6DEE | E9A | 21 | 89 | Limpiar el logotipo del cargador | 30 | ||
104 | F8000 | 4 | N / A | N / A | Tiempo total de vapeo x0,01 s (LSB->MSB) | N / A | 2 | |
105 | F8004 | 1 | N / A | N / A | Bandera de Vape en uso (0xBB) | N / A | 3 |
Se han incluido dos scripts de Python para ayudar a dividir y volver a ensamblar el volcado de Flash en/desde las imágenes individuales almacenadas en SPI Flash: split-flashdump.py
y assemble-flashdump.py
. Actualmente, las herramientas no realizan conversión de formato (conseguir que ChatGPT me ayude hasta ahora ya fue un proceso largo), pero contribuyen en gran medida a ayudar en la creación de paquetes de "temas" personalizados. Los recursos no utilizados se pueden eliminar del volcado Flash recompactado manteniéndolos fuera del directorio que contiene los archivos que se van a volver a ensamblar; esas regiones no utilizadas permanecerán como 0xFF/bytes borrados.
El reempaquetador, assemble-flashdump.py
, espera que los nombres de los archivos de entrada tengan un formato específico, ya que utiliza el desplazamiento codificado en hexadecimal para determinar dónde insertar cada pieza en el archivo de volcado Flash de 1 MB (consulte split_map.csv o el ejemplo incluido). tema, que se describe a continuación en Paquetes de temas personalizados ):
{index}_{offset}_{width}x{height}_{category}_{sequence}.bin
19_33d00_80x160_vapeanim-0.bin
Para convertir imágenes PNG o JPEG, utilice la herramienta ImgConv.exe
de la biblioteca UTFT mencionada anteriormente:
ImgConv.exe *.png /r
ImgConv.exe *.jpg /r
ren *.raw *.bin
Nota: asegúrese de que las imágenes que se van a convertir al formato .bin tengan las dimensiones correctas ANTES de convertirlas.
Como prueba de concepto, se incluye un paquete de temas terminado al estilo de Windows 95; implementa todos los recursos para los indicadores de batería y carga, animación de carga (solo fondo del complemento 3 y borrado del logotipo del cargador, ya que es la única animación utilizada con el firmware probado) y animación de vapeo (una captura correcta de la relación de aspecto del 3D). Salvapantallas de tuberías). Todo lo que se necesita es acceso al SPI Flash y un medio para reprogramarlo. El espacio para ampliar este concepto podría ser a través de un dongle USB SWD económico, conectado a través del puerto USB-C, y algún software que cargue una pequeña herramienta de reprogramación en la RAM del microcontrolador, eliminando potencialmente la necesidad de desoldar el chip Flash.
También se ha incluido una plantilla en blanco/editable. Todos los fotogramas se implementan con números de fotograma para animaciones.
¡Toda esta personalización es posible sin tocar el firmware del microcontrolador!
Como se describe en Diseño de la memoria flash externa , notas 2 y 3 anteriores, llenar las ubicaciones de la memoria flash externa 0xF8000-0xF8004 con 0xFF restablecerá el medidor de jugo al máximo, lo que permitirá la reutilización del vaporizador una vez que se rellene el depósito. Luego, es necesario restablecer el microcontrolador tirando del pin nRST a tierra o reiniciándolo desconectando y volviendo a conectar la batería; Es probable que esto ya haya sucedido si uno está desoldando y resoldando el Flash externo para reprogramarlo/parchearlo.
El microcontrolador utiliza la interfaz de depuración/programación Serial Wire Debug (SWD) estándar de la industria para leer/escribir su firmware y/o su memoria SRAM interna. La interfaz SWD está expuesta a través del puerto de carga USB-C del vaporizador. Las líneas SWDIO/SWCLK están conectadas a los pines CC detrás de las resistencias pulldown normales de 5.1k Rd, ya que el conector normalmente es solo de alimentación.
El firmware del microcontrolador no está protegido contra lectura, por lo que una posible vía es investigar más a fondo el firmware mediante descompilación. Es posible utilizar esta interfaz de depuración para interactuar con el Flash externo, pero esto aún no se ha investigado.
Algunas de las placas base de vapeo que se probaron tenían almohadillas de prueba RX/TX en la parte posterior de la placa. Aún no se ha investigado cómo interactúa este puerto con el firmware y/o si se puede utilizar para actualizar el contenido Flash externo.
El vaporizador se compone de dos PCB, unidas entre sí con un conector macho en ángulo recto de 9 pines y paso de 0,15 mm:
El pin 1 se indica mediante una almohadilla cuadrada en la placa de alimentación y una almohadilla correspondiente en la parte inferior de la placa lógica (lado opuesto del microcontrolador, SPI Flash y LCD). ADVERTENCIA: ¡Las marcas del pin 1 pueden estar opuestas entre sí entre las dos tablas!
Pin de la placa de alimentación | Pin de la placa lógica | Nombre | Función |
---|---|---|---|
1 | 9 | VBAT | Positivo de batería (+) en placa de alimentación |
2 | 8 | VBUS | +5 V desde el puerto USB-C en la placa de alimentación con fusible SMD, marca "B" |
3 | 7 | Tierra | Tierra de alimentación/señal |
4 | 6 | BOBINA_DRV | Señal de control del calentador desde MCU en la placa lógica (activo-alto) |
5 | 5 | PUFF_DET | Señal de detección de calada del controlador de vapeo de la placa de alimentación (nota 1) |
6 | 4 | CC2/SWCLK | USB-C Rd pulldown 2/reloj de interfaz de depuración SWD a MCU en la placa lógica |
7 | 3 | CC1/SWDIO | Datos de interfaz de depuración USB-C Rd desplegable 1/SWD a MCU en la placa lógica |
8 | 2 | VDD | Suministro de 3 V desde el regulador LDO en la placa lógica al controlador de vapeo |
9 | 1 | BOBINA_DET? | Detección de la bobina del calentador a la MCU en la placa lógica (ver nota 2) |
La serie de microcontroladores N32G01 se anuncia en la hoja de datos con cifrado Flash integrado y soporte de arranque seguro, pero esta característica (afortunadamente) no se utiliza en los vaporizadores probados hasta ahora (es decir, el Kraze HD7K).
No se ha trabajado mucho en la ingeniería inversa del firmware en sí, pero se pudo obtener un volcado flash con el uso de un Segger J-Link y su correspondiente software J-Mem, al que se accede a través del puerto de programación/depuración SWD. Como muchas MCU basadas en Arm, Flash se encuentra en 0x08000000 pero también se refleja en 0x00000000. Se tomó un volcado del firmware de las direcciones 0x08000000-0x0800FFFF (64k), y un vistazo rápido al volcado del firmware muestra que en realidad solo se utilizó aproximadamente el 50% del espacio Flash (las direcciones desde justo antes de 0x8000 hasta 0xFFFF eran todas bytes 0xFF, indicando memoria borrada/no programada). No parece haber cadenas legibles por humanos en el volcado de firmware.
Se muestra un número de versión "secreto" en la pantalla si la alimentación del USB-C se enciende y apaga rápidamente (pero parece ocurrir de manera inconsistente). Cuando se intenta con un Kraze HD7K, la pantalla se vuelve negra y el texto "GV-K23 0904V1" se muestra en rojo en dos líneas de texto durante un par de segundos; parece estar renderizado con una versión monoespaciada de la fuente "System" de tamaño 12 puntos de Windows. Esto indica que el nombre de producto interno es "GV-K" y que el firmware es la revisión 1, con fecha del 4 de septiembre de 2023. Casualmente, cerca del final del espacio de direcciones Flash utilizado hay un bloque de bytes lleno con 0x00 y 0xE8E4, que Se parece sospechosamente a datos de píxeles negros y rojo anaranjado. Un análisis más detallado de los datos sin procesar de esta región confirma que el número de versión se almacena como un mapa de bits sin procesar y no se representa a partir de una cadena de texto (se explica a continuación).
Dentro del volcado Flash del firmware, en las direcciones 0x7066-0x7E75, parece haber una versión de mapa de bits del número de versión antes mencionado. Parece tener solo un tamaño de 60x30 píxeles, pero hay bytes de relleno de 0x00 alrededor de este mapa de bits que no se alinean con los límites de 120 bytes (60 píxeles), lo que dificulta la determinación del tamaño "verdadero" de la imagen sin descompilar el firmware y encontrar la función. que activa la pantalla de versión.
Todas las marcas comerciales son propiedad de sus respectivos dueños.