1.首先到官网 https://www.segger.com/jlink-software.html下载Jlink的驱动,分别为win版本和linux版本。
下载win版本的目的是作为参考对照使用,即先保证在win下可以使用jlink了,然后记录下相关的参数,用这些参数去linux下使用。
在写这篇日志时最新的jlink驱动为5.12g 点击Download开始下载。
图1
对应的linux版本为
图2
安装完win下的版本后启动Jlink GDB Server
图3
根据情况选择,我的情况是使用了usb连接的jlink,Connection to J-Link那里选择USB。
Target device 那里点击后面的”…”浏览按钮选择device,就我的情况来说,我使用的arm9在列表中没有列出,就选择了通用的ARM9
图4
其他的选择见下图:
图5
最后的那一行Command line option内容是根据上面的选择生成的对应的命令行格式的选项和参数,一会在linux下会用到这些参数,因为linux下是使用命令行启动Jlink-GDB-server的,没有图形界面可以按按点点的。现在的目的就是验证这些参数是否正确,正确的话就直接copy到linux下使用就行了。现在看来其实这些参数是正确的,可以在linux下使用,但是当时我在linux下用这些参数调试时总提示连接不上,导致一度怀疑它的正确性,后面再具体说。
点击OK按钮后,如果运气好的话应该能看到这样的画面:
图6
主要是CPU那里可以看到ARM9,JTAG ID后面能看到具体的数值。
如果运气不好的话就是这个鸟样:
图7
CPU Not connected 以及下面的Could not connect to target.
这时问题来了,如果在win下都不能掌握如何操作,那么在命令行下该怎么操作呢?该使用什么样的参数来设置呢?所以需要先解决在win下不能连接到板子的问题。当然了,如果你在win下每次都不会出现图7那样找不到target的情况的话,那么就可以跳过下面的这一段手动折腾了。
首先给板子断电,切记要断电,要断电。然后把下jlink连接usb的那根线,让jlink的jtag还保持和板子连接,这时找个导线或其他导电的东西依次短接jtag的信号线和地。
图8
也就是把左边的信号线依次短接到地。完事儿之后再依次连接jlink到pc,给板子上电。然后重新启动Jlink GDB Server,这时应该可以出现图6的成功画面了,jlink已经成功启动了
,后面的话就该干什么干什么吧。反正我是在linux下用
arm-linux-gdb –command=/path/of/gdbinit
来启动gdb进行调试了。–command=这个关键字是用来指定使用哪个gdbinit文件的,当有多个不同的gdbinit时很有用,如果只有一个gdbinit就不用这么费事了,把gdbinit改成隐形文件即.gdbinit然后放在~/目录下,直接运行arm-linux-gdb 就行了。
说多了,此时在win下是没有问题了,下面开始在linux下调试。
如果你跟我一样使用虚拟机的话需要先保证系统已经识别出Jlink了。如图9,抱歉我把自己名字盖上了。
图9
如红色方框所示已经识别出来了。
接下来安装linux下的jlink驱动,也就是日志开头那里下载的压缩包。解压后内容如图10
图10
开始我以为要从源码编译,已经做好了东拼西凑各种依赖库的准备,后来仔细一看发现已经编译好了,有现成的JLinkGDBServer,试了试是可以运行的,省了不少事,不加参数直接运行的结果是这样的:
图11
然后看了下README.txt
图12
看情况是否copy那个文件吧。
接下来加上参数运行JlinkGDBServer
图13
仔细看红色的提示信息,熟悉网络编程的应该可以敏感的猜到是什么原因。因为我刚才已经运行过一次JlinkGDBSever了,那时结束JlinkGDBServer运行后实际上2331这个端口还被占用着,导致再次运行JlinkGDBServer时不能重复使用这个端口了,下面来验证一下:
图14
从图14可以看到还有一个JlinkGDBServer在监听着2331,kill它。然后再检查一下,如图15
如15
再次重新运行
[zz@zzfedora23 JLink_Linux_V512g_x86_64]$ ./JLinkGDBServer -select USB -device ARM9 -if JTAG -speed 1000 -noir
SEGGER J-Link GDB Server V5.12g Command Line Version
JLinkARM.dll V5.12g (DLL compiled May 27 2016 17:03:38)
—–GDB Server start settings—–
GDBInit file: none
GDB Server Listening port: 2331
SWO raw output listening port: 2332
Terminal I/O port: 2333
Accept remote connection: yes
Generate logfile: off
Verify download: off
Init regs on start: off
Silent mode: off
Single run mode: off
Target connection timeout: 0 ms
——J-Link related settings——
J-Link Host interface: USB
J-Link script: none
J-Link settings file: none
——Target related settings——
Target device: ARM9
Target interface: JTAG
Target interface speed: 1000kHz
Target endian: little
Connecting to J-Link…
J-Link is connected.
Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46
Hardware: V8.00
S/N: 17935099
Feature(s): RDI,FlashDL,FlashBP,JFlash
Checking target voltage…
Target voltage: 3.14 V
Listening on TCP/IP port 2331
Connecting to target…
J-Link found 1 JTAG device, Total IRLen = 4
JTAG ID: 0x07926F0F (ARM9)
Connected to target
Waiting for GDB connection…Connected to 10.0.14.38
Reading all registers
Read 4 bytes @ address 0x0D55BFAC (Data = 0x00000FEB)
Read 4 bytes @ address 0x0D55BFA8 (Data = 0x00000FEA)
Read 4 bytes @ address 0x0D55BFAC (Data = 0x00000FEB)
Read 4 bytes @ address 0x0D55BFA8 (Data = 0x00000FEA)
Read 4 bytes @ address 0x0D55BFAC (Data = 0x00000FEB)
Read 4 bytes @ address 0x0D55BFAC (Data = 0x00000FEB)
Read 4 bytes @ address 0x0D55BFAC (Data = 0x00000FEB)
Writing 0x00000002 @ address 0x600000D8
Writing 0x0045563B @ address 0x60011830
Writing 0x00000F16 @ address 0x60011804
Read 4 bytes @ address 0x60011808 (Data = 0x000000F1)
Writing 0x00000001 @ address 0x600000D8
Writing 0x00F00857 @ address 0x60011820
Writing 0x00000D70 @ address 0x600118E4
Writing 0x00000018 @ address 0x600118E8
Writing 0x00021011 @ address 0x600118A8
Read 4 bytes @ address 0x600118A8 (Data = 0x000E1001)
Writing 0x040BB8FF @ address 0x60011884
Read 4 bytes @ address 0x60011880 (Data = 0x000000FF)
Writing 0x00000442 @ address 0x60011004
Writing 0x00040170 @ address 0x60011010
Writing 0x00000018 @ address 0x60011014
Writing 0x0006C116 @ address 0x60011020
Writing 0x0BDB601C @ address 0x60011028
Writing 0x1860276B @ address 0x60011030
Writing 0xC2004060 @ address 0x60011034
Writing 0x18060912 @ address 0x60011038
Writing 0x40802005 @ address 0x60011040
Writing 0x80000607 @ address 0x60011000
Writing 0x0032AA20 @ address 0x60011800
Writing 0x01234567 @ address 0x80000000
Writing 0x89ABCDEF @ address 0x80000004
Writing 0x00112233 @ address 0x80000008
Writing 0x44556677 @ address 0x8000000C
Writing 0x8899AABB @ address 0x80000010
Writing 0xCCDDEEFF @ address 0x80000014
Read 4 bytes @ address 0x80000000 (Data = 0x01234567)
Writing 0x00000000 @ address 0x6000002C
Writing 0x00006E34 @ address 0x60000000
Writing 0x00006E35 @ address 0x60000000
Writing 0x00006E34 @ address 0x60000000
Read 4 bytes @ address 0x60000018 (Data = 0x00000001)
Writing 0x00000001 @ address 0x6000002C
Writing 0x0000C890 @ address 0x60000004
Writing 0x0000C891 @ address 0x60000004
Writing 0x0000C890 @ address 0x60000004
Read 4 bytes @ address 0x60000018 (Data = 0x00000003)
Writing 0x00004030 @ address 0x6000000C
Writing 0x00004031 @ address 0x6000000C
Writing 0x00004030 @ address 0x6000000C
Read 4 bytes @ address 0x60000018 (Data = 0x0000000B)
Writing 0x00004230 @ address 0x60000010
Writing 0x00004231 @ address 0x60000010
Writing 0x00004230 @ address 0x60000010
Read 4 bytes @ address 0x60000018 (Data = 0x0000001B)
Writing 0x00001449 @ address 0x60000014
Writing 0x0000000B @ address 0x6000005C
Writing 0x00000005 @ address 0x60000064
Writing 0x00000005 @ address 0x60000068
Writing 0x0000000B @ address 0x60000084
Writing 0x00000017 @ address 0x60000058
Writing 0x03FFE0FF @ address 0x60005018
Writing 0x0000000D @ address 0x60043000
Writing 0x00000000 @ address 0x6004300C
Writing 0x00000201 @ address 0x60043008
Writing 0x0000001A @ address 0x60043010
Writing 0x08080000 @ address 0x6004301C
Writing 0x00007FFF @ address 0x60043048
Writing 0x00000007 @ address 0x6004300C
Writing 0x00000036 @ address 0x60043004
Writing 0x00000037 @ address 0x60043004
Writing 0x00000038 @ address 0x60043004
Writing 0x00000039 @ address 0x60043004
Downloading 16304 bytes @ address 0x80000000
Downloading 16288 bytes @ address 0x80003FB0
Downloading 16320 bytes @ address 0x80007F50
Downloading 16256 bytes @ address 0x8000BF10
Downloading 16256 bytes @ address 0x8000FE90
Downloading 16304 bytes @ address 0x80013E10
Downloading 16272 bytes @ address 0x80017DC0
Downloading 16304 bytes @ address 0x8001BD50
Downloading 16256 bytes @ address 0x8001FD00
Downloading 8688 bytes @ address 0x80023C80
Downloading 16256 bytes @ address 0x80025E70
Downloading 16272 bytes @ address 0x80029DF0
Downloading 12737 bytes @ address 0x8002DD80
Downloading 44 bytes @ address 0x80030F44
Downloading 9156 bytes @ address 0x80030F70
Downloading 4 bytes @ address 0x80033334
Downloading 12 bytes @ address 0x80033338
Downloading 1784 bytes @ address 0x80033344
Downloading 16292 bytes @ address 0x80033A3C
Downloading 11212 bytes @ address 0x800379E0
Downloading 96 bytes @ address 0x8003A5AC
Downloading 42 bytes @ address 0x8003A60C
Downloading 128 bytes @ address 0x8003A638
Downloading 17 bytes @ address 0x8003A6B8
Downloading 24 bytes @ address 0x8003A6CC
Writing register (PC = 0x80000000)
Starting target CPU…
ERROR: Bad JTAG communication: Write to IR: Expected 0x1, got 0x0 (TAP Command : 2) @ Off 0xEE.
从Connected to 10.0.14.38 开始的内容是在pc端执行arm-linux-gdb –command=/path/of/gdbinit之后,arm-linu-gdb 连接到 JLinkGDBServer后的回显,内容就是gdbinit中的初始化硬件寄存器数值。
到此基本就完成了。
ps:当我写到这里时发现,我的板子又不能成功的在linux下使用jlink了,即使按照前面说的都操作了一遍也还是不能使用…我开始凌乱了。如果你知道是怎么回事并且愿意相告的话可以联系我,不胜感激。
补充一下,目前为止最好用的方法就是:板子断电,jlink断开usb连接,断开与板子的连接,待上半小时,然后再重新连接起来这一堆。暂时没有逻辑分析仪和示波器,对比一下正确和失败的情况也许会有发现。