Ubuntu环境下使用OpenOCD调试目标平台

硬件环境:HP CQ45 308
操作系统:KUbuntu12.04 LTS 32bit
目标平台:LM3S811最小系统
        OpenOCD最早接触应该是在半年前了,当时买了OpenJTAG仿真器,附带的光盘中介绍了在Linux下建立ARM开发调试环境,其中一个主要的部分就OpenOCD,OpenOCD个人觉得最有用的地方就是它可以作为GDBServer,从而方便了我们使用GDB进行调试。由于当时时间有限,因此这件事情一直拖到现在。这篇文章主要介绍的是OpenOCD连接上LM3S811的设置,关于Eclipse环境下的调试会在另一篇文章中介绍。
此文章为本人原创,如需转载,请注明转载地址:
http://blog.163.com/thinki_cao/blog/static/8394487520136325112103/
1. OpenOCD的编译
其实Ubuntu中已经自带类OpenOCD的二进制安装包,可以使用 sudo apt-get install openocd进行安装。不过Ubuntu中的版本比较低,因此大部分人都会下载源码重新编译,其实编译过程也很快。首先上sourceforge上下载openocd源码包 http://sourceforge.net/projects/openocd/ ,这里我用的是0.7版本,截止目前来看还算是比较新的。接下来解压,编译以及安装:

 
     

$ tar xvf openocd-0.7.0.tar.bz2
$ cd openocd-0.7.0
$ ./bootstrap(这一步我没有执行,网上大部分资料都说要执行这一步,但我没有执行也能用)
./configure --enable-maintainer-mode --enable-ft2232_libftdi

$ make

$ sudo make install

执行完了之后在终端中查看一下openocd版本:
 
     

$ openocd -v

出现如下信息的,基本上编译安装成功了:
Open On-Chip Debugger 0.7.0 (2013-07-02-22:39)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
2. OpenOCD与板子的连接
1.添加udev的rules规则
添加udev规则的目的是使得openocd可以访问usb设备,这里简要介绍一下 ,具体的原理可以去谷歌一下
首先插上板子的USB线,在终端中执行:
 
     

lsusb

出现如下信息:
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 003: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 002 Device 004: ID 090c:c371 Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) 
Bus 006 Device 013: ID 0403:bcda Future Technology Devices International, Ltd 
我们可以看到ID号为0403:bcda的USB设备即为调试器(hardware debugger),这里是FTDI设备。那么我们需要做的就是通知系统ID号为0403:bcda的USB设备是可以被应用程序访问的。添加udev规则对于新手来说还是比较费劲的,不过庆幸的是 openocd中已经包含了大部分硬件调试器的udev规则(位于/usr/local/share/openocd/contrib目下的openocd.udev文件),因此我们只需要将其复制到udev目录下即可(这里需要将后缀名改为.rules):
 
     

sudo cp /usr/local/share/openocd/contrib/openocd.udev /etc/udev/rules.d/openocd.rules

udev规则会自动更新,不过对于usb等热插拔设备来说,我们需要重新拔插一下usb线使其更新。我们顺便再打开openocd.rules文件看一下里面的内容(这里显示一部分):
# Olimex ARM-USB-OCD
ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0003", MODE="664", GROUP="plugdev"
# Olimex ARM-USB-OCD-H
ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002b", MODE="664", GROUP="plugdev"
...............
..............
# TI/Luminary Stellaris Evaluation Board FTDI (several)
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd9", MODE="664", GROUP="plugdev"

# TI/Luminary Stellaris In-Circuit Debug Interface FTDI (ICDI) Board
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcda", MODE="664", GROUP="plugdev"

