2012年04月12日
PARTNER-JetでU-bootを追いかける(1)
JTAGデバッガがもっとも活躍するのは、できたばかりのボードの初期化コードを開発するときです。最近のLinuxのブートローダとしてはU-bootがよく使われます。KZM-A9-DualボードもU-bootを使っています。そこで、KZM-A9-DualボードのU-bootをPARTNER-Jetで追いかけてみることにします。
1. NORフラッシュに焼かれているU-bootを追いかける
まず最初はKZM-A9-Dualボードの出荷時にNORフラッシュに焼かれているU-bootを追いかけてみます。
KZM-A9-Dualボードの設定
KZM-A9-DualボードがNORフラッシュから起動するように以下のようにディップスイッチをセットします。
DSW1-3 = ON DSW1-4 = ON
シリアルケーブルを接続し、115200ボー, 8bit, ノンパリティ、ストップビット1の設定でターミナルをつなぎます。
これで電源を入れるとシリアルコンソールにU-bootのプロンプトが表示されます。
U-Boot 2009.03-rc1 (Oct 18 2011 - 14:43:52) Booted Device: NOR Flash Board: EM/EV ES2 (Rev.ffffff20) Core: 1.15v DRAM: 512 MB Flash: 64 MB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 Wrong Image Format for bootm command ERROR: can't get kernel image! KZM-A9-Dual#
U-bootのビルド
PARTNER-Jetでソースレベルデバッグをするためには、シンボル情報が必要です。
出荷時に添付されているDVDの中に、U-bootのソースのアーカイブが入っているのでこれをビルドします。
まずは、How_to_build.txt に従ってアーカイブを展開し、U-bootをビルドしてください。
ここに書かれている uboot/build_all.sh を使用すると、NORフラッシュ用、eMMC用、SDカード用の3種類のU-bootをビルドしますが、今はNORフラッシュ用のU-bootだけビルドしたいので以下のようにします。
$ tar xvf android_20110930.tar.bz2 $ tar xvf u-boot_20110930.tar.bz2 $ cd u-boot/ $ export LANG=C $ export ARCH=arm $ export CROSS_COMPILE=${PWD}/../mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- $ make distclean $ make emev_kzm9d_config $ make
これでできた u-boot がNORフラッシュ用のU-bootのシンボル情報付きのELFファイルで、u-boot.binが実際にNORフラッシュに書き込むバイナリファイルです。
$ file u-boot u-boot: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped $ file u-boot.bin u-boot.bin: data
PARTNER-Jetの接続
KZM-A9-Dualボード用のPARTNER-JetのコンフィグファイルはPARTNER-Jetに付属しています。プローブは20pinと38pinのどちらも使用可能です。
シンボル情報のロード
まずは、NORフラッシュへの書き込みは行わずにシンボル情報だけをPARTNER-Jetにロードして動かしてみます。
PARTNER-Jetのコマンドウインドウでls(Load Symbol)コマンドを使用します。
> ls "u-bootのパス名"
または、
ファイル > ロード(L)..
でファイル名を指定し、ロードオプションのSymbol onlyにチェックを入れます。
実行
PARTNER-Jetのコマンドウインドウで
>reset >g
コマンドプロンプトが出たところでPARTNER-JetでESCキーを押して止めます。
NS16550_getcという関数の中で止まりました。これはシリアルインタフェースの入力待ちです。
バックトレースはバックトレースウインドウを開いていればすぐに表示されます。(スクリーンショットの画面の右下) または、コマンドウインドウでKコマンドを使用します。
>k u-boot : : 41080724 start_armboot+1C4() u-boot :main.c : 467 : 4108F380 main_loop+F0() u-boot :main.c :1010 : 4108F0B4 readline_into_buffer+40(prompt=*41099AEA "KZM-A9-D..",buffer=*410A0380 "\0") u-boot :console.c : 254 : 4108C2B8 fgetc+20(file=E1030000) u-boot :serial.c : 213 : 41086F00 _serial_getc+14(port=E1030000) u-boot :ns16550.c : 65 : 410870CC NS16550_getc+4(com_port=*E1030000) >
ソースコード表示とソースコードとアセンブラの混合表示はファンクションキーF3でトグルに切り替え可能です。ここからステップ実行したり、ソースコード画面から任意の行にブレークポイントを設定することができます。
2. NORフラッシュへの書き込み
ソースコードを修正してビルドしなおしたら、できたバイナリをNORフラッシュに書き込みます。
PARTNER-Jetを使えば、それは簡単です。ロードコマンドでバイナリファイルをNORフラッシュのアドレスにロードするだけです。
その前に、出荷時のNORフラッシュのU-bootを上書きしないように、ディップスイッチでNORフラッシュのバンクを切り替えます。DSW1-7, DSW1-8を出荷時と違う設定に変更してください。
ファイル > バイナリロード(B)..
ロードファイル名に u-boot.binのパス名を指定
オフセットアドレスに 0x0
を指定します。
>RD N:\opt\koba\kzm\android\work\u-boot.w\u-boot.bin,0x0 Read N:\opt\koba\kzm\android\work\u-boot.w\u-boot.bin 00000000 - 0001BD77 Complete Read memory : 3.510 sec 111 Kbyte (31 Kbyte/sec) >
これで、リセットしてGoします。
>reset >g
U-Boot 2009.03-rc1 (Apr 12 2012 - 11:55:50) Booted Device: NOR Flash Board: EM/EV ES2 (Rev.ffffff20) Core: 1.15v DRAM: 512 MB Flash: 64 MB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 Wrong Image Format for bootm command ERROR: can't get kernel image! KZM-A9-Dual#
最初の行のビルドの日付が変ったことを確認してください。
このあとは先ほどど同じ方法でシンボル情報をPARTNER-Jetにロードすればソースレベルデバッグできます。