Rétro-ingénierie de certains vapos jetables rechargeables dotés d'un petit écran LCD TFT couleur (Raz TN9000/Kraze HD7K/etc.).
D'autres mises à jour peuvent être trouvées sur https://github.com/ginbot86/ColorLCDVape-RE
Certains vapos jetables sur le marché incluent des accessoires tels qu'un écran LCD couleur et une recharge USB-C, mais sont des appareils jetables à usage unique ; cela rend ces appareils très nocifs sur le plan écologique. D'un autre côté, cela ouvre des possibilités de récupération de matériel par les amateurs/ingénieurs, de réutilisation du vape tel quel en le remplissant de jus de vape frais et en réinitialisant le compteur interne, ou même de personnalisation en éditant les images intégrées.
Le vape spécifique étudié dans ce projet porte différents noms, mais celui qui a été spécifiquement étudié s'appelait Kraze HD7K. Cependant, cette vape a également été vue sous la marque « RAZ », comme le RAZ TN9000.
Les vapes jetables utilisent généralement des batteries Li-ion sans aucun circuit de protection. Les courts-circuits pourraient dissiper des quantités d'énergie incontrôlées, provoquant des blessures corporelles et/ou des dommages matériels. Tout travail effectué sur ces vapes est effectué à vos propres risques.
Il a été déterminé qu'il existe plusieurs révisions de circuits de ces vapes, qui peuvent présenter des incompatibilités pouvant entraîner des dommages à l'appareil si les versions ne correspondent pas. Vérifiez les connexions et la compatibilité du micrologiciel avant de procéder à toute modification.
De plus, le jus de vape/« e-liquide » peut contenir de fortes concentrations de nicotine, qui est absorbée par la peau. La manipulation des composants internes de la vape doit être effectuée avec des gants jusqu'à ce que les composants internes soient nettoyés du jus et/ou des résidus.
Le travail d'autres personnes sur ces vapes comprend, sans s'y limiter :
Les travaux effectués dans les référentiels susmentionnés peuvent ou non être basés sur les travaux effectués dans le cadre de ce projet ; il est destiné à relier des projets similaires dans l’espoir que davantage d’efforts communautaires pourront être entrepris sur ces vapes.
La vape utilise le matériel suivant :
Le vape utilise un écran LCD IPS de 0,96 pouce de résolution 80 x 160, avec un câble FPC (Flat-Flex) à 13 broches au pas de 0,7 mm qui est soudé à la carte mère du vape. Il se connecte via SPI à 4 fils (données, horloge, données/commande, sélection de puce) et semble utiliser le contrôleur ST7735S. Il utilise même le même brochage pour les écrans disponibles dans le commerce, comme le Smart Prototyping #102106.
Épingle | Nom | Fonction |
---|---|---|
1 | TP0/NC | Inutilisé |
2 | TP1/NC | Inutilisé |
3 | SDIN | Données SPI sur écran LCD |
4 | SCLK | Horloge SPI |
5 | RS | Logique bas = commande, haut = données |
6 | /RST | Réinitialisation (actif-bas) |
7 | /CS | Sélection de puce (actif-bas) |
8 | GND | Alimentation/terre du signal |
9 | Caroline du Nord | Non connecté |
10 | VDD | Alimentation (3,3 V) |
11 | LEDK | Cathode de rétroéclairage LED |
12 | LEDA | Anode de rétroéclairage LED |
13 | GND | Alimentation/terre du signal |
Il existe deux formes de mémoire Flash sur la vape : Flash interne sur le microcontrôleur et 1 mégaoctet (8 mégabits) de Flash SPI NOR externe. Le premier contient le firmware, tandis que le second contient toutes les images affichées sur l'écran LCD, ainsi que la durée totale d'utilisation du serpentin de chauffage de la vape ; ce compteur permet de déduire le nombre de « barres » affichées sur le compteur de jus de vape. L'analyse du bus de données LCD (voir la capture logique .dsl à l'aide de DreamSourceLab DSView) suggère que le microcontrôleur utilise DMA (Direct Memory Access) pour diffuser les données d'image du Flash externe vers l'écran LCD, car les transferts de données se produisent sous forme de blocs contigus de 4 096 octets. , correspondant à une seule page NOR Flash. L'analyse de la mémoire du microcontrôleur indique que la mémoire tampon DMA se trouve dans les adresses RAM 0x2000022C-0x2000062B.
Toutes les images sont stockées sur le Flash externe sous forme de bitmaps bruts RGB565 16 bits (c'est-à-dire que chaque pixel occupe 2 octets de données). Des outils de conversion, tels que ImageConverter565 de la bibliothèque UTFT de Rinky-Dink Electronics, peuvent être utilisés pour convertir des formats d'image tels que JPEG/PNG en un fichier binaire brut qui peut être patché dans le Flash externe au décalage correspondant. Aucune métadonnée n'est stockée avec les images brutes, les dimensions de l'image doivent donc être fournies manuellement, comme indiqué dans le tableau ci-dessous.
Indice (#) | Décalage (hexadécimal) | Longueur (hexagonale) | Cadre H (px) | Cadre V (px) | Catégorie | Inutilisé? | Séquence (#) | Remarques |
---|---|---|---|---|---|---|---|---|
0 | 0 | 6400 | 80 | 160 | Arrière-plan | 0 | ||
1 | 6400 | 2880 | 72 | 72 | Icône de batterie | 0 | ||
2 | 8C80 | 2880 | 72 | 72 | Icône de batterie | 1 | ||
3 | B500 | 2880 | 72 | 72 | Icône de batterie | 2 | ||
4 | DD80 | 2880 | 72 | 72 | Icône de batterie | 3 | ||
5 | 10600 | 2880 | 72 | 72 | Icône de batterie | 4 | ||
6 | 12E80 | 2880 | 72 | 72 | Icône de batterie | 5 | ||
7 | 15700 | 2880 | 72 | 72 | Icône de batterie | 6 | ||
8 | 17F80 | 2880 | 72 | 72 | Icône de batterie | 7 | ||
9 | 1A800 | 2880 | 72 | 72 | Icône de batterie | 8 | ||
10 | 1D080 | 2880 | 72 | 72 | Icône de batterie | 9 | ||
11 | 1F900 | 2880 | 72 | 72 | Icône de batterie | 10 | ||
12 | 22180 | 2880 | 72 | 72 | Icône de jus | 0 | ||
13 | 24A00 | 2880 | 72 | 72 | Icône de jus | 1 | ||
14 | 27280 | 2880 | 72 | 72 | Icône de jus | 2 | ||
15 | 29B00 | 2880 | 72 | 72 | Icône de jus | 3 | ||
16 | 2C380 | 2880 | 72 | 72 | Icône de jus | 4 | ||
17 | 2EC00 | 2880 | 72 | 72 | Icône de jus | 5 | ||
18 | 31480 | 2880 | 72 | 72 | Icône de jus | 6 | ||
19 | 33D00 | 6400 | 80 | 160 | Animation de vapotage | 0 | ||
20 | 3A100 | 6400 | 80 | 160 | Animation de vapotage | 1 | ||
21 | 40500 | 6400 | 80 | 160 | Animation de vapotage | 2 | ||
22 | 46900 | 6400 | 80 | 160 | Animation de vapotage | 3 | ||
23 | 4CD00 | 6400 | 80 | 160 | Animation de vapotage | 4 | ||
24 | 53100 | 6400 | 80 | 160 | Animation de vapotage | 5 | ||
25 | 59500 | 6400 | 80 | 160 | Animation de vapotage | 6 | ||
26 | 5F900 | 6400 | 80 | 160 | Animation de vapotage | 7 | ||
27 | 65D00 | 6400 | 80 | 160 | Animation de vapotage | 8 | ||
28 | 6C100 | 6400 | 80 | 160 | Animation de vapotage | 9 | ||
29 | 72500 | 6400 | 80 | 160 | Animation de vapotage | 10 | ||
30 | 78900 | 6400 | 80 | 160 | Animation de vapotage | 11 | ||
31 | 7ED00 | 6400 | 80 | 160 | Animation de vapotage | 12 | ||
32 | 85100 | 6400 | 80 | 160 | Animation de vapotage | 13 | ||
33 | 8B500 | 6400 | 80 | 160 | Animation de vapotage | 14 | ||
34 | 91900 | 6400 | 80 | 160 | Animation de vapotage | 15 | ||
35 | 97D00 | 6400 | 80 | 160 | Contexte du plugin 1 | Inutilisé | 16 | 1 |
36 | 9E100 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 0 | 1 |
37 | 9F8CA | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 1 | 1 |
38 | A1094 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 2 | 1 |
39 | A285E | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 3 | 1 |
40 | A4028 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 4 | 1 |
41 | A57F2 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 5 | 1 |
42 | A6FBC | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 6 | 1 |
43 | A8786 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 7 | 1 |
44 | A9F50 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 8 | 1 |
45 | AB71A | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 9 | 1 |
46 | ACEE4 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 10 | 1 |
47 | AE6AE | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 11 | 1 |
48 | AFE78 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 12 | 1 |
49 | B1642 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 13 | 1 |
50 | B2E0C | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 14 | 1 |
51 | B45D6 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 15 | 1 |
52 | B5DA0 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 16 | 1 |
53 | B756A | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 17 | 1 |
54 | B8D34 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 18 | 1 |
55 | BA4FE | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 19 | 1 |
56 | BBCC8 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 20 | 1 |
57 | BD492 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 21 | 1 |
58 | BEC5C | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 22 | 1 |
59 | C0426 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 23 | 1 |
60 | C1BF0 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 24 | 1 |
61 | C33BA | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 25 | 1 |
62 | C4B84 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 26 | 1 |
63 | C634E | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 27 | 1 |
64 | C7B18 | 17CA | 35 | 87 | Effacement du logo | Inutilisé | 28 | 1 |
65 | C92E2 | 6400 | 80 | 160 | Contexte du plugin 2 | Inutilisé | 0 | 1 |
66 | CF6E2 | F80 | 31 | 64 | Animation des barres de batterie | Inutilisé | 0 | 1 |
67 | D0662 | F80 | 31 | 64 | Animation des barres de batterie | Inutilisé | 1 | 1 |
68 | D15E2 | F80 | 31 | 64 | Animation des barres de batterie | Inutilisé | 2 | 1 |
69 | D2562 | F80 | 31 | 64 | Animation des barres de batterie | Inutilisé | 3 | 1 |
70 | D34E2 | F80 | 31 | 64 | Animation des barres de batterie | Inutilisé | 4 | 1 |
71 | D4462 | F80 | 31 | 64 | Animation des barres de batterie | Inutilisé | 5 | 1 |
72 | D53E2 | 6400 | 80 | 160 | Contexte du plugin 3 | 0 | ||
73 | DB7E2 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 0 | ||
74 | DC67C | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 1 | ||
75 | DD516 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 2 | ||
76 | DE3B0 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 3 | ||
77 | DF24A | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 4 | ||
78 | E00E4 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 5 | ||
79 | E0F7E | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 6 | ||
80 | E1E18 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 7 | ||
81 | E2CB2 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 8 | ||
82 | E3B4C | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 9 | ||
83 | E49E6 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 10 | ||
84 | E5880 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 11 | ||
85 | E671A | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 12 | ||
86 | E75B4 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 13 | ||
87 | E844E | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 14 | ||
88 | E92E8 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 15 | ||
89 | EA182 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 16 | ||
90 | EB01C | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 17 | ||
91 | EBEB6 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 18 | ||
92 | DPE50 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 19 | ||
93 | EDBEA | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 20 | ||
94 | EEE84 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 21 | ||
95 | EF91E | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 22 | ||
96 | F07B8 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 23 | ||
97 | F1652 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 24 | ||
98 | F24EC | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 25 | ||
99 | F3386 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 26 | ||
100 | F4220 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 27 | ||
101 | F50BA | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 28 | ||
102 | F5F54 | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 29 | ||
103 | F6DEE | E9A | 21 | 89 | Essuie-glace avec logo du chargeur | 30 | ||
104 | F8000 | 4 | N / A | N / A | Temps de vapotage total x0,01 s (LSB->MSB) | N / A | 2 | |
105 | F8004 | 1 | N / A | N / A | Drapeau d'utilisation de la vape (0xBB) | N / A | 3 |
Deux scripts Python ont été inclus pour faciliter le fractionnement et le réassemblage du dump Flash dans/à partir des images individuelles stockées dans SPI Flash : split-flashdump.py
et assemble-flashdump.py
. Les outils n'effectuent actuellement pas de conversion de format (obtenir que ChatGPT m'aide jusqu'ici était déjà un long processus), mais contribuent grandement à la création de packs de « thèmes » personnalisés. Les ressources inutilisées peuvent être supprimées du dump Flash reconditionné en les gardant en dehors du répertoire contenant les fichiers à réassembler ; ces régions inutilisées resteront sous forme de 0xFF/octets effacés.
Le repacker, assemble-flashdump.py
, s'attend à ce que les noms de fichiers d'entrée soient d'un format spécifique, car il utilise le décalage codé en hexadécimal pour déterminer où insérer chaque élément dans le fichier de vidage Flash de 1 Mo (voir split_map.csv ou l'exemple inclus thème, décrit ci-dessous dans Packs de thèmes personnalisés ):
{index}_{offset}_{width}x{height}_{category}_{sequence}.bin
19_33d00_80x160_vapeanim-0.bin
Pour convertir des images PNG ou JPEG, utilisez l'outil ImgConv.exe
de la bibliothèque UTFT mentionnée précédemment :
ImgConv.exe *.png /r
ImgConv.exe *.jpg /r
ren *.raw *.bin
Remarque : assurez-vous que les images à convertir au format .bin ont les bonnes dimensions AVANT de les convertir !
À titre de preuve de concept, un pack de thèmes fini de style Windows 95 est inclus ; il implémente toutes les ressources pour les indicateurs de batterie et de jus, l'animation de charge (uniquement l'arrière-plan du plugin 3 et l'effacement du logo du chargeur, car c'est le seul jeu d'animation utilisé avec le firmware testé) et l'animation de vapotage (une capture correcte du rapport hauteur/largeur de la 3D économiseur d'écran de tuyaux). Il suffit d'avoir accès au SPI Flash et d'avoir un moyen de le reprogrammer. Une extension de ce concept pourrait être possible grâce à un dongle USB SWD bon marché, connecté via le port USB-C, et à un logiciel qui télécharge un petit outil de reprogrammation dans la RAM du microcontrôleur, éliminant potentiellement le besoin de dessouder la puce Flash.
Un modèle vierge/modifiable a également été inclus. Toutes les images sont implémentées avec des numéros d'images pour les animations.
Toute cette personnalisation est possible sans toucher au firmware du microcontrôleur !
Comme décrit dans Disposition de la mémoire flash externe , notes 2 et 3 ci-dessus, remplir les emplacements Flash externes 0xF8000-0xF8004 avec 0xFF réinitialisera le compteur de jus au maximum, permettant la réutilisation de la vape une fois le réservoir rempli. Le microcontrôleur lui-même doit ensuite être réinitialisé en tirant la broche nRST vers la terre, ou en le redémarrant en débranchant et en reconnectant la batterie ; cela sera probablement déjà arrivé si l'on dessoude et ressoude le Flash externe pour la reprogrammation/le correctif.
Le microcontrôleur utilise l'interface de débogage/programmation standard Serial Wire Debug (SWD) pour lire/écrire son micrologiciel et/ou sa mémoire SRAM interne. L'interface SWD est exposée via le port de chargement USB-C du vape. Les lignes SWDIO/SWCLK sont connectées aux broches CC derrière les résistances pulldown normales de 5,1k Rd, car le connecteur est normalement uniquement destiné à l'alimentation.
Le micrologiciel du microcontrôleur n'est pas protégé contre la lecture, des recherches plus approfondies sur le micrologiciel via la décompilation sont donc une voie possible. Il est peut-être possible d'utiliser cette interface de débogage pour interagir avec le Flash externe, mais cela n'a pas encore été étudié.
Certaines des cartes mères de vape testées comportaient des tampons de test RX/TX à l'arrière de la carte. Cela n'a pas encore été étudié quant à la manière dont ce port interagit avec le micrologiciel et/ou s'il peut être utilisé pour mettre à jour le contenu Flash externe.
La vape est composée de deux PCB, reliés entre eux par un connecteur mâle à angle droit à 9 broches au pas de 0,15 mm :
La broche 1 est indiquée par une pastille carrée sur la carte d'alimentation et une pastille correspondante sur la face inférieure de la carte mère (côté opposé du microcontrôleur, du flash SPI et de l'écran LCD). ATTENTION : Les repères du pin 1 peuvent être opposés entre les deux cartes !
Broche de la carte d'alimentation | Broche de la carte logique | Nom | Fonction |
---|---|---|---|
1 | 9 | VBAT | Batterie positive (+) sur la carte d'alimentation |
2 | 8 | VBUS | +5V du port USB-C sur la carte d'alimentation avec fusible SMD, marquage "B" |
3 | 7 | GND | Masse d'alimentation/signal |
4 | 6 | BOBINE_DRV | Signal de commande de chauffage du MCU sur la carte logique (actif-haut) |
5 | 5 | PUFF_DET | Signal de détection de bouffée du contrôleur de vape de la carte d'alimentation (remarque 1) |
6 | 4 | CC2/SWCLK | Horloge d'interface de débogage USB-C Rd pulldown 2/SWD vers MCU sur la carte mère |
7 | 3 | CC1/SWDIO | Données d'interface de débogage USB-C Rd pulldown 1/SWD vers MCU sur la carte mère |
8 | 2 | VDD | Alimentation 3V du régulateur LDO sur la carte mère au contrôleur de vape |
9 | 1 | COIL_DET ? | Détection du serpentin de chauffage vers MCU sur la carte mère (voir note 2) |
La série de microcontrôleurs N32G01 est annoncée dans la fiche technique comme ayant un cryptage Flash intégré et une prise en charge du démarrage sécurisé, mais cette fonctionnalité (heureusement) n'est pas utilisée sur le(s) vape(s) testé(s) jusqu'à présent (à savoir le Kraze HD7K).
Peu de travail a été consacré à l'ingénierie inverse du micrologiciel lui-même, mais un vidage flash a pu être obtenu grâce à l'utilisation d'un Segger J-Link et de son logiciel J-Mem correspondant, accessible via le port de débogage/programmation SWD. Comme de nombreux MCU basés sur Arm, le Flash est situé à 0x08000000 mais est également reflété à 0x00000000. Un vidage du micrologiciel a été effectué à partir des adresses 0x08000000-0x0800FFFF (64 Ko), et un rapide coup d'œil sur le vidage du micrologiciel montre que seulement environ 50 % de l'espace Flash a été réellement utilisé (les adresses juste avant 0x8000 jusqu'à 0xFFFF étaient toutes des octets 0xFF, indiquant une mémoire effacée/non programmée). Aucune chaîne lisible par l'homme ne semble être présente dans le vidage du micrologiciel.
Un numéro de version « secret » s'affiche à l'écran si l'alimentation USB-C est rapidement allumée et éteinte (mais semble se produire de manière incohérente). Lors d'une tentative avec un Kraze HD7K, l'écran devient noir et le texte « GV-K23 0904V1 » s'affiche en rouge sur deux lignes de texte pendant quelques secondes ; il semble être rendu avec une version à espacement fixe de la police "Système" de 12 points de Windows. Cela fait allusion au nom de produit interne « GV-K » et au micrologiciel étant la révision 1, datée du 4 septembre 2023. Par coïncidence, vers la fin de l'espace d'adressage Flash utilisé se trouve un bloc d'octets rempli de 0x00 et 0xE8E4, qui ressemble étrangement à des données de pixels noirs et rouge-orange. Une analyse plus approfondie des données brutes de cette région confirme que le numéro de version est stocké sous forme de bitmap brut et non rendu à partir d'une chaîne de texte (expliqué ci-dessous).
À l'intérieur du vidage Flash du micrologiciel, aux adresses 0x7066-0x7E75, il semble y avoir une version bitmap du numéro de version susmentionné. Il semble n'avoir qu'une taille de 60 x 30 pixels, mais il y a des octets de remplissage de 0 x 00 autour de ce bitmap qui ne s'alignent pas sur les limites de 120 octets (60 pixels), ce qui rend difficile la détermination de la « vraie » taille de l'image sans décompiler le micrologiciel et trouver la fonction. qui déclenche l'écran de version.
Toutes les marques déposées sont la propriété de leurs propriétaires respectifs.