OpenOCD 是一個很像以前 armtools 的專案,是利用jtag 控制arm core,而不是像samsung 的sjf 一樣,利用chip pinout boundary chain,控制pin out。
所以 OpenOCD 可以適用於所有使用arm core 的chip (而 sjf 只能用在samsung S3C24xx上)。
install:
follow 這一頁(
http://openfacts.berlios.de/index-en.phtml?title=Building_OpenOCD)的說明,checkout openocd source。
因為公司有proxy,所以要用下面的command:
:~$svn co https://svn.berlios.de/svnroot/repos/openocd/trunk
然後到trunk 下。
:~$./bootstrap
這個command 需要automake 的aclocal,所以要記得安裝。
bootstrap會依據host system產生configure 這個script。
然後run configure.
:~$ ./configure --enable-parport
要注意 "--enable-parport" 這個option 要手動加入。否則他不會把parellel port 的interface 支援功能加入。
使用parallel port 的話,除了直接對io port access - include <sys/io.h> 外,也可以用/dev/parport0 的方式,就要增加 --enable-ppdev,但是我使用 --enable--ppdev 的code無法讓parallel port 正確動作。所以只好用 direct io port access (後來我還有改parallel port 的bios 設定,由"printer"改為"spp"
然後,開始make
:~$ make
之後,install (需要root 權限)
:~$ sudo make install
install 完後把他加上 S attrib,讓非root的user也可以使用 (direct IO access需要ioperm( ) )。
install 完後,可以試run看看..
:~$ openocd
Info: openocd.c:93 main(): Open On-Chip Debugger (2007-09-05 09:00 CEST)
Warnning: parport.c : 395 parport_init( ) : no parport specified, using default '0x378' (LPT1)
Error: jtag.c : 1253 jtag...
.OK。
因為我們有自己的jtag board,pin assignment 和wiggler 不一樣,所以要修改code。
parallel port pin assignment 在 src/jtag/parport.c,在line 97 的地方有支援的 parallel port dongle pin assignment 宣告。
所以新增一個entry : sjf..
{ "sjf", 0x80, 0x00, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00 },
...這就是要作上一篇
jtag board sch 的原因。
後來發現pin definition 和 chamelen 一樣。
我們的小板子和 target board connector 有lay nTRST。但是到了parallel port board (74HC541) 就沒有lay nTRST。所以沒辦法控制 nTRST。
改好,make, make install。
修改config,原source 已經包含很多 cfg 的sample,在doc/configs 下。但是arm920t的cfg只有arm9_ft2232。
用 openmoko 的cfg 好了,比較接近..
到這個link(
http://wiki.openmoko.org/wiki/Neo1973_OpenOCD) 去.. download openmoko 的openmoko.cfg
$ wget http://people.gta01.hmw-consulting.de/laforge/misc/openocd.cfg
修改一下..改為用sjf (剛剛改的...):
#daemon configuration
telnet_port 4444
gdb_port 3333
#interface
interface parport
parport_port 0x378
parport_cable sjf
jtag_speed 8
#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst #srst_pulls_trst
#jtag scan chain
#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
jtag_device 4 0x1 0xf 0xe
#target configuration
daemon_startup attach
#target
target arm920t little reset_run 0 arm920t
#working_area 0 0x200000 0x4000 backup
run_and_halt_time 0 5000
#flash configuration (K9D1208V0M: 512Mbit, x8, 3.3V, Mode: Normal, 1st gen)
#NOR flash configuration (SST39VF400A 4Mbit, x16, 3.3V, 128sect, 4k/sect, 8 blocks (64kByte per block)
# flash bank cfg addr length chip_width bus_width target
#flash bank cfi 0x00000000 0x80000 2 2 0
紅色部份就是修改的地方,save成openocdsjf.cfg。
接上debug board,,, power on。開始..
$ openocd -f openocdsjf.cfg
Info: openocd.c:93 main(): Open On-Chip Debugger (2007-09-05 09:00 CEST)
代表openocd正確執行了....否則會有error mesasge..
openocd 是一個daemon,提供一個 telnet connection (port 4444) 讓user 溝通。
所以,另外開啟一個console..用telnet 連線..
charles@rbtlegacy:~$ telnet 127.0.0.1 4444
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Open On-Chip Debugger
>
成功!出現command prompt!!
連上後,target system 還是可以正常執行,
下command: halt:
> halt
requesting target halt...
> Target 0 halted
target halted in ARM state due to debug request, current mode: Supervisor
cpsr: 0x60000013 pc: 0x338053a4
MMU: disabled, D-Cache: disabled, I-Cache: enabled
>
target system 停止,然後下resume:
> resume
Target 0 resumed
>
target system 又繼續動作,,,
command 可以在telnet 下help ,會列出:
> help
help display this help
sleep sleep for <n> milliseconds
version show OpenOCD version
shutdown shut the server down
exit exit telnet session
log_output redirect logging to <file> (default: stderr)
debug_level adjust debug level <0-3>
jtag_speed set jtag speed (if supported) <speed>
scan_chain print current scan chain configuration
endstate finish JTAG operations in <tap_state>
jtag_reset toggle reset lines <trst> <srst>
runtest move to Run-Test/Idle, and execute <num_cycles>
statemove move to current endstate or [tap_state]
irscan execute IR scan <device> <instr> [dev2] [instr2] ....
這些command可以看一下..有很多有用的command..
可以有些command 雖然有列出,但是沒有support,像...disassemble.
OH!! 可以attach CE machine,連上後,CE machine會繼續run,然後用halt 暫停,之後在用 resume 繼續run!!halt 之後,可以用mdw 讀取任意位置的記憶體喔。 (但是因為mmu已經開啟了,所以address 藥用virtual address)。"poll" 命令可以用來看arm core 目前的狀態 running, halt, or ?
有關openocd 的command,在openmoko和openocd的document都有說明,可以參考一下。
其中
openmoko 這一篇,還說明如何用openocd作load image and run 的動作。