查看: 1735|回复: 0
打印 上一主题 下一主题

并口简易MIPS-EJTAG + UrJTAG

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-28 21:31:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#最新修改,图片已上传

记得之前有人发帖,提到如何使用路由器作ARM开发板。不过并不是所有路由器都是ARM的更多的是MIPS平台。 由于自己就是从事这个行业的,所以接触比较多。不过也直到最近才摸索出玩MIPS芯片的方法。内容见下。这个帖还真不知道该放哪,就放AVR吧,我还可以修改的权限。

注:以下内容仅为文字,可以看word格式的附件,图片太多,懒得一个个挑出来再上传了。 哈哈,如果你有MIPS的东西不妨试试。
编译器么,可以用GNU的cross compiler, 商业的greenhill也有。

Wiggler + OCD Commanderourdev_400135.doc(文件大小:1.32M) (原文件名:复件 MIPS_EJTAG.doc)
UrJTAGourdev_400136.doc(文件大小:316K) (原文件名:复件 urjtag.doc)

注意!!!!
to ALL:
      玩这个有风险,请确认你要玩得板子不打算做路由器/adsl猫用了。有可能把device搞死掉。原因是有的CPU的flash控制器需要配置的(大部分芯片不需要配就可以了)。如果你能找到这个CPU的datasheet,那好办,找到EBU初始化那块,在UrJTAG里下命令写好就可以了。 如果找不到资料的芯片你就没办法了,实际上你也没法玩。




A Simple MIPS EJTAG

自从进公司认识了MIPS这种CPU,我就在寻找如何业余使用这种CPU的方法。首先就是需要一个简单的工具能把程序下载进去。公司使用的是LAUTERBACH公司的MIPS Debugger (TRACE32)。据说非常的贵,而且公司只有一台,因此使用的时候都非常小心,严格按顺序上电。于是就上网search了一番,结果只找到一个个人做的,而且是Linux下使用的一个EJTAG。这方面的资料是少之又少。更多的是关于ARM的,想比之下MIPS在国内还没普及。ARM使用最简单的并口wiggler和免费的调试代理配合成本不会超过10RMB(如果JTAG自己做的话)。没有搜到合适资料也就放弃了这个想法。
        后来microchip公司推出了PIC32系列芯片,是MIPS4Kc的核。有幸从做代理的同学那搞到两片。于是又重新想起如何使用MIPS芯片的事了(龙芯也是MIPS的,不过龙芯居然不留EJTAG口,开发人员说他们用示波器+printf)。又上网搜了一番,资料多了些,最后找到一个网站,是关于如何使用商品路由器做开发板的。幸运的是那个开发板的CPU是ADM5120 (MIPS 4Kc)。公司也有很多这个CPU的产品。通过那个网站我又幸运的找到了更多的资料。但是好多都是针对特定CPU的。找到这些资料后由于东西比较杂,另外工作也比较忙,也没急着去尝试。最近空余时间又仔细翻了翻IE收藏夹里关于MIPS EJTAG的内容,另外又在网上找了找资料。发现一个比较通用的简易并口wiggler, 电路和ARM中通用的wiggler几乎一样。而且可以在一个商业公司发布的一个免费软件上使用。这才决定去做一个。昨天晚上回到公司宿舍直到1点才把这个小东西做出来。
这个是从那个开发板网站上找到的MIPS Wiggler的图:
http://wiki.openwrt.org/OpenWrtD ... Hardware/JTAG_Cable

(原文件名:clip_image001.jpg)

                还有这个,ARM的wiggler图:

(原文件名:clip_image002.jpg)

这两个图有很多相似之处,我把这两个整合起来做出一个即支持MIPS又支持ARM的 wiggler:
  

(原文件名:clip_image003.jpg)


(原文件名:clip_image004.jpg)

                这个wiggler用了一块总线驱动芯片74LVC244

(原文件名:1.JPG)
                做好后试了下ARM的功能,是好的。用H-JTAG软件可以detect到我的AT91SAM9260板子。也可以下载AT91SAM7S256这些自带flash的小型arm芯片。
                第二天早上到公司,占用点上班时间,就迫不及待试了下昨晚的成果。正好手上的XXXXXX(虽然这不是工作要做的事情,属于自己的研究,但是这里还是去掉产品型号,请谅解)的板子焊有14pin的EJTAG口。结果是1个小时就搞定了,在同事的帮助下设置好CPU的SDRAM寄存器,成功地把bootext(公司产品程序的一段)  load到SDRAM中运行起来。自己把整个flash毁掉,让板子彻底起不来,然后写好脚本,load特定的bootext,再试试。 哈哈,可以顺利运行,进bootext后把bootbase烧到flash, 接着板子就又可以用了。

                接下来介绍下控制这个wiggler的软件:OCD Commander
