使用urjtag了解WRV54G

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


目          录

使用urjtag了解WRV54G.. 1

实验环境... 1

WRV54G路由器配置... 2

硬件部分... 2

核心部分... 3

接口部分... 3

并口wiggler3

软件部分... 4

安装linux版本的urjtag. 5

在虚拟机中添加并口... 5

调试WRV54G.. 8

读取信息和flash. 9

写入flash. 11

安装windows版本的urjtag. 13

安装libusb和ftd2xx.dll13

urjtag控制usb openjtag. 13

需要注意的事... 13

Windows版本的urjtag运行错误... 13

Flash地址的问题... 13

板子对urjtag的支持... 14

 

 

实验环境

u  WRV54G路由器 IXP425 266Mhz 32M ram 8M flash

u  FC4

u  Windows XP sp3

u  libusb-win32-filter-bin-0.1.12.2.exe

u  CDM 2.04.16 WHQL Certified

 

 

WRV54G路由器配置

硬件部分

当前的电路板编号为WX5715_V02。其中一个类似的图片如下,只是flash芯片和无线网卡有所不同:

核心部分

IXP425 266Mhz

32M SDRAM(芯片型号etronTech的em639165TS-6G,两片)

8M flash(芯片型号intel JS28F640 J3D75,一片)

关于IXP425,有资料有如下说明

Thehardware is operating in big endian mode. This is contrary to most ARM systemswhich run in little endian mode. The reason is that the IXP NPEs are onlyusable in big endian. The Intel access libraries do not support little endianmode.

 

接口部分

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

TTL可以利用特殊电路和串口通信

JTAG口

WAN: One 10/100 RJ-45 port for Cable/DSLModem

LAN: Four 10/100 RJ-45 switched ports

以太网phy芯片为DELTA LFE8731

交换芯片为KS8995MA

 

并口wiggler

       使用很多软件如jflash等都不能调试IXP425,其中有份资料上提到IXP425也许要求ntrst和nsrst能独立控制。但是使用urjtag并不需要这两个管脚独立。

本实验中使用的wiggler电路图如下:

 

 

 

软件部分

       WRV54G路由器使用openrg linux, bootloader是rg bootloader。rg bootloader提供一些简单的命令。分区如下:

OpenRG boot>flash_layout

Flash layout:

 

Section 00 TypeBOOT       Range 0x00000000-0x00100000MaxSize 0x00100000

        No more information.

 

Section 01 TypeIMAGE      Range 0x00100000-0x00800000MaxSize 0x006FFF6C

        Size 0x0049C260 Name 'IMAGE'

        Checksum 0x261AF47F Counter 0x00000001 Start Offset 0x00000000

 

Section 02 TypeIMAGE      Range 0x00800000-0x00F00000 MaxSize 0x006FFF6C

        Uninitialized.

 

Section 03 TypeFLASH_SECT_BOOTCONF Range 0x00F00000-0x00F20000 MaxSize 0x0001FF6C

        Uninitialized.

 

Section 04 TypeFLASH_SECT_CONF Range 0x00F20000-0x00F40000 MaxSize 0x0001FF6C

        Size 0x00001A8CName 'rg_conf'

        Checksum 0x000D37FE Counter 0x00000014Start Offset 0x00000000

 

Section 05 TypeFLASH_SECT_CONF Range 0x00F40000-0x00F60000 MaxSize 0x0001FF6C

        Size 0x000019F4 Name 'rg_conf'

        Checksum 0x000CF119 Counter 0x00000013Start Offset 0x00000000

 

Section 06 TypeFACTORY    Range 0x00F60000-0x00F80000 MaxSize 0x0001FF6C

        Size 0x0000021F Name 'Image downloaded from:tftp://192.168.1.10/usr8200_default'

        Checksum 0x0000A23E Counter 0x00000008 Start Offset 0x00000000

 

可以看到已经被分成了7个区。

 

安装linux版本的urjtag

urjtag有windows版本的linux版本的,官方网站是http://urjtag.org/.下载urjtag-0.10.tar.bz2,解压到/home/linuxuser/urjtag。

 

输入如下命令

#cd /home/linuxuser/urjtag

#./configure--with-includes

#make; makeinstall

安装完之后如果是root登录,读取flash得到的文件保存在root目录下。可以在jtag下输入“shell pwd”看到当前目录。

 

在虚拟机中添加并口

如果使用的Linux是安装在虚拟机中,只需要在虚拟机里把并口添加进去就好了。

1. 在VMàsettingsàhardware里点击add

2. 出现add hardware窗口,点击parallel port

3. 选择use physical parallel port on the host, 点击next

4. 选择LPT1,点击finish,就可以在vmware里面启动linux并且使用并口了。

 

 

 

 

 

调试WRV54G

       在终端输入jtag命令,屏幕显示如下

 

UrJTAG 0.10#1502

