关于OpenOCD的安装和配置(以mini2440+OpenJTAG为例)
前几天买了一个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了。
买来后学习了一下(以下简称教程)。首先要学习的是使用OpenJTAG调试的基本原理,这个在教程的“1.2 嵌入式软件的交叉开发系统”中有很好的介绍,大家一定要看一下。之后的关键是如何配置OpenOCD,使其可以认出你开发板上的芯片和flash。在教程中介绍的是使用他们编译好的0.1.0版本的OpenOCD和已经写好的openocd.cfg配置文件。但是作为一个嵌入式Linux学习者,我们要知道这些东西这么用,也得知道这些东西是怎么来的吧。如果以后换了一个硬件平台还是得自己配置。所以借此机会,我通过上网查阅资料,稍微研究了一下OpenOCD的安装配置。在这里我介绍一下我在调试mini2440上的安装配置情况。
一、安装
如果你使用的是ubuntu系统,可以通过新立德直接安装openocd。这样会自动安装依赖的软件(其中关键的是libftdi).安装好的版本是OpenOCD-0.2.0和libftdi-0.13。这种方法最简单省事,但也有局限性,不同版本的openocd的配置文件会有差异,并不通用。如果你想要使用最新的openocd,那就得自己下载安装了。
(0)下载最新版
libftdi ,这是OpenJTAG使用的
FT2232D 芯片的底层驱动库。(如果提示无法找到某些头文件,就用新立德安装就好了。需要先安装
libusb-dev) 下载解包后只要:./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 |
二、配置
当你在某个目录执行openocd的时候,openocd会自动查找当前文件夹下的openocd.cfg配置文件,如果你在启动时加了 -f 的参数,那么openocd会使用你指定的配置文件。
配置文件是至关重要的,直接关系到OpenOCD是否可以通过OpenJTAG认到你的开发板和flash芯片。详细的讲解最好是看或者。现在我简要介绍一下配置文件的结构。
配置文件所要配置的命令主要分为以下五个部分:
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了。但是SST的Nor flash 似乎还不支持烧写。
5、其他:还有一些JTAG口设置等等,请参考。
以下是我的可用的openocd.cfg(针对openocd-0.3.0+OpenJTAG+mini2440):
|
文件: | openocd.cfg.tar.gz |
大小: | 0KB |
下载: | 下载 |
|
在教程中介绍的烧写u-boot到flash的方法是现将他们的u-boot现导入内存,并启动。使用u-boot去烧写u-boot,这种方法是最快最好的方法。但是现在的openocd可以直接烧写nand flash(前提是你在配置文件中配置正确)。步骤如下:
(1)启动openocd,并通过telnet登录。
(2)让openocd探测板上的nand flash。
(3)利用nand命令擦除、再写入。
具体命令:
在一个shell中启动
tekkaman@MAGI:~/桌面/openocd_cfg$ sudo openocd 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
force hard breakpoints jtag_nsrst_delay: 100 jtag_ntrst_delay: 100 TargetName Type Endian TapName State -- ------------------ ---------- ------ ------------------------------ 0* mini2440 arm920t little s3c2440.cpu unknown 12000 kHz trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain Info : clock speed 6000 kHz Info : JTAG tap: s3c2440.cpu tap/device found: 0x0032409d (mfg:0x04e, part: 0x0324, ver: 0x0) Info : Embedded ICE version 2
|
在另一shell中:
tekkaman@MAGI:~/桌面/openocd_cfg$ telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > poll background polling: on TAP: s3c2440.cpu (enabled) target state: halted target halted in ARM state due to breakpoint, current mode:Supervisor cpsr: 0x400000d3 pc: 0x0105daf4 MMU: disabled, D-Cache: disabled, I-Cache: disabled > nand probe 0 NAND flash device 'NAND 128MiB 3,3V 8-bit' found > nand erase 0 0 0x60000 #注释:擦除大小必须是0x20000(block size)的整数倍 s3c2440_read_block_data: reading data: 0x91a89e8, 0xbfea3d6a, 6
erased blocks 0 to 3 on NAND flash device #0 'NAND 128MiB 3,3V 8-bit' > nand write 0 u-boot.bin 0 wrote file u-boot.bin to NAND flash 0 up to offset 0x00043800 in 287.407043s
|
阅读(17007) | 评论(3) | 转发(11) |