使用openjtag和openocd操作IXP425的flash

来源:互联网 发布:java培训班包住 编辑:程序博客网 时间:2024/05/16 19:03

使用openjtag和openocd操作IXP425的flash

早年写的笔记,压箱底了,翻出来晒晒


目          录

使用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

 

 

P720路由器硬件配置

核心配置

IXP425 266Mhz

2片32M SDRAM,nanya NT5SV16M16BS-6K 片选CS3, 基地址0x0。

16M FLASH, intel TE28F128J3C150。CFI地址为0x50000000。

接口部分

电源为POE供电,但是也有一个单纯的电源接口。

JTAG口

串口

一个以太网口IXP0

phy片为KS8721B

两个mini PCI插槽

 

 

在windows下安装openjtag和openocd

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

使用OpenOCD、OpenJTAG 烧写程序

准备配置文件

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

 

#################################################################

 

用JTAG连接到IXP425

假设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.

操作IXP425的flash

 

依次输入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里。

 

IXP425 flash的摸索

对比修改配置文件

在网上看到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

 

错误修改jtag_device配置

说明是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的,所以地址应该没有问题。

写入flash的错误

       因为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,halt time out以及写入flash数据出现错误

       试验了一下往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

 

原创粉丝点击