.................
.................
这里可以看到红色带下划线的部分含有0403和bcda,从标明上可以理解0403表示的是idVendor(即厂商ID),bcda表示的是idProduct(即产品ID),与之前从lsusb中看到的id号0403:bcda完全一致!额外提一点,从文件中的注释(#号开头的部分)可以看出 0403:bcda对应的是“ICDI Board”,而0403:bcd9对应的是“Stellaris Evaluation Board”,这也是为下面遇到的问题埋伏笔。

2. 选择配置文件与板子进行连接
openocd安装完成之后就需要与板子进行连接,从而扮演板子与GDB或者telnet之间桥梁的角色。
这里简单介绍一下,openocd的配置文件分为三类:
1. interface – one for each different debug adapter; 
2. board – one for each different board 
3. target – the chips which integrate CPUs and other JTAG TAPs
openocd安装完成之后可以在/usr/local/share/openocd/scripts目录下找到以上三个目录.并且官方的建议是:
Best case: include just two files, and they handle everything else. The first is an
interface config file. The second is board-specific, and it sets up the JTAG TAPs and
their GDB targets (by deferring to some ‘target.cfg’ file), declares all flash memory,
and leaves you nothing to do except meet your deadline
我用的板子的MCU是LM3S811,openocd中已经带了LM3S811评估板的配置文件,这里可以使用openocd中已经包含的配置文件。配置文件位于/usr/local/share/openocd/scripts/board/ek-lm3s811.cfg,将板子上的USB口与电脑连接并通电后,在终端运行:
 
     

openocd -/usr/local/share/openocd/scripts/board/ek-lm3s811.cfg

报错:
Open On-Chip Debugger 0.7.0 (2013-07-02-22:39)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 500 kHz
Error: unable to open ftdi device: device not found
in procedure 'init'
谷歌了一下Error,找到一个链接 http://e2e.ti.com/support/microcontrollers/stellaris_arm/f/471/p/213766/756241.aspx#756241,解决了问题。
原因是ek-lm3s811.cfg中第10行标出的是: source [find interface/luminary.cfg],定位到luminary.cfg中,第28行内容如下:
ft2232_device_desc "Stellaris Evaluation Board"
而根据之前udev规则中注释的描述,“Stellaris Evaluation Board”对应的ID号是0403:bcd9,但是我们的USB设备的ID号是0403:bcda,当然也就会出现“Error: unable to open ftdi device: device not found ”,这里我们需要把luminary.cfg替换成luminary-icdi.cfg。即:
将ek-lm3s811.cfg中的“source [find interface/luminary.cfg]”替换成“source [find interface/luminary-icdi.cfg]”
修改之后再次执行
 
      

openocd - /usr/local/share/openocd/scripts/board/ek-lm3s811.cfg

出现如下信息:
Open On-Chip Debugger 0.7.0 (2013-07-02-22:39)Licensed under GNU GPL v2For bug reports, readhttp://openocd.sourceforge.net/doc/doxygen/bugs.htmlInfo : only one transport option; autoselect 'jtag'adapter speed: 500 kHzInfo : clock speed 500 kHzInfo : JTAG tap: lm3s811.cpu tap/device found: 0x2ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x2)Info : lm3s811.cpu: hardware has 6 breakpoints, 4 watchpoints
此时(deamon)守护进程开始执行,openocd与板子的连接成功!
3. 通过telnet与openocd连接
openocd的守护进程开启之后即可使用telnet或者gdb(此时openocd充当gdbserver)进行连接,从而可以对MCU进行flash擦写以及在线调试。gdb以及相应ecilpse的设置较复杂,这里先介绍简单的telnet。
openocd守护进程开启之后在终端输入:
 
    

telnet localhost 4444

连接成功的话输出内容如下:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger

接下来即可使用openocd中的命令进行操作,这里简要介绍一下,毕竟openocd最重要的部分是gdbserver。
输入mdw来查看存储器地址为0x0的内容:
> mdw 0x0
0x00000000: 20000100 
输入mww对存储器为0x0的地址进行写入20000000
> mww 0x0 20000000
不过这里写入有一些问题,个人觉得这里可能是由于flash的写保护没有关闭,因此写入失败。

        到这里,openocd与lm3s811的连接基本完成,虽然调试的过程充满了曲折,尤其是刚刚入门的时候,但是收获也很大。我在调试openocd以及查阅资料的过程中对于MCU的在线调试也有了一定的理解,关于eclipse+gdb调试的相关内容敬请期待!

你可能感兴趣的:(Ubuntu环境下使用OpenOCD调试目标平台)