这是个免费软件。官方网址:http://www.macraigor.com/ocd_cmd.htm
这个软件有Windows 和 Linux两个版本。我下载了常用的Windows版本。文件大小不到8M (相比TRACE32 500多M要苗条多啊)。下载安装后(PS:需要java virtual machine的支持)在桌面上会有这几个图标:

(原文件名:2.JPG)
其中OCD Commander就是我们想要的。 OCD Commander – Java是OCD Commander的Java版本。

打开OCD Commander

(原文件名:3.JPG)
如上图,这里可以选择处理器(MIPS),调试用的接口(Wiggler), Wiggler是插在PC的并口上用的,所以需要选择并口号(LPT1)。速度我们选择最快的380KHz。 图中的Multiple是选择多个CPU的。这个暂时没有试过。

点击OK进入主程序:


(原文件名:4.JPG)
很简单的一个界面,提供的功能也比较简单。中间的文字说明了命令的简单规则。 上面的菜单按钮是一些常用的功能。如reset,step,go,halt,regs等。 最下面的是输入命令的地方。这里可以读写一些寄存器,内存等。具体可以看help里的帮助文档。

把板子的电源打开,Wiggler的14pin线要正确插在板子的JTAG口上。一切准备好,可以电reset按钮

(原文件名:5.JPG)
如果板子里有程序,点击go就可以看到串口输出的信息。按halt可以暂停CPU的运行。
点cpu可以看到cpu的PC值,还有PC指向地方的值及汇编指令:

(原文件名:6.JPG)

点regs可以看到32个通用寄存器的值:

(原文件名:7.JPG)

在Commands菜单下有更多的命令:


(原文件名:8.JPG)

比如重要的memory命令
这样我们可以更改内存或者外设寄存器的值,比如:

(原文件名:9.JPG)
这样我们可以通过这些命令初始化一些外设寄存器,比如SDRAM控制器的寄存器,使SDRAM可以使用这样我们就可能下载程序到SDRAM然后从SDRAM运行,进而实现bootbase(相当于bootloader)的烧写。

还有Download命令。


(原文件名:10.JPG)
可喜的是这个软件直接支持elf文档(这样我们就不必费心东西会download到哪片空间):

(原文件名:11.JPG)

Download一个bootext的elf文档到SDRAM中 (前提是SDRAM初始化好了):


(原文件名:12.JPG)
Download完后:

(原文件名:13.JPG)
可以看到PC被自动设置到elf的起始地址。

接下来可以按go运行试试看了。(注这里的bootext.elf是修改过的特定elf,一般的bootext.elf会读取flash中的内容,而flash没有初始化会出现exception)
哈哈,可以正常运行了:

(原文件名:14.JPG)

关于SDRAM的初始化,一个一个的去敲命令会很麻烦。还好这个软件支持script
就是这个菜单  

(原文件名:15.JPG)
我们把要执行的命令写成一个文件,后缀为.mac就可以了。规则也很简单。直接按照command里的命令写就可以了:


(原文件名:16.JPG)
整个MIPS EJTAG的使用就是这样。是不是很简单。简单的硬件,简单的软件。不再需要昂贵的ICE,庞大的TRACE 32。当然功能也不是太全。但是这个已经能满足我们的要求了。

关于ARM,推荐一个用ARM都知道的软件:H-JTAG
这是国内牛人twentyone开发的一个ARM开发工具。支持简易的wiggler,支持自定义jtag口。目前支持arm7,9还有最新的cortex-M3核。(要是有一天支持MIPS就好了。)H-JTAG还有RDI接口,可以跟流行的keil(MDK), IAR等ARM开发软件软件配合做调试用。跟随H-JTAG一起开发的还有H-Flasher,可以直接烧写flash。功能不比收费的软件差。


        希望这个可以为大家提供点帮助。
        谢谢!
bozai
章其波


