Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157124
  • 博文数量: 152
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-08 15:46
文章分类

全部博文(152)

文章存档

2016年(152)

我的朋友

分类: LINUX

2016-06-02 14:08:12

关于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 就好了。
       当然,你也可以通过git的方式 下载源代码。
      
        如果你也想安装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.(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 #'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


阅读(640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~