前幾天買了一個OpenJTAG,準備用於U-boot的調試和開發。
其實OpenJTAG和openmoko的Debugboard V3在硬件上是一樣的。如果你之前在 暈到死 下裝過openmoko的Debugboard V3的驅動,那插上OpenJTAG就可以用,並識別爲openmoko的Debugboard。 openmoko的Debugboard還比 OpenJTAG 多了一個 HUB芯片 ,多擴出了兩個USB口,並添加了專爲openmoko手機設計的FPC接口。 可以說 OpenJTAG就是 openmoko的Debugboard的簡化版,如果已經有 openmoko的Debugboard的朋友,就無須購買 OpenJTAG了。 買來後學習了一下
《Eclipse,OpenOCD,OpenJTAG 嵌入式開發教程》 (以下簡稱教程)。首先要學習的是使用OpenJTAG調試的基本原理,這個在教程的
“1.2 嵌入式軟件的交叉開發系統” 中有很好的介紹,大家一定要看一下。之後的關鍵是如何配置OpenOCD,使其可以認出你開發板上的芯片和flash。在教程中介紹的是使用他們編譯好的 0.1.0版本的OpenOCD和已經寫好的openocd.cfg配置文件。但是作爲一個嵌入式Linux學習者,我們要知道這些東西這麼用,也得知道這些東西是怎麼來的吧。如果以後換了一個硬件平臺還是得自己配置。所以藉此機會,我通過上網查閱資料,稍微研究了一下OpenOCD的安裝配置。在這裏我介紹一下我在調試mini2440上的安裝配置情況。
下載解包後只要:./configure; make; sudo make install 就好了。
如果你也想安裝ftdi-eeprom(燒寫FT2232所連接的e2prom的工具),可用同樣的方法下載安裝。(必須安裝libconfuse-dev )
以下兩種方式選一種:
(1)下載最新版openocd (最新開發版,想做小白鼠的使用)
在你想要保存openocd的目錄下執行:
git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd
|
這樣就會在當前目錄下創建一個openocd的目錄,並將代碼下載於此。
(2)進入openocd的目錄,執行:
. / bootstrap ./configure --enable-maintainer-mode --enable-ft2232_libftdi make sudo make install
|
我編譯安裝完後的版本是:
tekkaman@MAGI: ~ / developer/OpenJTAG/openocd/openocd$ openocd - v Open On- Chip Debugger 0. 4. 0- dev- 00093- g2b1bd97 ( 2009- 11- 08- 13: 24) $URL$ For bug reports, read http: / / openocd. berlios. de/doc/doxygen/bugs. html
|
(1)
下載 最新穩定版openocd
(最新穩定版,想穩定的使用)
(2)解壓並進入openocd的目錄,執行:
./configure --enable-maintainer-mode --enable-ft2232_libftdi make sudo make install
|
我編譯安裝完後的版本是:
tekkaman@MAGI:~/桌面/openocd_cfg$ openocd -v
Open On-Chip Debugger 0.3.0 (2009-11-08-13:52)
$URL$
For bug reports, read
http://openocd.berlios.de/doc/doxygen/bugs.html
|
二、配置
當你在某個目錄執行openocd的時候,openocd會自動查找當前文件夾下的openocd.cfg 配置文件,如果你在啓動時加了 -f <filename> 的參數,那麼openocd會使用你指定的配置文件。
配置文件是至關重要的,直接關係到OpenOCD是否可以通過OpenJTAG認到你的開發板和flash芯片。
詳細的講解最好是看 OpenOCD的用戶指南 或者 在線參考手冊 。 現在我
簡要 介紹一下配置文件的結構。
配置文件所要配置的命令主要分爲以下五個部分:
1、Daemon (守護):主要是配置openocd對外的通訊所使用的本地TCP/IP端口,如gdb、telnet所使用的端口,我的配置如下
telnet_port 4444 tcl_port 6666
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # GDB Setup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
gdb_port 3333 gdb_breakpoint_override hard gdb_memory_map enable gdb_flash_program enable
|
2、interface(接口):也就是openocd所操作的連接開發板的調試器,我使用的是OpenJTAG,配置如下:
interface ft2232 ft2232_vid_pid 0x1457 0x5118 ft2232_layout "jtagkey_prototype_v1" ft2232_device_desc "USB<=>JTAG&RS232"
|
如果你使用的是並口或別的調試器,你可以看看在/usr/share/openocd/scripts/interface目錄中是否有合適您的文件。
3、target(目標):可以理解爲被調試的目標CPU,我的mini2440的target是S3C2440,而被支持的CPU你可以在/usr /share/openocd/scripts/target找到。我個人認爲只應該針對的是CPU核心,比如S3C2440的核心是ARM920T,所以同系列的CPU只要將S3C2440的配置稍加改動即可。我的配置如下:
if { [ info exists CHIPNAME] } { set _CHIPNAME $CHIPNAME } else { set _CHIPNAME s3c2440 } if { [ info exists ENDIAN] } { set _ENDIAN $ENDIAN } else { # this defaults to a bigendian set _ENDIAN little } if { [ info exists CPUTAPID ] } { set _CPUTAPID $CPUTAPID } else { # force an error till we get a good number set _CPUTAPID 0x0032409d }
jtag newtap $_CHIPNAME cpu - irlen 4 - ircapture 0x1 - irmask 0x0f- expected- id $_CPUTAPID target create mini2440 arm920t - endian $_ENDIAN - chain- position $_CHIPNAME. cpu - variant arm920t
mini2440 configure - work- area- virt 0 - work- area- phys 0x200000- work- area- size 0x4000 - work- area- backup 1
#reset configuration
reset_config trst_and_srst
|
4、board(主板):指的是目標板上的配置,其實主要是針對板子上的Flash和PLD等可通過JTAG編程的設備配置的。針對mini2440,我的配置是:
# Flash # 1MBx16 NOR Flash flash bank cfi 0x0 0x200000 2 2 mini2440 jedec_probe
# NAND nand device s3c2440 mini2440
|
配置好了這個,就可以通過Openocd來讀寫nand flash了 。