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キーを押して止めます。

partner_uboot001

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にロードすればソースレベルデバッグできます。



トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード