硬改WRT54GL

收拾垃圾的时候捡到了一个WRT54GL(v1.1),也是许多年前一代神机了。接电试了下,工作正常,家里现在还一直用的是刚上大学的时候买的WRH54,正有换个路由玩玩的意思,所以心想拿这个先体验下OpenWRT好了。
插电,笔记本连上,是官方固件。直接尝试admin:admin登陆进了路由的系统,从web界面直接刷backfire 10.03.1。OpenWRT不是不能跑,只是折腾起来不够随心所欲。拆开机壳看了下,具体参数为:博通的BCM5352EKPBG,8M RAM (winbond W9412G6JH-5),4M flash (MXIC MX29LV320EBTI-70G)。网上一搜,RAM和FLASH都有升级的潜力。守着偌大的一个实验室,我们开始淘宝拾荒吧。

先是升级RAM(比较简单,就不配图了)。
需要找DDR 1代内存一根,开始翻了几天,找到的都是DDR2的,以及……SDRAM的……。好不容易翻出一个DDR 333的,颗粒是8bit的HY50DU12822CTP。其实兼容芯片很多,最重要的要求是TSOP 66pin封装,16 bits位宽。怎么也找不到合适的芯片,都动了上淘宝上买一个的念头,不过想到捡到路由时候给自己订下的原则就是反正是捡来的,不准备为它花一分钱(喂),于是就算了。后来去IT那边翻箱倒柜,居然找出了两条hynix 512M的DDR 333内存(双面每面4颗64MB颗粒)。颗粒是HY5DU121622AT-J(16表示它是16bit,前面说的那个22CT前面的提到的那个型号里标红色的8表示它是8bit),连忙拆下来换到板子上。中间找芯片连硬盘和旧FPGA板子都没放过,虽然有兼容芯片但是容量比这个还惨ORZ。
换芯片没啥好说的,直接拆下来,新的放上去就行。一支烙铁就能换,不过这个板子比较厚,有大面积的地,好像还是无铅焊接?所以烙铁温度要高一些,大概390度比较合适。有热风焊台也行,不过旁边紧挨着就是电容,先要用高温胶带贴了才好。
放大镜下面检查一下,没有虚焊没有连焊。上电。OpenWRT里直接认出了32M。ssh连进去,敲命令
nvram set sdram_init = 0×0113
nvram set sdram_ncdl = 0×000000
nvram commit
断电再上电。进入Luci,已经认出来颗粒上全部64M了。RAM搞定。网上也有搜到的命令里是0×0013,印象里dd-wrt的论坛上有人问过这两个有人么区别,下面的人回复说不要在意这些细节……

然后是改flash。
换芯片前要备份flash的数据。下载libusb-win32,我下的是libusb-win32-bin-1.2.6.0.zip,从bin里找对应的架构(amd64),然后运行install-filter-win.exe,找到j-link,换驱动。软件用的是brjtag v2.05。手里有几个以前上大学时候用的j-link,直接拿来接线,VCC,GND,然后是四根JTAG通讯线TDO,TDI,TMS和TCLK。JTAG的接法:
硬改WRT54GL_第1张图片
路由那边的接法:
硬改WRT54GL_第2张图片

开始j-link拿成了v7的,可以正常用-probeonly参数,但是试图读取flash数据的时候会报“SB Port R/W error occur! Please reduce buffer size with /L5:1000 and try again.”,换成v8就没有问题了。顺便说一句,j-link的dll版本是4.15n。
brjtag -probeonly /cable:2,结果如下
硬改WRT54GL_第3张图片

然后备份cfe和全片(应该至少是要备份cfe,MAC地址啥的可在里面呢。我备份了三次,每次cfe的hash都不一样……备份了两次全片得出来的数据也不一样,不过直接刷回去好像没啥问题,上网的时候经常断线(之后发现,自己非常2的把配置成192.168.1.1的WRT54GL连到了192.168.1.1的自用路由上,如果是10.03的系统的话网络根本就没法用,如果是12.09就会时不时断线,后来把WRT54GL换到了192.168.2的网段下就好了)。后来改用zjtag v1.7(/cable:6)读取数据,读出来的各种cfe、nvram、kernel、wholeflash校验出来都是一致的。)
如果不走jtag备份的话可以通过ssh连路由,然后用命令
cat /proc/mtd
找出cfe,比如
dev: size erasesize name
mtd0: 00040000 00020000 “cfe”
然后用命令
dd if=/dev/mtd0 of=/tmp/cfe.bin
(网上有的写成了mtd/0,不一定,OpenWRT10.03的话就要加斜杠,12.09就不要)
这样备份出来的bin和用jtag备份出来的一样。写入的数据再读出来,和原先写入的数据的hash是一样的。回写的时候OpenWRT要重新编译内核才能支持mtd的写入,不能直接mtd write,网上那个rwflash.o也没有效果。所以还是用jtag写回去吧。
准备工作完成。
WRT54GL用的是并行的Flash,不像那种8-pin的串行Flash那么好找。在实验室里翻了个底儿掉都没有找到pin-to-pin可以直接替换的型号,只找到几块旧板子上有Spansion的S29GL128N11TF1V1,TSOP56封装,不能直接装在TSOP48的封装上。但是如果做一下引脚的位移,基本上和原芯片可以兼容。PCB上共画了两个TSOP56和两个TSOP48。根据搜索的结果,有人成功用上了S29GL064A90TFIR40(8M)和S29GL128P(16M)。也可以找到一张用Intel TE28F128J3(16M)的图(都在这个帖子里)。28F128J3是直接焊在了UC3的位置(最右边的TSOP56上)。结合已有芯片、28F128J3的datasheet和万用表的测量,得出了以下表格:
硬改WRT54GL_第4张图片

先拆焊,再把S29GL128N从3脚到26脚,31脚到54脚直接焊在之前芯片的位置上,接下来需要飞A21、A22和Vio(接VCC)三根线。根据表上给出的数据找到最近的引脚,飞过去(地址线飞线也可以参见封面)。替换完成。
硬改WRT54GL_第5张图片

上电,JTAG可以看到新的芯片的信息。
硬改WRT54GL_第6张图片

直接写保存的FLASH数据回去(速度非常慢,4MB的数据写了至少20分钟,zjtag写入wholeflash到2%到3%的时候会报和DMA有关的错误,如果单写CFE倒是没有问题,用brjtag写不会有错误提示,可能是没错误或者就彻底没校验。所以我用brjtag写了带10.03系统的全片,然后再写入改动后的CFE,进去之后刷12.09)。重上电,正常启动。硬件部分的主要改动就完成了。可以用WRTCFE改CFE里nvram set sdram_init,值改为0×0113,对应64M内存,这样重启后不用再敲命令了。

然后去openwrt下了attitude adjustment 12.09的固件,.bin不能直接用于升级,参考openwrt image conversion。于是在linux虚拟机下用dd 处理一下固件,进行验证,再通过luci的网页界面进行升级。完成,可以看到剩余的FLASH空间是12M+。
硬改WRT54GL_第7张图片
一分钱没花,收工~

备注:TFTP刷机说法众说纷纭,没有尝试。不过全片flash写入确实非常慢……关于TFTP刷机短接的说法,因为芯片种类很多(有说5、6脚,有说15、16脚的),因此做个笔记:在接通之前,flash输出使能OE#接地,再上电。此说法未经实测。

你可能感兴趣的:(嵌入式,硬件hack)