A Simple MIPS EJTAG(续)
--flash烧写工具 UrJTAG
前面介绍了MIPS简易wiggler制作,和控制软件OCD Commander的使用。提到了通过OCD Commander把bootext.elf下载到CPU SDRAM中然后从运行bootext烧写bootbase的方法。方法倒是不错,也和用ICE烧bootbase的方法类似,不过需要写专门的bootext还有SDRAM的初始化脚本。毕竟OCD Commander不是设计成烧写flash的。OCD Commander的开发公司同时还开发了一款软件用于写flash的,但是,它是要付费的(网上有破解版的,不过感觉不好用)。H-Flasher可以烧写ARM系列的,MIPS系列,还有其它种类的就不行了。 有没有可以直接烧写各种处理器的免费flash软件?
当时在找到OCD Commander这个软件的时候,同时也注意到openwince这个开源项目。 但是到注意到这个工程在几年前就停止了维护。并且是基于linux下的命令行工具,界面不是太友好。所以就没有尝试。后来自己尝试烧写IXP425(XSCALE)的时候,H-JTAG不支持,OCD Commander连不上。所以只好到网上找了些资料。结果发现几乎都是捆绑在开发板上一起卖的。找不到合适。不过在一篇比较老的文章上找到了一个,就是用上面提到的openwince里的jtag项目烧写的。于是试着下载看看。找了很多资料,比较不错的是这个软件支持cygwin环境。这样至少不需要用linux操作系统。经过尝试可以下载IXP425板子的flash了。 Openwince这个项目停止维护,不过发现开发者另建了个工程:UrJTAG
http://urjtag.sourceforge.net/
这是它的描述信息:
UrJTAG aims to create an enhanced, modern tool for communicating over JTAG with flash chips, CPUs, and many more. It takes on the well proven openwince jtag tools code. Future plans include conversion of the code base into a library that can be used with other applications. A flexible remote communication protocol that can be used over almost any type of serial link (including TCP/IP) is currently being defined

虽然这个项目正式更新不是很快,不过论坛很活跃。Trunk的更新很频繁。有好几家大的芯片厂商的工作人员在参与。看看都支持哪些芯片:

(原文件名:17.JPG)
并不是没个厂家所有芯片都支持,但是常用的芯片这里都有,这已经很多了。
“书”归正传,下面介绍如何用这个东西。



首先PC上要装上cygwin(假定你的PC是装了windows,linux就不用了)。
Cygwin的官方网址是www.cygwin.com 在国内的镜像是www.cygwin.cn
有一点要注意的是通过官方网站可以下到最新的,不过需要网络的支持。Cygwin也挺大,最新的有400M左右。如果网络不错可以选在这种装发。我建议使用网上找的iso文件。Iso一般要到1.5G的,因为里面的软件不止一个版本。我这里有去年下的一个版本2007924 release的,需要的可以到我这copy。
        Cygwin的setup文件很小。只有500多K。打开后有个选择:

(原文件名:18.JPG)
这里可以选择安装方式。最下面的是从本地安装。
还有一个重要的地方是这里:

(原文件名:19.JPG)
这里建议选择成INSTALL(点击那两个箭头),这样所有的组件都会被安装,也就是功能最全的了。接下来就是漫长的安装时间,大概要40分钟左右。


Cygwin装完了,接下来安转UrJTAG:
下载代码:
1.        可以从http://urjtag.sourceforge.net/上下载最新的压缩包
2.        用SVN check out出最新的版本。(可以得到最新的功能,但是可能有稳定性问题。简单说就是测试版)
SVN地址是:https://urjtag.svn.sourceforge.net/svnroot/urjtag/trunk/jtag
不需要用户名密码,支持匿名访问。
最新的version是1334 如果没有装SVN工具可以到我这边copy,压缩后大小只有2M多。顺便说一下SVN工具在这里下:http://subversion.tigris.org/ser ... entList?folderID=91

        下载好源代码后(注意是源代码哦,需要编译才能用)。打开cygwin (cygwin安装好后桌面上有图标的 )
(原文件名:20.JPG) 。 进入到源代码/压缩包所在的地方。 如果是压缩包则先解压。可以用:tar –xvjf xxxx.bz2 或者 tar –xvzf xxxx.gz (取决于你的压缩包类型)。然后就可以编译了:

        对于压缩包类型的,可以下这些依次下这些命令:
./congigure
make install
这样就可以安装完成了。我碰到一个错误,是一个类型重定义。碰到这个问题直接找doa源文件把定义删除即可。

        对于是Trunk上的code,可以下如下命令:
                ./autogen.sh
                make install
