1
MSP430 CCSv5 を使い Flash Memory 内容と version 情報を確認する方法 (テクニック編)
Rev:01 10.4.2013 PIC Trout
今回は、下記の2件について説明します。
1) CCSv5 を使用して、MSP430 の Flash Memory 内容を確認する方法
JTAG アクセスができるデバイス(セキュリティ Fuse 断ではできません)に対して、CCSv5-JTAG から Flash Memory 内容を 見る方法を説明します。
Flash Memory 内容を確認する方法は、次の2ケースを例に説明します。
① 既知 Project(ソースコード、オブジェクトコード.out がある)の Flash Memory 内容を確認する方法。 ② 内容不明デバイスの Flash Memory 内容を調べる方法。 2) プログラムに version を組み込み、これを確認する方法 いくつか種類の異なるプログラムあるいは、派生 Version のプログラムを生産する場合、プログラムに事前に Version 情報 を組み込んでおき、後日内容不明デバイスの Version を確認することができます。 次の2ケースを例に説明します。 ① InfoD 領域に Version を記録する方法 ② プログラムに const データとして Version を記録する方法
目 次
1 既知 Project の Flash Memory 内容を確認する方法
2 内容不明デバイスの Flash Memory 内容を調べる方法
3 infoD 領域に Version を記録する方法
2
1 既知 Project の Flash Memory 内容を確認する方法
CCSv5 を使用して、指定 Project の Flash Memory 内容を確認する操作法を説明します。
操作環境: LaunchPad+G2553、CCSv5.4 評価ボード+FET430UIF を使用しても同じ操作です。 Example として、CCSv5 の ①Basic Examples: Blink The LED を使用します。
1-1 Basic Examples: Blink The LED プロジェクトの生成とプログラム書き込み
G2553_LED プロジェクトを作り、①Basic Examples: Blink The LED を組み込んで、Build(ハンマーのマーク)します。
リンクマップ G2553_LED\Debug\G2553_LED.mapを開き、C 初期化ルーチン_c_int00:0xC080 の配置を確認します。 これが最初に走る番地となり Reset Vector:0xFFFE 番地に格納されます。
図1-1
Debug(虫マーク)でプログラムをターゲットに書き込みます。
1-2 Memory 内容の表示
View -> Memory Browser を開き、表示アドレス欄に 0xfffe と入力して GO すると 0xFFFE:0xC080 を確認できます。 これが先ほどリンクマップで確認した C 初期化ルーチン_c_int00:0xC080 が、reset で開始するアドレスとなっています。
図1-2
・ 次に Flash Memory 開始番地(xC000)近辺の Memory 内容を表示してみます。 ・ 表示開始番地(0xc000)と表示 Style(16-Bit Hex)を指定して、Go で表示します。 ・ 0xFFFF が連続する部分は erase された状態、プログラムが書かれていない状態です。 ・ 0x3FFF が連続する部分は、read プロテクト(BSL など)された特殊な領域です。
図1-3
3
1-3 プログラムロードせずに Debugger を立ち上げる
この説明書の重要な「テクニック」部分です。 「2 内容不明デバイスの Flash Memory 内容を調べる方法」でもこのテクニッ クを使います。
Editor メニューから View-> Target Configuration と操作すると、画面右側に下記の window が現れます。 -> G2553_LED -> target Configs -> MSP430G2553.ccxml を表示します。
図1-4
MSP430G2553.ccxml を右クリックして、サブメニューのLaunch Selected Configuration をクリックします。 !! 今回はDebugで Program を書いてはいけません !!
図1-5
View->Disassemblyの window を開くとて、アセンブラ表記が出てきます。
下記の SP 設定と WDT 停止(&Watchdog_timer_WDTCTL) を目印に main()の開始部分(0xC05E)を探します。
4
1-4 シンボル情報をロードする
シンボル情報のみをロードして、アセンブル表記がどう変わるか見てみます。 Run-> Load -> Load Symbol を指定
図1-7 G2553_LED.out を確認して OK 図1-8 ・ View->Disassemblyを指定すると、コードはシンボル情報とソースコード情報とリンクされて表示されます。 図1-9
1-5 Memory 内容を保存、復元する方法
・ Debugger メニューの Tool -> Save Memory、Load Memory、Fill Memory を使用して指定 Memory 領域を操作すること ができます。
・ 格納 data 形式は、固有の xxx.dat(xxx.txt ではありません)となり CCSv5 内部でのみ利用可能です。 ・ Format:8,16,32bits と Start Address、Length(Format 指定した単位を word として)を指定します。 ・ Load のときは、✔Use the header information….を使用すれば、Save した条件で load できます。 ・ 詳細は、実際に試してご確認ください。
5
2 内容不明デバイスの Flash Memory 内容を調べる方法
ダミープロジェクトの Example として ②Empty Projects: (with main.c) を使用します。
2-1 ダミーEmpty Projects: (with main.c) の生成
ダミーとして G2553_emp プロジェクトを作り、②Empty Projects: (with main.c)を組み込んでBuildします。 リンクマップ G2553_emp\Debug\G2553_emp.map を開き、_c_int00:0xC05E に変わっていることを確認します。
図2-1
2-2 Empty Project の configuration 情報を使用してボードに接続
このダミーを使い 「1-3 プログラムロードせずに Debugger を立ち上げる」 のテクニックでボードに接続します。 デバイス種別( G2553 )は、同じでなければなりません!
View-> Target Configuration と操作して、表示された画面右側の window を操作して、 -> G2553_emp -> target Configs -> MSP430G2553.ccxml を表示します。
図2-2
MSP430G2553.ccxml を右クリックして、サブメニューのLaunch Selected Configuration をクリックします。 !! Debug で Program を書いてはいけません !!
6
・ 下記のデバッガ画面に切り替わりますので、ターゲットボードにConnectします。
Connectを忘れると、以降の開始番地や Memory 内容が表示されません!
図2-4
2-3 Flash Memory 内容の調査
・ ボードに connect すると、Debug window に開始番地(0xC080)が表示されます。
つまり G2553_emp _c_int00:0xC05E ではなく、G2553_LED _c_int00:0xC080 が Flash Memory に格納されていることが 解ります。
図2-5
この開始番地の相違は、プログラムの識別にも使えます。
過去の Project のリンクマップを調べ、_c_int00:0xC080 のプロジェクトが見つかれば、それが候補になります。
View -> Memory Browser で 0xC000 を見れば、図1-3 と同じ G2553_LED の Flash Memory 内容が確認できます。 開発した Project に TI-TXT の xxxx.txt を残しておけば、その内容と下記の内容を照合して識別することができます。
図2-6
View->Disassemblyを指定するとコードが表示されます。 ただし、シンボル情報とソースコード情報がありませんので、アセン ブルコード変換のみとなります。 図1-6 と同じ内容になります。
7
2-4 まとめ
内容を確認したいデバイスがあった時、「2 内容不明デバイスの Flash Memory 内容を調べる方法」 を使用して、同一デ バイスのダミー(例 G2553_emp)の configuration(xxxx.ccxml)を使用して、Flash Memory 内容を調べることができます。
過去の Project のリンクマップを調べ、開始番地 _c_int00:0xZZZZ と合致するものが有るか探して、プロジェクトを絞り込む 方法があります。
過去の Project のTI-TXT(xxxx.txt)の内容と、View -> Memory Browserで調べた Flash Memory 内容が合致するか照 合する方法があります。
ただし、この方法では調査工数が多くなりますので、プログラムに識別の Version 情報を書き込んでおく方法について、次項に 説明いたします。
お気づきかと思いますが、これはリバースエンジニアリングによりコード解読されるリスクがありことを示します。
第三者によるリバースエンジニアリングを回避したい場合は、JTAG フューズを断(Device Secure/Protected)にすることで防止 できます。
ただし、フューズを元に戻すことはできませんので、以降は JTAG アクセスができなくなり、Secure 状態となります。
FRAM シリーズはJTAG パスワードで Device Secure に設定できます。 CCSv5でパスワード設定・記録しておけば、CCSv5 でアクセスできます。
8
3 infoD 領域に Version 番号を記録する方法
この方法は infoD の固定番地に書くことができますので、確認が容易です。
この例では、const int で Version を組み込んでいますが、 const char 配列=“文字” でも可能です。 先に説明しました G2553_LED ソースコードに、下記の部分を追加します。
--- #pragma DATA_SECTION(Version,".infoD"); volatile const int Version =0x1234; int main(void) {
int V1; // Note! V1 = Version; // Note! --- ** 最後の2行 ( Note! ) は、最適化により Version 定数が無効化(無視される)のを防止しています。 リンクマップで、InfoD に Version 定数が配置されているか確認してください。 ** 図3-1
プロジェクトをBuild -> Debug して、プログラムを Flash Memory に書き込みます。
前記の 「2-2 Empty Project の configuration 情報を使用してボードに接続」 の方法でボードに接続します。 View -> Memory Browser で InfoD 先頭(0x1000~)を表示して 0x1234 と書き込まれているか確認します。
9
4 プログラムに const データとして Version を記録する方法
この方法はプログラムに const char 配列=“文字列” で書き込みます。 const 定数は Flash Memory の code 領域末尾 に配置されます。
View -> Memory Browser: character表示にして、code 領域末尾側からこの“文字列”を探します。 先に説明しました G2553_LED ソースコードに、下記の部分を追加します。
---
volatile const char Version[] = "version:1234"; int main(void) {
char V1; // Note! V1 = Version[0]; // Note! --- ** 最後の2行 ( Note! ) は、最適化により Version 定数が無効化(無視される)のを防止しています。 リンクマップで、Version 定数が配置されているか確認してください。 ** 図4-1
プロジェクトをBuild->Debugして、プログラムを Flash Memory に書き込みます。
前記の 「2-2 Empty Project の configuration 情報を使用してボードに接続」 の方法でボードに接続します。 View -> Memory Browser を開き、アドレス 0xC000 とstyle:Character を指定して Go。
文字列“version:”を探します。
図4-2
実際の大きなプログラムの場合は、アドレス 0xFF00、style:16-Bit Hex 表示で Flash Memory の後ろ側から 0xFFFF でない つまり code や const 定数が書かれている部分を見つけてから、style:Character にして探すと速く見つけられます。