Copyright (C)2002, 2003 ETC s.r.o.

Copyright (C) 2007,2008, 2009 Kolja Waschk and the respective authors

 

UrJTAG is freesoftware, covered by the GNU General Public License, and you are

welcome tochange it and/or distribute copies of it under certain conditions.

There isabsolutely no warranty for UrJTAG.

 

WARNING: UrJTAGmay damage your hardware!

Type"quit" to exit, "help" for help.

 

jtag>

读取信息和flash

       使用detect和detectflash命令检查硬件,detectflash的用法是detectflash addr。WRV54G的flash应该位于0x0,但是实际上detectflash 0x5000000一样能检查出来。

 

jtag> detect

IR length: 7

Chain length: 1

Device Id:00011001001001110111000000010011 (0x0000000019277013)

  Manufacturer: Intel

  Part(0):         IXP425-266MHz

  Stepping:    B0

  Filename:    /usr/local/share/urjtag/intel/ixp425/ixp425

 

jtag>detectflash 0

Queryidentification string:

        Primary Algorithm Command Set andControl Interface ID Code: 0x0001 (Intel/Sharp Extended Command Set)

        Alternate Algorithm Command Set andControl Interface ID Code: 0x0000 (null)

Query systeminterface information:

        Vcc Logic Supply Minimum Write/Erase orWrite voltage: 2700 mV

        Vcc Logic Supply Maximum Write/Erase orWrite voltage: 3600 mV

        Vpp [Programming] Supply MinimumWrite/Erase voltage: 0 mV

        Vpp [Programming] Supply MaximumWrite/Erase voltage: 0 mV

        Typical timeout per single byte/wordprogram: 64 us

        Typical timeout for maximum-sizemulti-byte program: 128 us

        Typical timeout per individual blockerase: 1024 ms

        Typical timeout for full chip erase: 0ms

        Maximum timeout for byte/word program:256 us

        Maximum timeout for multi-byte program:1024 us

        Maximum timeout per individual block erase:4096 ms

        Maximum timeout for chip erase: 0 ms

Device geometrydefinition:

        Device Size: 8388608 B (8192 KiB, 8MiB)

        Flash Device Interface Codedescription: 0x0002 (x8/x16)

        Maximum number of bytes in multi-byteprogram: 32

        Number of Erase Block Regions withindevice: 1

        Erase Block Region Information:

                Region 0:

                        Erase Block Size:131072 B (128 KiB)

                        Number of Erase Blocks:64

 

       使用readmem读取flash。在此之前,可以利用openrg的flash_dump命令打印出flash中的部分内容,和jtag读取出来的对比,判断是否正确。另外注意,只要jtag启动了,那串口就控制不了。

以下是正常启动是利用flash_dump读取0x0-0x800的flash部分内容:

00000000: e1 a0 c000 e3 a0 00 d3  e1 21 f000 e3 a0 00 78  |.........!.....x|

00000010: e3 8000 80 ee 01 0f 10  ee 12 0f 10 e1 a000 00  |................|

00000020: e2 4f f0 04 e3 a0 00 00  ee 0d 0f 10 ee 12 0f 10 |.O..............|

00000030: e1 a0 00 00 e2 4f f0 04  ee 07 0f 17 ee 12 0f 10 |.....O..........|

00000040: e1 a0 00 00 e2 4f f0 04  ee 07 0f 9aee 12 0f 10  |.....O..........|

00000050: e1 a0 00 00 e2 4f f0 04  e3 a0 00 01 ee 0f 0f11  |.....O..........|

00000060: ee 07 0f 9aee 12 0f 10  e1 a000 00 e2 4f f0 04  |.............O..|

00000070: e3 a0 10 2a e3 a023 33  e5 82 10 00 e3 a0 10 00 |...*..#3........|

00000080: e5 9f 30 c8e5 83 10 00  e3 a0 10 03 e5 9f40 c0  |..0...........@.|

00000090: e5 8410 00 e3 a0 0901  e2 50 00 01 12 4f f0 0c |.........P...O..|

000000a0: e5 9f10 b0 e5 83 10 00  e3 a0 09 01 e2 50 00 01  |.............P..|

000000b0: 12 4f f0 0c e3 a010 02  e5 84 10 00 e3 a0 09 01 |.O..............|

000000c0: e2 50 00 01 12 4f f0 0c  e3 a010 04 e3 a0 5008  |.P...O........P.|

000000d0: e5 8410 00 e3 a0 0c 01 e2 50 00 01 12 4ff0 0c  |.........P...O..|

000000e0: e2 5550 01 1a ff fff9  e3 a0 10 01 e5 84 10 00 |.UP.............|

000000f0: e3 a009 01 e2 50 00 01  12 4f f0 0c e3 a010 06  |.....P...O......|

00000100: e5 8410 00 e3 a0 0901  e2 50 00 01 12 4f f0 0c |.........P...O..|

 