要注意的是。我从trunk上拉下来的code都被转换成dos格式的了,也许trunk本来就是这样或者svn工具没配制好。 这样在cygwin下编译就会有问题。Cygwin默认对待文本都是按照UNIX格式来的。所以这里要修改注册表八cygwin改成dos模式。方法如下:
http://hi.baidu.com/smst/blog/item/e7e54d4af3eaa32108f7ef7d.htm
修改注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2\...\cygdrive flags。 cygdrive flags是一个DWORD值,&0x2 == 0x2 为 Unix Style,否则为 Dos like style。
设置环境变量 CYGWIN, 使得在 pipe 等模式下的处理方式:export CYGWIN=nobinmode
Build到最后会有一个错误,至少在我的cygwin下会出现。这个是因为需要特定版本的cygwin中的程序支持。不过不影响使用。可以试着启动程序来检验:
敲jtag:
如果有下面的信息就可以了:

(原文件名:21.JPG)
        注意:build完后记得要把cygwin的模式改回到unix模式。

        这样UrJTAG算是顺利装完了。不过在用之前要打开cygwin的IO直接控制功能。就是输:ioperm –i 就可以了。这样UrJTAG才能访问端口。
        接下来把wiggler插在PC并口,找一块带JTAG的板子,通上电。先试下IXP425 (BSR252)的板子。
        在cygwin下输jtag 进入程序。
        先选择下载线:cable WIGGLER parallel 0x378
0x378是计算机的并口地址。这个可以通过察看你的设备管理器中并口的资源属性:

(原文件名:22.JPG)
        操作成功会有如下提示信息:

(原文件名:23.JPG)

        接下来用detect命令:


(原文件名:24.JPG)
可以看到检测到芯片了,芯片id: 0x9277013. 是266MHz版的IXP425芯片。

        然后用detectflash命令来检测flash芯片:
命令detectflash 0x0
这里的0x0是flash所在的地址。有的板子可能放在第二片存储空间0x50000000.

(原文件名:25.JPG)
成功检测到flash芯片。 可以看到flash的指令集是AMD的。 工作电压的要求。 擦除时间。容量,块信息(8个8K,127个64KB的块)等。 这些都是透过flash的CFI命令得到的。

        用读命令readmem:
命令格式 readmem <addr> <size> <filename>


(原文件名:26.JPG)
打开文件看看是不是bootbase:


(原文件名:27.JPG)  
可以看到这个,不过顺序有点乱,仔细看看是swap后的:“bootbase Version”。这就意味着烧写的时候要作swap后烧进去才对。

        peek命令:
格式:peek <addr>
用来读一个地址空间的值。我们先读flash首地址的值吧:

(原文件名:28.JPG)

        试试擦写命令:
格式eraseflash <addr> <blocknumber>
擦除从addr开始的locknumber块flash.


(原文件名:29.JPG)
接下来看看是不是被擦了。再用peek命令看下内容:

(原文件名:30.JPG)
擦除成功,已经从EA00变成FFFF了。

        写flash命令:
格式:flashmem <addr> <filename>
写filename的东西到addr地址。前面知道需要swap,所以要在cygwin下用命令修改:
格式: dd if=before_swap.bin of=after_swap.bin conv=swab
找一版最新的bootbase转换完后就可以烧写了:
Note:这个命令会自动擦除,所以实际上我们可以直接用这个命令而不需要手动擦除响应得块。
        BSR252的flash有128K,整个烧完要半小时左右。这里我就不等了。对于一般的小bootbase,四五分钟还是能忍的(即使是半小时也比吹下来重烧快啊~)。可以看下命令:

(原文件名:31.JPG)
对BSR252的研究算是结束了。这里提一些碰到的问题。我拿到的板子上面的flash的WP引脚是悬空的。这个脚是低电平有效。这样的结果是这颗IC的前两个block是不允许擦除的。所以一开始除了这两块其它块都可以操作。一开始以为是用高电压的方式保护住了,吹下来用HW的烧写器去保护后还是不行,最后才在datasheet上找到一行小字:

(原文件名:32.JPG)
为了这个害得我好苦啊。以为这个软件有问题。以致于自己去修改这个软件重新添加整片的擦除的命令,结果偏偏这两个block不能擦除。 最后发现这个问题,rework后就一切正常。奇怪的是这个板子没rework之前是如何用的。这不等于bootbase每次换前两个block 16KB的东西一直都不能变了。
Note:后来确认,IXP425有GPIO可以控制这个写保护。


