早年写的笔记,压箱底了,翻出来晒晒
目 录
使用openjtag和openocd操作IXP425的flash. 1
实验环境... 1
P720路由器硬件配置... 1
核心配置... 1
接口部分... 2
在windows下安装openjtag和openocd. 2
使用OpenOCD、OpenJTAG烧写程序... 3
准备配置文件... 3
用JTAG连接到IXP425. 5
操作IXP425的flash. 7
IXP425 flash的摸索... 9
对比修改配置文件... 9
错误修改jtag_device配置... 12
写入flash的错误... 13
不能写入到0x50000000,halttime out以及写入flash数据出现错误... 14
u P720路由器
u Windows XP sp3
u libusb-win32-filter-bin-0.1.12.2.exe
u openjtag v3
u openocd svn717
IXP425 266Mhz
2片32M SDRAM,nanya NT5SV16M16BS-6K 片选CS3, 基地址0x0。
16M FLASH, intel TE28F128J3C150。CFI地址为0x50000000。
电源为POE供电,但是也有一个单纯的电源接口。
JTAG口
串口
一个以太网口IXP0
phy片为KS8721B
两个mini PCI插槽
1. 安装openjtag驱动
将驱动复制到d:\openjtagcd\Windows\drivers\OpenJTAG,然后将OpenJTAG 板子接到PC 的USB 口后,Windows 会检测到新硬件,如下图 所示。选择“从列表或指定位置安装(高级)(S)”,然后点击下一步。在在新出现的窗口中指定搜索驱动程序的位置为d:\openjtagcd\Windows\drivers\OpenJTAG,点击下一步出现新窗口,点击“仍然继续”。这个过程和安装其他任何硬件类似。
安装openjtag的时候,找到新硬件的窗口会出现3次,每次都指定搜索驱动程序的位置为d:\openjtagcd\Windows\drivers\OpenJTAG就可以了。
安装完成之后在应该出现在设备管理器中,点开“端口(COM 和LPT)”,可以发现新增了一个串口COM8(不同的PC,序号可能不同);点开“通用串行总线控制器”,可以发现新增了3 个设备:100ASKJTAG、100ASK SerialPort、USB CompositeDevice。如下图所示:
2. 安装openocd-r717-20080619.exe
安装的时候,路径也自动加入了,所以在命令行窗口输入openocd-ftd2xx.exe–v,屏幕显示应该如下:
#>openocd-ftd2xx.exe-v
Open On-ChipDebugger (2008-06-19 19:00) svn: 717
URL:http://svn.berlios.de/svnroot/repos/openocd/trunk
IXP425的烧写有一些不同,需要先进行初始化。IXP的配置文件有3个文件组成:debug_handler.bin,openocd.cfg,ixp42x.actions。其中bug_handler.bin必须放在当前目录的\xscale目录下,否则会报错。openocd.cfg是配置openocd的内容,ixp42x.actions是初始化IXP425的脚本。
openocd.cfg内容如下:
#################################################################
#daemon configuration
telnet_port 4444
gdb_port 3333
interface ft2232
ft2232_device_desc "USB<=>JTAG&RS232 A"
ft2232_vid_pid 0x1457 0x5118
#ft2232_layout "jtagkey_prototype_v1"
ft2232_layout "jtagkey"
jtag_device 7 0x01 0x7f 0x7e
jtag_speed 0
jtag_nsrst_delay 200
jtag_ntrst_delay 400
reset_config trst_and_srst
#reset_config srst_only srst_pulls_trst
#daemon_startup attach
daemon_startup reset
target xscale big reset_init 0 ixp42x
run_and_halt_time 0 30
target_script 0 reset ixp42x.actions
flash bank cfi 0x50000000 0x1000000 2 2 0
working_area 0 0x800000 0x100000 nobackup
#################################################################
ixp42x.actions的内容如下:
#################################################################
#-----------------beginxscale-olimex-ipx42x.actions-----------------------------
# openocd rev 728 - flash writing
wait_halt
#set big endian mode
reg XSCALE_CTRL 0xF8
#setup expansion bus CS#0, write enable, @0x50000000
#mww 0xc4000000 0xbcd23c42
mww 0xc4000000 0xbd113c42
#setup expansion bus CS#1, write enable, @0x51000000
mww 0xc4000004 0x80000002
flash probe 0
# 32 MB, CAS3
#mww 0xcc000000 0x00000018
# 64 MB, CAS2
#mww 0xcc000000 0x00000002
# 64 MB, CAS3
mww 0xcc000000 0x0000000A
### disable refresh
mww 0xcc000004 0x00000000
### nop
mww 0xcc000008 0x00000003
#######sleep 60
### set refresh value
#mww 0xcc000004 0x0000081a
mww 0xcc000004 0x00000412
### precharge all
mww 0xcc000008 0x00000002
sleep 20
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000001
mww 0xcc000008 0x00000006
sleep 200
# map SDRAM to 0x00000000
mww 0xc4000020 0x00fffffe
sleep 200
mww 0x800000 0xFEED
sleep 2000
mdw 0x800000
sleep 6000
#################################################################
假设3个文件都已经复制到H:\project\learning2\jtag\openjtag\ixp>,其中debug_handler.bin在H:\project\learning2\jtag\openjtag\ixp\xscale文件夹下。另外openocd-ftd2xx.exe运行正常
进入H:\project\learning2\jtag\openjtag\ixp>,在命令行下输入openocd-ftd2xx.exe应该得到如下显示。
H:\project\learning2\jtag\openjtag\ixp>openocd-ftd2xx.exe
Open On-Chip Debugger (2008-06-19 19:00) svn: 717
URL:http://svn.berlios.de/svnroot/repos/openocd/trunk
Info: options.c:50 configuration_output_handler(): jtag_speed: 0, 0
Info: options.c:50 configuration_output_handler(): Open On-Chip Debugger(2008-06-19 19:00) svn:
717
Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x19277013(Manufacturer: 0x009, Part:
0x9277,Version: 0x1)
Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x19277013(Manufacturer: 0x009, Part:
0x9277,Version: 0x1)
Info: target.c:237 target_init_handler(): executing reset script'ixp42x.actions'
Info: options.c:50 configuration_output_handler(): XSCALE_CTRL (/32): 0x000000f8
Info: options.c:50 configuration_output_handler(): flash 'cfi' found at0x50000000
Info: options.c:50 configuration_output_handler(): 0x00800000: 0000feed
这个时候打开另外一个命令行窗口,首先进入H:\project\learning2\jtag\openjtag\ixp>目录,这样方便以后的操作,然后输入telnet localhost4444应该得到如下显示:
这个基本上就成功了,输入poll,halt等命令查看一下:
和S3C2440不同,IXP425可以在MMU, D-CACHE enable的情况下下载文件到ram里面。当然这些操作必须是IXP425 halt的时候。链接s3c2440的时候,可以用arm920t命令,如arm920t cp15 2 0,但是操作IXP425的时候使用的是xsclae cp15 2 0.
依次输入flashprobe 0, flash info 0参看信息。
> flash probe 0
flash 'cfi' found at 0x50000000
> flash info 0
#0: cfi at 0x50000000, size 0x01000000, buswidth 2,chipwidth 2
#0:0x00000000 (0x20000 128kB) protection state unknown
#1:0x00020000 (0x20000 128kB) protection state unknown
#2:0x00040000 (0x20000 128kB) protection state unknown
………………………………………………………………………………….
#125:0x00fa0000 (0x20000 128kB) protection state unknown
#126:0x00fc0000 (0x20000 128kB) protection state unknown
#127:0x00fe0000 (0x20000 128kB) protection state unknown
cfi information:
mfr: 0x0089, id:0x0018
qry: 'QRY', pri_id: 0x0001, pri_addr: 0x0031, alt_id:0x0000, alt_addr: 0x0000
Vcc min: 2.7, Vcc max: 3.6, Vpp min: 0.0, Vpp max:0.0
typ. word write timeout: 256, typ. buf write timeout:256, typ. block erase timeout: 2048, typ. chip
erase timeout:1
max. word write timeout: 1024, max. buf writetimeout: 1024, max. block erase timeout: 16384, max. c
hip erase timeout: 1
size: 0x1000000, interface desc: 2, max buffer writesize: 5
intel primary algorithm extend information:
pri: 'PRI', version: 1.1
feature_support: 0xce, suspend_cmd_support: 0x1,blk_status_reg_mask: 0x1
Vcc opt: 3.3, Vpp opt: 0.0
protection_fields: 1, prot_reg_addr: 0x80, factorypre-programmed: 8, user programmable: 8
测试dump_image,load_image和write_image。从flash 'cfi' found at 0x50000000可以看出,flash的地址在0x50000000。实际上这块板子的zImage在0x50040000。
> dump_image z140000 0x50040000 0x140000
dumped 1310720 byte in 58.734375s
> load_image zImage_ori 0x0 bin
1219124 byte written at address 0x00000000
downloaded 1219124 byte in 6.953125s
> flash write_image erase zImage_ori 0x50040000bin
Using target buffer at 0x00800038 and of size 0x8000
Write 0x8000 bytes to flash at 0x50040000
Write 0x8000 bytes to flash at 0x50048000
Write 0x8000 bytes to flash at 0x50050000
……
Write 0x8000 bytes to flash at 0x50160000
Write 0x1a34bytes to flash at 0x50168000
wrote 1219124 byte from file zImage_ori in105.250000s (11.311646 kb/s)。
以上的操作证明现在可以完全对IXP425的flash读写,包括下载文件到ram里。
在网上看到mi424wr刷写flash的方法和配置文件。mi424wr的CPU也是IXP425,所以先用mi424wr的试一试。mi424wr的配置文件如下:
openocd.cfg
################################################
daemon configuration
telnet_port 4444
gdb_port 3333
interface ft2232
ft2232_device_desc"Amontec JTAGkey A"
ft2232_layout"jtagkey"
ft2232_vid_pid 0x04030xcff8
jtag_speed 0
jtag_nsrst_delay 200
jtag_ntrst_delay 400
reset_config trst_and_srst
#reset_config srst_only srst_pulls_trst
jtag_device 7 0x01 0x7f 0x7e
#daemon_startup attach
daemon_startup reset
target xscale big reset_init 0 ixp42x
run_and_halt_time 0 30
target_script 0 reset ixp42x.actions
flash bank cfi 0x50000000 0x1000000 2 2 0
working_area 0 0x800000 0x100000 nobackup
################################################
ixp42x.actions
################################################
#-----------------beginxscale-olimex-ipx42x.actions-----------------------------
# openocd rev 728 - flash writing
wait_halt
#set big endian mode
reg XSCALE_CTRL 0xF8
#setup expansion bus CS#0, write enable,@0x50000000
#mww 0xc4000000 0xbcd23c42
mww 0xc4000000 0xbd113c42
#setup expansion bus CS#1, write enable,@0x51000000
mww 0xc4000004 0x80000002
flash probe 0
# 32 MB, CAS3
mww 0xcc000000 0x00000018
# 64 MB, CAS2
#mww 0xcc0000000x00000002
# 64 MB, CAS3
# mww 0xcc000000 0x0000000A
### disable refresh
mww 0xcc000004 0x00000000
### nop
mww 0xcc000008 0x00000003
#######sleep 60
### set refresh value
#mww 0xcc000004 0x0000081a
mww 0xcc000004 0x00000412
### precharge all
mww 0xcc000008 0x00000002
sleep 20
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000004
mww 0xcc000008 0x00000001
mww 0xcc000008 0x00000006
sleep 200
# map SDRAM to 0x00000000
mww 0xc4000020 0x00fffffe
sleep 200
mww 0x800000 0xFEED
sleep 2000
mdw 0x800000
sleep 6000
# Obviously you'll need to change this.I'll leave it enabled...
# DD-Wrt redboot
flash write_image eraserb-mi424wr-ROM-1_joe8.bin 0x50000000 bin
# flash write_image eraserb-mi424wr-ROM_joe4.bin 0x50000000 bin
sleep 2000
shutdown
################################################
使用该配置文件执行报错如下:
Error: ft2232.c:1419 ft2232_init_ftd2xx():unable to open ftdi device: 2
Error: ft2232.c:1434 ft2232_init_ftd2xx():ListDevices: 2
Error: ft2232.c:1436 ft2232_init_ftd2xx():0: USB<=>JTAG&RS232 A
Error: ft2232.c:1436 ft2232_init_ftd2xx():1: USB<=>JTAG&RS232 B
安装了libusb的驱动也没用。这个说明有可能是interface类型配置错误。虽然这个配置文件号称是openjtag的配置文件,但是根据我手上的这个openjtagV3能够用下面的接口配置正确和S3C2440连接,说明应该把接口部分的定义换成下面的;
ft2232_device_desc "USB<=>JTAG&RS232 A"
ft2232_vid_pid 0x1457 0x5118
ft2232_layout "jtagkey_prototype_v1"
另外发现试图写入flash write_image erase rb-mi424wr-ROM-1_joe8.bin 0x50000000 bin,先注释掉再说。还有就是内存是64M的,当时没看清楚,选了CS2。而且当时因为对配置文件的不了解,把
jtag_device 7 0x01 0x7f 0x7e
也改成了从S3C2440配置文件里的
jtag_device 4 0x1 0xf 0xe
再次执行openocd,结果显示如下:
Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x19277013 (Manufacturer:0x009, Part:
0x9277,Version: 0x1)
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IRmismatch, scan retu
rned 0x01
Error: jtag.c:1456 jtag_validate_chain(): Error validating JTAG scan chain, IRmismatch, scan retu
rned 0x01
说明是scan chain和IR mismatch的问题,查找到jtag_device的定义。
#jtag scan chain
#format L IRC IRCM IDCODE (Length, IR Capture, IRCapture Mask, IDCODE)
jtag_device 4 0x1 0xf 0xe
这个看起来还是用cpu端的设置jtag_device 7 0x01 0x7f 0x7e。修改配置文件后执行,执行就完全正确了。
这个时候再用telnet localhost登录,检查,擦除和读取flash大体没有问题。但是下面执行有些问题:
> flash erase_address 0x50040000 0x8000
erased address 0x50040000 length 32768 in 0.812500s
> dump_image z8000blank 0x50040000 0x18000
dumped 98304 byte in 4.421875s
> dump_image z8000blank 0x50040000 0x140000
dumped 1310720 byte in 58.640625s
应该前面0x8000部分的被清除了,而后面部分没有被清除。但是实际上发现z8000blank全是ff,干脆把0x140000全部都出来,看看到底擦除了多少。
发现擦除了0x20000的地址,原因不明。而读取的大小都是按照byte的,所以地址应该没有问题。
因为WRV54G板子的flash可以在0x0出用urjtag读写,而redboot显示是0x50000000。所以在此先试试对P720的0x0地址的读写。
实际发现从0x0读出来的全是垃圾数据。写入的时候报错如下:
> flash write_image erase zImage_ori 0x40000 bin
No flash at address 0x00040000
wrote 0 byte from file zImage_ori in 0.000000s(-1.#IND00 kb/s)
向0x50040000写入的时候发生如下错误:
> flash write_image zImage_ori 0x50040000 bin
Using target buffer at 0x00800038 and of size 0x8000
Write 0x8000 bytes to flash at 0x50040000
timeout waiting for algorithm to complete, trying tohalt target
Execution of flash algorythm failed. Can't fall back.Please report.
error writing to flash at address 0x50000000 atoffset 0x00040000 (-902)
猜测也许是写保护,用flash protect 0 0 127 off命令去掉写保护也不行。试着加上erase项:flashwrite_image erase zImage_ori 0x50040000 bin,还是不行。
网上找到资料,提示屏蔽working_area。于是去掉配置文件的working_area,果然能够写入flash,而且读取出来验证是正确的,但是非常的慢,当然比wiggler还是快不少。后来仔细查看了working_area的说明,如下所示:
working area <target#> <address><size> <backup|nobackup> Specifies a working area
for the debugger to use. This may be used to speed-updownloads to target memory
and flash operations, or to perform otherwiseunavailable operations (some coprocessor
operations on ARM7/9 systems, for example). The lastparameter decides whether the
memory should be preserved (<backup>) or cansimply be overwritten (<nobackup>).
这个应该是使用内存了,而想起片选似乎不对,赶紧修改配置文件,将片选改成CS3。重新启动openocd,终于可以快速烧录flash了。但是奇怪的是,即使是配置文件的片选写错了,一样可以用load_image把文件load到内存里。
试验了一下往0x50000000的位置写入redboot文件报错,不能成功,往别的地方写入不报错。
> flash write_image rb07be.bin 0x50000000 bin
Using target buffer at 0x00800038 and of size 0x8000
Write 0x8000 bytes to flash at 0x50000000
timeout waiting for algorithm to complete, trying to halt target
Execution of flash algorythm failed. Can't fall back. Please report.
error writing to flash at address 0x50000000 at offset 0x00000000 (-902)
而且更严重的是,烧录失败以后,redboot被破坏掉,无法启动。而且用openjtag再也无法halt目标板。
多次试验无法解决,在100ask上询问了南方大哥thisway.diy,南方大哥提供一个脚本,和以前用的脚本有一个区别:ft2232_layout"jtagkey"。本来我的脚本上写的是
#ft2232_layout "jtagkey_prototype_v1"
这个jtagkey_prototype_v1是随着openjtag买来的时候的光盘里的,而且用jtagkey_prototype_v1也确实能够正确调试S3C2440板子。所以深信不疑。将
ft2232_layout "jtagkey_prototype_v1"
改为
ft2232_layout "jtagkey"
之后,基本上不出现不能halt目标板的问题,而且也能向0x50000000的位置写入flash,但是发现一个问题,就是写入不正确。后来再次询问南方大哥thisway.diy,得知下面的命令不能安全清除flash:
flash write_image rb07be_noinfo.bin 0x50000000 bin
必须加上erase,先自动清除flash才可以。
flash write_image erase rb07be_noinfo.bin 0x50000000bin