因为IXP425是big endian的, 所以要jtag要改成big endian的再读。Readmem的用法是readmem ADDR LEN FILENAME。

输入两条命令:

jtag> endianbig

jtag> readmem0 0x800 54redboot

屏幕打印如下:

jtag> endianbig

jtag>

jtag> readmem0 0x800 54redboot

address:0x00000000

length:  0x00000800

reading:

addr: 0x00000800

Done.

jtag>

 

54redboot是保存内容的文件,是二进制文件,默认在urjtag的安装目录下。内容如下图。

对比发现,两种方法读取的内容是一致的。

 

写入flash

       主要的写入命令是flashmem,在此写入redboot文件。先使用eraseflash命令测试擦除。然后使用flashmem写入预先写好的二进制文件。

 

jtag>eraseflash 0x80000 1

Manufacturer:Intel

Chip: 28F640J3A

 

Erasing 1 Flashblock from address 0x80000

(100% Completed)FLASH Block 4 : Unlocking ... Erasing ... Ok.

 

ErasingCompleted.

 

 

jtag>flashmem 0x80000 linux_red50080000test

Manufacturer:Intel

Chip: 28F640J3A

program:

 

block 4 unlocked

erasing block 4:0

addr: 0x00080000

addr: 0x000807FE

verify:

addr: 0x000807FE

Done.

 

使用eraseflash命令擦除完之后,该部分的内容都变成0x80,可以使用readmem命令读取出来看看。Flashmem默认是写入完成之后再读出来校验一次,当然也可以加入noveirfy选项跳过,如下所示:

jtag>flashmem 0 redboot-ROM.bin noverify

Manufacturer:Intel

Chip: 28F640J3A

program:

 

block 0 unlocked

erasing block 0:0

addr: 0x00000000

 

addr: 0x0001F000

block 1 unlocked

erasing block 1:0

addr: 0x00032000

 

addr: 0x00033000

 

addr: 0x0003D000

 

addr: 0x0003F000

block 2 unlocked

erasing block 2:0

addr: 0x00045422

verify skipped

 

安装windows版本的urjtag

       Windows版本以前需要安装cywin,最新的版本urjtag 0.10已经不需要了。所有的命令操作和linux版本的一样。但是似乎windows版本的还不完善,有读取错误发生。以前需要安装cywin的版本,也许没有这个问题。

      

安装libusb和ftd2xx.dll

urjtag需要另外两个软件才能运行。下载libusb-win32-filter-bin-0.1.12.2.exe,双击安装即可。下载地址为http://sourceforge.net/projects/libusb-win32/files/

再下载CDM 2.04.16 WHQL Certified,下载后得到是一个压缩包,解压后,将\i386\ftd2xx.dll复制到urjtag的安装目录,下载地址为http://www.intra2net.com/en/developer/libftdi

       如果缺少这些软件,urjtag将无法启动。

urjtag控制usb openjtag

       前面讲的都是urjtag使用并口wiggler,实际上也能使用openjtag。openjtag和jtagkey是兼容的。

和并口不同的是cable的选择

 

jtag>cable JTAGkey ftd2xx-mpsse 1457:5118

Connected to libftd2xx driver.

 

       接下来的所有操作和并口的就一样了,不同的是usb的读写速度大概是并口的16倍左右。

 

需要注意的事

Windows版本的urjtag运行错误  

Windows版本的urjtag在使用并口的时候运行不太正常,读取的时候经常随机加入0xD,导致读取错误。而linux版本没有这个问题。

 

Flash地址的问题

       上面提到过可以在0x0开始写入flash,但是如果WRV54G把bootloader成功刷新到redboot后,使用fis list命令可以发现flash的地址变成到了0x50000000,但是实际上物理地址不可能因为换了bootloader而发生改变的。可以测试在0x50000000写入数据,都会报错。

 

jtag> eraseflash0x50080000 1

Manufacturer:Intel

Chip: 28F640J3A

 

Erasing 1 Flashblock from address 0x50080000

 

Erasing Failed.

 

jtag>flashmem 0x50080000 linux_red50080000test

Manufacturer:Intel

Chip: 28F640J3A

program:

addr: 0x500807FE

verify:

addr: 0x50080000

verify error:

read: 0x0000E1A0

expected:0x0000FFFF

 

       根据资料可以看到,0x50000000是MMU处理之后的地址。

板子对urjtag的支持

并不是所有的板子都能够支持urjtag,即使是linux版本,像板型非常相近的IXP425 P720板,能够支持detect和detectflash,而且显示都是正确的数据,但是读取和写入都会发生错误。读取的时候随机产生错误。每次读取不同长度的flash,可能会发现同样地址的数据读取的一样。举例如下,读取的部分内容是正确的,但是有的是错误的,有的干脆就是FF,而且循环出现。

      

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