小型カラー TFT LCD (Raz TN9000/Kraze HD7K/など) を含む一部の充電式使い捨て電子タバコのリバース エンジニアリング。
さらなる更新情報は https://github.com/ginbot86/ColorLCDVape-RE でご覧いただけます。
市場に出回っている一部の使い捨て電子タバコには、カラー LCD スクリーンや USB-C 充電機能などの付属品が含まれていますが、使い捨てのデバイスです。そのため、このようなデバイスは環境的に非常に有害になります。一方、これにより、愛好家やエンジニアがハードウェアを回収したり、新鮮な VAPE ジュースを補充して内部メーターをリセットしたりして VAPE をそのまま再利用したり、オンボード画像を編集してカスタマイズしたりする機会が広がります。
このプロジェクトで研究されている特定の電子タバコにはさまざまな名前が付いていますが、特に研究されたものは Kraze HD7K と呼ばれています。ただし、このVAPEはRAZ TN9000のように「RAZ」ブランド名でも見られます。
使い捨て電子タバコは通常、保護回路のないリチウムイオン電池を使用します。短絡により制御できない量の電力が消費され、人身傷害や物的損害を引き起こす可能性があります。これらの VAPE に関する作業は、お客様ご自身の責任で行ってください。
これらの VAPE には複数の回路リビジョンが存在することが判明しており、バージョンが一致しない場合にデバイスの損傷につながる可能性のある非互換性がある可能性があります。変更を進める前に、接続とファームウェアの互換性を確認してください。
さらに、電子タバコのジュース/「e-リキッド」には、皮膚から吸収される高濃度のニコチンが含まれている可能性があります。 VAPE の内部の取り扱いは、内部部品のジュースや残留物がきれいになるまで手袋をして行う必要があります。
これらの VAPE に関する他の人の研究には次のものが含まれますが、これらに限定されません。
前述のリポジトリで行われた作業は、このプロジェクトで行われた作業に基づいている場合とそうでない場合があります。これらの電子タバコに関してコミュニティの取り組みがさらに進むことを期待して、同様のプロジェクトをリンクすることを目的としています。
VAPE は次のハードウェアを使用します。
VAPE は 80x160 解像度の 0.96 インチ IPS LCD を使用しており、VAPE メインボードにはんだ付けされた 13 ピン 0.7mm ピッチのフラットフレックス (FPC) ケーブルが付いています。 4 線 SPI (データ、クロック、データ/コマンド、チップ セレクト) を介して接続され、ST7735S コントローラーを使用しているようです。 Smart Prototyping #102106 などの市販のディスプレイでも同じピン配置を使用します。
ピン | 名前 | 関数 |
---|---|---|
1 | TP0/NC | 未使用 |
2 | TP1/NC | 未使用 |
3 | SDIN | SPIデータをLCDに送信 |
4 | SCLK | SPIクロック |
5 | RS | ロジック Low = コマンド、High = データ |
6 | /RST | リセット (アクティブロー) |
7 | /CS | チップセレクト (アクティブロー) |
8 | グランド | 電源・信号グランド |
9 | ノースカロライナ州 | 接続されていません |
10 | VDD | 電源(3.3V) |
11 | LEDK | LEDバックライトのカソード |
12 | レダ | LEDバックライトのアノード |
13 | グランド | 電源・信号グランド |
VAPE には 2 つの形式のフラッシュ メモリがあります。マイクロコントローラの内部フラッシュと 1 メガバイト (8 メガビット) の外部 SPI NOR フラッシュです。前者にはファームウェアが含まれ、後者には LCD に表示されるすべての画像と、VAPE 加熱コイルが使用されていた合計時間が含まれます。このカウンターは、VAPE ジュース メーターに表示される「バー」の数を取得するために使用されます。 LCD データ バスの分析 (DreamSourceLab DSView を使用した .dsl ロジック キャプチャを参照) は、データ転送が連続した 4096 バイトのチャンクとして発生するため、マイクロコントローラーが DMA (ダイレクト メモリ アクセス) を使用して外部フラッシュから LCD に画像データをストリーミングしていることを示唆しています。 、単一の NOR フラッシュ ページに対応します。マイクロコントローラーのメモリを分析すると、DMA メモリ バッファが RAM アドレス 0x2000022C ~ 0x2000062B にあることがわかります。
すべての画像は、生の RGB565 16 ビット ビットマップとして外部フラッシュに保存されます (つまり、各ピクセルは 2 バイトのデータを占めます)。 Rinky-Dink Electronics の UTFT ライブラリの ImageConverter565 などの変換ツールを使用すると、JPEG/PNG などの画像形式を、対応するオフセットで外部フラッシュにパッチできる生のバイナリ ファイルに変換できます。 RAW イメージにはメタデータが保存されないため、以下の表に示すように、イメージのサイズを手動で指定する必要があります。
索引 (#) | オフセット (16 進数) | 長さ (16 進数) | フレーム H (ピクセル) | フレーム V (ピクセル) | カテゴリ | 未使用? | シーケンス (#) | 注意事項 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 6400 | 80 | 160 | 背景 | 0 | ||
1 | 6400 | 2880 | 72 | 72 | バッテリーアイコン | 0 | ||
2 | 8C80 | 2880 | 72 | 72 | バッテリーアイコン | 1 | ||
3 | B500 | 2880 | 72 | 72 | バッテリーアイコン | 2 | ||
4 | DD80 | 2880 | 72 | 72 | バッテリーアイコン | 3 | ||
5 | 10600 | 2880 | 72 | 72 | バッテリーアイコン | 4 | ||
6 | 12E80 | 2880 | 72 | 72 | バッテリーアイコン | 5 | ||
7 | 15700 | 2880 | 72 | 72 | バッテリーアイコン | 6 | ||
8 | 17F80 | 2880 | 72 | 72 | バッテリーアイコン | 7 | ||
9 | 1A800 | 2880 | 72 | 72 | バッテリーアイコン | 8 | ||
10 | 1D080 | 2880 | 72 | 72 | バッテリーアイコン | 9 | ||
11 | 1F900 | 2880 | 72 | 72 | バッテリーアイコン | 10 | ||
12 | 22180 | 2880 | 72 | 72 | ジュースのアイコン | 0 | ||
13 | 24A00 | 2880 | 72 | 72 | ジュースのアイコン | 1 | ||
14 | 27280 | 2880 | 72 | 72 | ジュースのアイコン | 2 | ||
15 | 29B00 | 2880 | 72 | 72 | ジュースのアイコン | 3 | ||
16 | 2C380 | 2880 | 72 | 72 | ジュースのアイコン | 4 | ||
17 | 2EC00 | 2880 | 72 | 72 | ジュースのアイコン | 5 | ||
18 | 31480 | 2880 | 72 | 72 | ジュースのアイコン | 6 | ||
19 | 33D00 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 0 | ||
20 | 3A100 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 1 | ||
21 | 40500 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 2 | ||
22 | 46900 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 3 | ||
23 | 4CD00 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 4 | ||
24 | 53100 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 5 | ||
25 | 59500 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 6 | ||
26 | 5F900 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 7 | ||
27 | 65D00 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 8 | ||
28 | 6C100 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 9 | ||
29 | 72500 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 10 | ||
30 | 78900 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 11 | ||
31 | 7ED00 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 12 | ||
32 | 85100 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 13 | ||
33 | 8B500 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 14 | ||
34 | 91900 | 6400 | 80 | 160 | 蒸気を吸うアニメーション | 15 | ||
35 | 97D00 | 6400 | 80 | 160 | プラグインの背景 1 | 未使用 | 16 | 1 |
36 | 9E100 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 0 | 1 |
37 | 9F8CA | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 1 | 1 |
38 | A1094 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 2 | 1 |
39 | A285E | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 3 | 1 |
40 | A4028 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 4 | 1 |
41 | A57F2 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 5 | 1 |
42 | A6FBC | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 6 | 1 |
43 | A8786 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 7 | 1 |
44 | A9F50 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 8 | 1 |
45 | AB71A | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 9 | 1 |
46 | ACEE4 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 10 | 1 |
47 | AE6AE | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 11 | 1 |
48 | AFE78 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 12 | 1 |
49 | B1642 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 13 | 1 |
50 | B2E0C | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 14 | 1 |
51 | B45D6 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 15 | 1 |
52 | B5DA0 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 16 | 1 |
53 | B756A | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 17 | 1 |
54 | B8D34 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 18 | 1 |
55 | BA4FE | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 19 | 1 |
56 | BBCC8 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 20 | 1 |
57 | BD492 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 21 | 1 |
58 | BEC5C | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 22 | 1 |
59 | C0426 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 23 | 1 |
60 | C1BF0 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 24 | 1 |
61 | C33BA | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 25 | 1 |
62 | C4B84 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 26 | 1 |
63 | C634E | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 27 | 1 |
64 | C7B18 | 17CA | 35 | 87 | ロゴワイプ | 未使用 | 28 | 1 |
65 | C92E2 | 6400 | 80 | 160 | プラグインの背景 2 | 未使用 | 0 | 1 |
66 | CF6E2 | F80 | 31 | 64 | バッテリーバーのアニメーション | 未使用 | 0 | 1 |
67 | D0662 | F80 | 31 | 64 | バッテリーバーのアニメーション | 未使用 | 1 | 1 |
68 | D15E2 | F80 | 31 | 64 | バッテリーバーのアニメーション | 未使用 | 2 | 1 |
69 | D2562 | F80 | 31 | 64 | バッテリーバーのアニメーション | 未使用 | 3 | 1 |
70 | D34E2 | F80 | 31 | 64 | バッテリーバーのアニメーション | 未使用 | 4 | 1 |
71 | D4462 | F80 | 31 | 64 | バッテリーバーのアニメーション | 未使用 | 5 | 1 |
72 | D53E2 | 6400 | 80 | 160 | プラグインの背景 3 | 0 | ||
73 | DB7E2 | E9A | 21 | 89 | 充電器ロゴワイプ | 0 | ||
74 | DC67C | E9A | 21 | 89 | 充電器ロゴワイプ | 1 | ||
75 | DD516 | E9A | 21 | 89 | 充電器ロゴワイプ | 2 | ||
76 | DE3B0 | E9A | 21 | 89 | 充電器ロゴワイプ | 3 | ||
77 | DF24A | E9A | 21 | 89 | 充電器ロゴワイプ | 4 | ||
78 | E00E4 | E9A | 21 | 89 | 充電器ロゴワイプ | 5 | ||
79 | E0F7E | E9A | 21 | 89 | 充電器ロゴワイプ | 6 | ||
80 | E1E18 | E9A | 21 | 89 | 充電器ロゴワイプ | 7 | ||
81 | E2CB2 | E9A | 21 | 89 | 充電器ロゴワイプ | 8 | ||
82 | E3B4C | E9A | 21 | 89 | 充電器ロゴワイプ | 9 | ||
83 | E49E6 | E9A | 21 | 89 | 充電器ロゴワイプ | 10 | ||
84 | E5880 | E9A | 21 | 89 | 充電器ロゴワイプ | 11 | ||
85 | E671A | E9A | 21 | 89 | 充電器ロゴワイプ | 12 | ||
86 | E75B4 | E9A | 21 | 89 | 充電器ロゴワイプ | 13 | ||
87 | E844E | E9A | 21 | 89 | 充電器ロゴワイプ | 14 | ||
88 | E92E8 | E9A | 21 | 89 | 充電器ロゴワイプ | 15 | ||
89 | EA182 | E9A | 21 | 89 | 充電器ロゴワイプ | 16 | ||
90 | EB01C | E9A | 21 | 89 | 充電器ロゴワイプ | 17 | ||
91 | EBEB6 | E9A | 21 | 89 | 充電器ロゴワイプ | 18 | ||
92 | ECD50 | E9A | 21 | 89 | 充電器ロゴワイプ | 19 | ||
93 | エドベア | E9A | 21 | 89 | 充電器ロゴワイプ | 20 | ||
94 | EEA84 | E9A | 21 | 89 | 充電器ロゴワイプ | 21 | ||
95 | EF91E | E9A | 21 | 89 | 充電器ロゴワイプ | 22 | ||
96 | F07B8 | E9A | 21 | 89 | 充電器ロゴワイプ | 23 | ||
97 | F1652 | E9A | 21 | 89 | 充電器ロゴワイプ | 24 | ||
98 | F24EC | E9A | 21 | 89 | 充電器ロゴワイプ | 25 | ||
99 | F3386 | E9A | 21 | 89 | 充電器ロゴワイプ | 26 | ||
100 | F4220 | E9A | 21 | 89 | 充電器ロゴワイプ | 27 | ||
101 | F50BA | E9A | 21 | 89 | 充電器ロゴワイプ | 28 | ||
102 | F5F54 | E9A | 21 | 89 | 充電器ロゴワイプ | 29 | ||
103 | F6DEE | E9A | 21 | 89 | 充電器ロゴワイプ | 30 | ||
104 | F8000 | 4 | 該当なし | 該当なし | 合計 VAPE 時間 x0.01 秒 (LSB->MSB) | 該当なし | 2 | |
105 | F8004 | 1 | 該当なし | 該当なし | VAPE 使用中フラグ (0xBB) | 該当なし | 3 |
SPI フラッシュに保存されている個々のイメージへのフラッシュ ダンプの分割と再構築を支援する 2 つの Python スクリプト ( split-flashdump.py
およびassemble-flashdump.py
が含まれています。現在、このツールは形式変換を実行しません (ChatGPT を入手してここまで進めるのは、すでに長いプロセスでした) が、カスタム「テーマ」パックの作成を支援するのに大いに役立ちます。未使用のリソースは、再アセンブルするファイルを含むディレクトリから遠ざけることによって、再パックされたフラッシュ ダンプから削除できます。それらの未使用領域は 0xFF/消去されたバイトとして残ります。
リパッカーのassemble-flashdump.py
は、16 進数でエンコードされたオフセットを使用して、各部分を 1MB フラッシュ ダンプ ファイルのどこに挿入するかを決定するため、入力ファイル名が特定の形式であることを期待します (split_map.csv または付属のサンプルを参照)テーマ (以下の「カスタム テーマ パック」で説明):
{index}_{offset}_{width}x{height}_{category}_{sequence}.bin
19_33d00_80x160_vapeanim-0.bin
PNG または JPEG 画像を変換するには、前述の UTFT ライブラリのImgConv.exe
ツールを使用します。
ImgConv.exe *.png /r
ImgConv.exe *.jpg /r
ren *.raw *.bin
注: 変換する前に、.bin 形式に変換する画像のサイズが正しいことを確認してください。
概念実証として、完成した Windows 95 スタイルのテーマ パックが含まれています。バッテリーとジュースのインジケーター、充電アニメーション (テストされたファームウェアで使用される唯一のアニメーション セットであるため、プラグインの背景 3 と充電器のロゴのワイプのみ)、および蒸気を吸うアニメーション (3D のアスペクト比の正しいキャプチャ) のためのすべてのリソースが実装されています。パイプのスクリーンセーバー)。必要なのは、SPI フラッシュへのアクセスと、それを再プログラミングする手段だけです。この概念を拡張する余地は、USB-C ポート経由で接続される安価な SWD USB ドングルと、マイクロコントローラーの RAM に小さな再プログラミング ツールをアップロードするソフトウェアによって可能になり、フラッシュ チップのはんだ除去の必要性がなくなる可能性があります。
空の/編集可能なテンプレートも含まれています。すべてのフレームにはアニメーションのフレーム番号が実装されています。
このカスタマイズはすべて、マイクロコントローラーのファームウェアに触れることなく可能です。
外部フラッシュ メモリのレイアウトの上記の注 2 および 3 で説明したように、外部フラッシュの場所 0xF8000 ~ 0xF8004 に 0xFF を入力すると、ジュース メーターがフルにリセットされ、リザーバーが補充された後に VAPE を再利用できるようになります。その後、nRST ピンをグランドに引き下げるか、バッテリーを取り外して再接続して電源を入れ直し、マイクロコントローラー自体をリセットする必要があります。再プログラミング/パッチ適用のために外部フラッシュのはんだを除去して再はんだ付けしている場合、これはすでに起こっている可能性があります。
マイクロコントローラは、ファームウェアおよび/または内部 SRAM メモリの読み取り/書き込みに業界標準のシリアル ワイヤ デバッグ (SWD) デバッグ/プログラミング インターフェイスを使用します。 SWD インターフェイスは、VAPE の USB-C 充電ポートを通じて露出されます。コネクタは通常電源専用であるため、SWDIO/SWCLK ラインは通常の 5.1k Rd プルダウン抵抗の後ろで CC ピンに接続されます。
マイクロコントローラーのファームウェアは読み出し保護されていないため、逆コンパイルによるファームウェアのさらなる調査が可能です。このデバッグ インターフェイスを使用して外部フラッシュと対話できる可能性がありますが、これについてはまだ調査されていません。
テストされた一部の VAPE メインボードには、ボードの裏側に RX/TX テスト パッドがありました。このポートがファームウェアとどのように相互作用するか、および/または外部フラッシュのコンテンツを更新するために使用できるかどうかについては、まだ調査されていません。
VAPE は 2 つの PCB で構成されており、9 ピン 0.15 mm ピッチの直角オス ピン ヘッダーで結合されています。
ピン 1 は、電源基板上の正方形のパッドと、ロジック基板の下側 (マイクロコントローラ、SPI フラッシュ、および LCD の反対側) の対応するパッドによって示されます。警告: ピン 1 のマーキングは 2 つのボード間で互いに反対になる場合があります。
電源基板ピン | ロジックボードのピン | 名前 | 関数 |
---|---|---|---|
1 | 9 | VBAT | 電源基板上のバッテリープラス (+) |
2 | 8 | Vバス | SMD ヒューズ付き電源ボードの USB-C ポートから +5V、「B」マーク |
3 | 7 | グランド | 電源/信号グランド |
4 | 6 | COIL_DRV | ロジックボード上の MCU からのヒーター制御信号 (アクティブ High) |
5 | 5 | PUFF_DET | 電源ボードVAPEコントローラーからのパフ検出信号(注1) |
6 | 4 | CC2/SWCLK | USB-C Rd プルダウン 2 / SWD デバッグ インターフェイス クロックからロジック ボード上の MCU |
7 | 3 | CC1/SWDIO | USB-C Rd プルダウン 1 / SWD デバッグ インターフェイス データをロジック ボード上の MCU に送信 |
8 | 2 | VDD | ロジックボード上の LDO レギュレーターから VAPE コントローラーへの 3V 供給 |
9 | 1 | COIL_DET? | ロジックボード上のMCUへのヒーターコイル検出 (注2を参照) |
N32G01 シリーズのマイクロコントローラーは、オンボード フラッシュ暗号化とセキュア ブート サポートを備えているとデータシートで宣伝されていますが、この機能は (ありがたいことに) これまでにテストされた VAPE (つまり Kraze HD7K) では使用されていません。
ファームウェア自体のリバース エンジニアリングにはあまり作業が行われていませんが、SWD デバッグ/プログラミング ポートを介してアクセスされる Segger J-Link とそれに対応する J-Mem ソフトウェアを使用してフラッシュ ダンプを取得することができました。多くの Arm ベースの MCU と同様、フラッシュは 0x08000000 にありますが、0x00000000 にもミラーリングされています。ファームウェアのダンプはアドレス 0x08000000 ~ 0x0800FFFF (64k) から取得され、ファームウェア ダンプをざっと見ると、フラッシュ領域の約 50% のみが実際に使用されていることがわかります (0x8000 の直前から 0xFFFF までのアドレスはすべて 0xFF バイトでした)。消去された/プログラムされていないメモリを示します)。ファームウェア ダンプには人間が判読できる文字列は存在していないようです。
USB-C 電源が急速にオン/オフされると、「秘密」のバージョン番号が画面上に表示されます (ただし、発生には一貫性がないようです)。 Kraze HD7K で試行すると、画面が黒くなり、「GV-K23 0904V1」というテキストが 2 行にわたって赤で数秒間表示されます。 Windows の 12 ポイント サイズの「System」フォントの等幅バージョンでレンダリングされているようです。これは、内部製品名が「GV-K」であり、ファームウェアが 2023 年 9 月 4 日付けのリビジョン 1 であることを示唆しています。偶然にも、使用されているフラッシュ アドレス空間の終わり近くに、0x00 と 0xE8E4 で埋められたバイトのブロックがあります。疑わしいほど黒と赤オレンジ色のピクセル データのように見えます。この領域の生データをさらに分析すると、バージョン番号が生のビットマップとして保存され、テキスト文字列からレンダリングされたものではないことが確認されます (以下で説明します)。
ファームウェア フラッシュ ダンプ内のアドレス 0x7066 ~ 0x7E75 は、前述のバージョン番号のビットマップ バージョンであるように見えます。サイズは 60x30 ピクセルしかないように見えますが、このビットマップの周囲には 120 バイトの境界 (60 ピクセル) に合わせていない 0x00 パディング バイトがあるため、ファームウェアを逆コンパイルして関数を見つけなければ、「真の」画像サイズを決定するのは困難です。バージョン画面が表示されます。
すべての商標はそれぞれの所有者の財産です。