OpenOCDの設定

OpenOCDの設定には二つのポイントがあります。

  • JTAGインターフェースの設定
  • ターゲットCPUの設定

このページでは、この二つについてそれぞれ説明します。なお、JTAGインターフェースはBesttechnology社のTINY JTAG-ICEを使っています。

インターフェースの設定

TINY JTAG-ICEはAmontec社のJTAGkey互換ICEです。現在TINY JTAG-ICEは生産中止となっており、代わりにTINY JTAG-ICE2が販売されています。両者の設定は同じはずです。

OpenOCDにはJTAGkey用のコンフィグレーションファイルが用意されていますので、それを流用します。ファイルは trunk/tcl/interface/jtagkey.cfgです。適当なディレクトリにコピーし、tinyjtag.cfgと改名してください。内容を以下のように書き換えます。

#
# Besttechnology TINY JTAG-ICE BTE067
#
# http://www.besttechnology.co.jp/modules/knowledge/?BTE067B%20TINY%20JTAG-ICE2
#

interface ft2232
ft2232_device_desc "TINY JTAG-ICE A"
ft2232_layout jtagkey
ft2232_vid_pid 0x0403 0x6010

このままコピーした方が早いかもしれません。

ターゲットの設定

ターゲットCPUの設定をするために trunk/tcl/target/lpc2378.cfgを適当なディレクトリにコピーし、lpc2388.cfgに改名します。

設定ファイルの立場から見ると、LPC2378とLPC2388はメモリサイズが異なるだけです。そこで、設定ファイルのSRAMファイルに関する記述を32kBから64kBに変更します。また、コメントも書き換えます。具体的には

  • -work-area-size を 0x8000 から 0x10000 に変更
  • CPU名を LPC2378 から LPC2388 に変更
  • コメントのSRAMサイズに関する記述を 32kBから64kBに変更

です。変更後のファイルを以下に示します。

# NXP LPC2388 ARM7TDMI-S with 512kB Flash and 64kB Local On-Chip SRAM (98kB total), clocked with 4MHz internal RC oscillator

if { [info exists CHIPNAME] } {
	set  _CHIPNAME $CHIPNAME
} else {
	set  _CHIPNAME lpc2388
}

if { [info exists ENDIAN] } {
	set  _ENDIAN $ENDIAN
} else {
	set  _ENDIAN little
}

if { [info exists CPUTAPID ] } {
	set _CPUTAPID $CPUTAPID
} else {
	set _CPUTAPID 0x4f1f0f0f
}

#delays on reset lines
jtag_nsrst_delay 200
jtag_ntrst_delay 200

# LPC2000 -> SRST causes TRST
reset_config trst_and_srst srst_pulls_trst

jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

set _TARGETNAME [format "%s.cpu" $_CHIPNAME]
target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi-s_r4

# LPC2388 has 64kB of SRAM on its main system bus (so-called Local On-Chip SRAM)
$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x40000000 -work-area-size 0x10000 -work-area-backup 0

$_TARGETNAME configure -event reset-init {
	# Force target into ARM state
	soft_reset_halt
	#do not remap 0x0000-0x0020 to anything but the flash
	mwb 0xE01FC040 0x01
}

# LPC2388 has 512kB of FLASH, but upper 8kB are occupied by bootloader.
# After reset the chip uses its internal 4MHz RC oscillator
#flash bank lpc2000 <base> <size> 0 0 <target#> <variant>
flash bank lpc2000 0x0 0x0007D000 0 0 0 lpc2000_v2 4000 calc_checksum

# 4MHz / 6 = 666kHz, so use 500
jtag_khz 500

動作確認

JTAGインターフェースとターゲットの設定が完了したら、ターゲットと接続して試験を行います。OpenOCDはコマンドラインから起動します。

suikan:~$ sudo /opt/openocd/bin/openocd -f tinyjtag.cfg -f lpc2388.cfg
[sudo] password for suikan: 
Open On-Chip Debugger 0.3.0-in-development (2009-08-24-21:11) svn:2604
$URL: svn://svn.berlios.de/openocd/trunk/src/openocd.c $
For bug reports, read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS
jtag_nsrst_delay: 200
jtag_ntrst_delay: 200
500 kHz
Info : clock speed 500 kHz
Info : JTAG tap: lpc2388.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
Info : JTAG Tap/device matched
Error: EmbeddedICE v7 handling might be broken
target state: halted
target halted in ARM state due to breakpoint, current mode: Supervisor
cpsr: 0xa00000d3 pc: 0x000000fc

"Embedded ICE v7 ..."というエラーメッセージが出ていますが、詳細は不明です。多くの場所で報告されていますが、実害なく使っている人も多いようです。taget stateはその時のターゲットの状態によって表示されないこともあるようです。

もう少し詳しく状態を見てみたい方は、telnet経由でOpenOCDに接続することも出来ます。上記の状態のまま

  1. telnet localhost 4444

を実行すると、OpenOCDのコマンドライン・インターフェースに接続できます。helpでコマンド一覧を見ることが出来ます。

halt
armv4_5 reg

でレジスタを表示出来るなら、接続出来ていると考えて良いでしょう。

IMGP3516.jpg
写真1 LPC2388ボードとTINY JTAG-ICE

参考リンク