再来看看其它的芯片:
G1000V2
这个板子用的是ADM5120芯片,就是网上很多人玩的那块。那个wiggler也是专门为这个做的。Flash芯片时MX29LV160CBT, bottom型的。

先detect:


(原文件名:33.JPG)
奇怪的是居然显示Unknown manufacturer
到网站上找了下,原来这个id:0x0000001太简单了。不好分类需要手工制定是哪颗芯片。 哈哈原来可以指定。用include命令。
这里自带的这个文件有个问题,它是小端格式的,你需要手动改成大端。包括后面用的都是大端格式。

(原文件名:34.JPG)
可以看到是2.6版本的EJTAG口。
路径是cygwin下user/local/share/urjtag下的路径。
下面有个错误,不过暂且不理了,看看能不能工作先。
检测一下flash:


(原文件名:35.JPG)
可以检测到。
注意地址是0x3fc00000. 我们知道MIPS启动是从0xbfc00000启动的。所以这里用0x3fc00000。1fc是8bit地址,5fc是32bit。 3fc就是我们flash的16bit

看,还可以检测到这么详细的block信息:

(原文件名:36.JPG)


        接下来读bootbase看看:
结果数据很奇怪:

(原文件名:37.JPG)
有规律的重复。

仔细研究研究,发现这个:

(原文件名:38.JPG)
如果研究过flash就知道flash有一个CFI Query的命令。它的标志字就是QRY。所以可以判断这是后flash还在CFI Query的命令里没退出,所以就出现这些重复的数据。所以我们要手动加入命令推出CFI Query状态。那就是flash的reset命令:向任意flash地址写0xf0
如下图:

(原文件名:39.JPG)
可以看到前后的差别。这里用的命令是poke命令,和peek相反。

这下再读就可以了,可以说这应该是个bug。


再来看下AR7的板子,芯片是TNET7200

(原文件名:40.JPG)
一连上detect会是这个信息。Hitachi的,名字叫AR7300,不知道和TI的TNET7300是什么关系。但是这个肯定是错的,连不上。 所以我们不能使用这个配置。修改的方法是,修改usr/local/share/urjtag下的manufacture文件把HITACHI的那一行注释掉,这样它就不会自动去使用那个错误的文件。然后在detect会出现unkonw manufacture。 接着我们就用include命令打开admtek/adm5120/adm5120就可以成功连上了。

(原文件名:41.JPG)
可以检测到芯片了。这块板子芯片的bootbase也是保护的。我试着擦除。只有bootbase没有擦掉,总共16K,应该是和IXP425的板子一样的情况。另外7300跟7200是一样的。

还有Trendchip的板子。P660HW-T1 V2
Detect一下

(原文件名:42.JPG)
只有Manufacturer的信息: Lexr
不错这款芯片的核应该就是从lexra授权过来的。
既然是一家公司,那么找这家公司的其它芯片代替吧。
用include lexra/lx5280/lx5280
  
(原文件名:43.JPG)
成功连上了。Flash芯片也可以检测到。能检测到就可以对它读写的。

(原文件名:44.JPG)
最后一块XXXX (最新未上市产品,用XXX代替)的板子XXXX 就是上次用OCM Commander下程序的那块
  
(原文件名:45.JPG)
也是没有匹配的型号了。我们还是用admtek/adm5120/adm5120来代替:

(原文件名:46.JPG)
可是找不到芯片,显示一个dev ID=3c08
对比这个信号bootbase的内容发现这个是bootbase的第一个字的值。这样就使说可以读flash里面的内容。只是发的一些命令不认识。 这让我想起了,用OCDCommander脚本里的一个内容,就是设置flash是否swap的配置。如果做了swap配置那么实际送到flash的命令并不是想要的。英此我们要手动设置一个寄存器的值。

(原文件名:47.JPG)
哈哈,这样就可以访问这个flash了。
另外这颗也需要手动在detect后作一下复位,不然还是会停留在CFI模式下

接着完整的烧一遍bootbase. 完全可以。24K的烧写速度应该和用console烧写ras一样。


做了这么多试验。发现只要找到合适的替代芯片。或者直接可以找的到的。可以成功连起来,通过一些设置可以读到flash的信息就可以对flash进行编成。这个软件会自动识别芯片的信息,然后根据信息作操作。

        另外就是,这个软件太强悍了。


Good Luck
Michael Zhang
章其波
2008-08-29







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表