原文链接:http://scarygliders.net/2010/02/23/hacking-around-the-japanese-buffalo-wzr-hp-g300n/
修复自己的AG300H的时候又查询到了这篇文章,觉得真的有必要翻译过来(翻译的不好希望不要见怪)。也方便一下国人,感觉国内关于buffalo的文章好少啊。
[题外话]乱入一张Philipp Klaus童鞋的AG300H的TTL针脚定义图(需要登上长城技能),这也让我好找一番,在Google翻了良久才找到这么一张,果然还是国外的友人折腾的东西多啊,不过又是因为在picasa网络相册,又要出塞一番才能得到想要的东西。顺便鄙视一下百度,全球最大的中文搜索引擎,对中文以外的东西就完全是个渣渣啊。
~~~~~~~~~~~~~~~~~~~~~~~~下面才是正文(大量节选)~~~~~~~~~~~~~~~~~~~~~~~~~~
blah blah blah blah (原文中真的好多废话,看来作者是个爱表达自己感情的人)
- 准备好Serial连接(USB到TTL小板自己买,TTL定义上面有了)
- 上电
接下来你会看到一串提示消息,我没有留下来,就直接用原文的(注意我用的是AG300H,而原文中用的是G300NH注意其不同)
BUFFALO U-BOOT Ver 1.02 AP83–539 (ar9100) U-boot 0.0.12 64 MB Memory Test (address line) Memory Test start(0×00000000) end(0×04000000) size(67108864) Data line test start:0×00000000 pattern 0×00000001 0×00000003 0×00000007 0x0000000F 0×00000005 0×00000015 0×00000055 0xAAAAAAAA Address line test start:0×00000000 len:0×4000000 pattern 0xAAAAAAAA 0×55555555 Fill test patnum:5 fill Pattern 5555AAAA Writing… Reading… fill Pattern AAAA5555 Writing… Reading… fill Pattern 0000FFFF Writing… Reading… fill Pattern FFFF0000 Writing… Reading… fill Pattern AAAAAAAA Writing… Reading… Top of RAM usable for U-Boot at: 84000000 Reserving 250k for U-Boot at: 83fc0000 Reserving 256k for malloc() at: 83f80000 Reserving 44 Bytes for Board Info at: 83f7ffd4 Reserving 36 Bytes for Global Data at: 83f7ffb0 Reserving 128k for boot params() at: 83f5ffb0 Stack Pointer at: 83f5ff98 Now running in RAM – U-Boot at: 83fc0000 Dev ID2:2222 Name: AMD-SPANSION Flash id: 0x1227E, Size: 33554432 bytes. Flash: 32 MB In: serial Out: serial Err: serial Memory Test uboot use 83F5FFB0 – 84000000 Memory Test start(80000000) end(83F00000) size(03F00000) Pattern 00000000 Writing… Reading… Memory Test OK ### buf_ver=[1.02] U-Boot Ver.=[1.02] ### build_date(env)=[Feb 16 2009 - 10:47:08] build_date(bin)=[Feb 16 2009 - 10:47:08] ag7100_enet_initialize… : cfg1 0xf cfg2 0×7114 rtl8366sr_phy_setup eth Unit=0 Realtek 8366SR switch ID 0×8366 Realtek Greeen Ethernet Setup eth0: 02:aa:bb:cc:dd:1a eth0 up : cfg1 0xf cfg2 0×7114 eth1: 02:aa:bb:cc:dd:1a eth1 up eth0 02:AA:BB:CC:DD:1A , eth1 02:AA:BB:CC:DD:1A Trying eth0 tftp server(receive) go, waiting:4[sec]
在这地方按Ctrl+c来中断启动进程
之后就会进入命令提示符
ar7100>
到了命令行就是真正的开始了,当然还有其他的很多功能,不过这里只说最主要的进程。
- 查看自己的机器的可用地址
ar7100> printenv
然后你能看到一大串字符,类似的Linux的系统变量。
bootargs=console=ttyS0,115200 root=31:03 rootfstype=jffs2 init=/sbin/init mtdparts=ar9100-nor0:256k(u-boot),128k(u-boot-env),1024k(uImag) bootdelay=4 baudrate=115200 ethaddr=02:AA:BB:CC:DD:1A tmp_ram=81F00000 tmp_bottom=83F00000 fw_eaddr=BE060000 BFFDFFFF uboot_eaddr=BE000000 BE03FFFF u_fw=erase $fw_eaddr; cp.b $fileaddr BE060000 $filesize; bootm BE060000; ut_fw=tftp $tmp_ram firmware.bin; erase $fw_eaddr; cp.b $fileaddr BE060000 $filesize; bootm BE060000; ut_uboot=tftp $tmp_ram u-boot.bin; protect off $uboot_eaddr; erase $uboot_eaddr; cp.b $fileaddr BE000000 $filesize; melco_id=RD_BB08009 hw_rev=0 tftp_wait=4 uboot_ethaddr=02:AA:BB:CC:DD:1A DEF-p_wireless_ath0_11bg-authmode=psk DEF-p_wireless_ath0_11bg-crypto=tkip+aes DEF-p_wireless_ath0_11bg-authmode_ex=mixed-psk custom_id=0 buf_ver=1.02 build_date=Feb 16 2009 – 10:47:08 pincode=51560850 DEF-p_wireless_ath0_11bg-wpapsk=0bm5ujdb4d884 buf_crc=22625AFC mtdids=nor0=ar9100-nor0 bootcmd=bootm 0x81f00000 region=JP bootm=0xbe060000 ipaddr=192.168.1.99 serverip=192.168.1.9 stdin=serial stdout=serial stderr=serial loadaddr=81F00000 ethact=eth0 Environment size: 1160/131068 bytes
要注意的是 “tmp_ram=81F00000”和“bootm=0xbe060000”,这里定义的是你可以用的地址,以及系统启动时读取的地址,别写到其他的地方去,否则会出问题。而且请对照着自己的机器给出来的信息,而不是照抄文中的,当然,如果是原版的G300NH的话可以这样做。
我的AG300H的tmp_ram是84000000,bootm是0xbf060000(双Flash)。
另外要注意的就是
ipaddr=192.168.1.99 serverip=192.168.1.9
这两个,一会儿用tftp传固件的时候会用到,当然,这也是可以用“setenv”来修改的,改成你自己想要的也可以,这个应该就是原作者该过的,我的是自己ip是192.168.11.1,服务器地址是192.168.11.2。
- 在电脑上做一个tftp服务器,然后让路由从电脑上下载固件。
当然也是有其他的办法的,不过既然你都来看这个文章了,就是需要我给你指明一条简单的路了,至少我用的是这种方法,你要喜欢折腾的话甚至可以通过串口线来下载固件……
在执行这个命令之前你可以尝试在路由上ping一次电脑,路由会告诉你通不通,若通,就会告诉你is alive,不通的话,会告诉你说is not alive。别在电脑上ping路由,就uboot那小系统,根本不会对电脑的ping包做出任何反应。
ar7100> tftpboot 81f00000 wzrg300nh-firmwareM.tftp
注意这里的81f00000就是之前让记下的tmp_ram的地址,别写到其他的地方去,会出现点奇怪的事件的,就单片机这小系统是没有内存保护的。
下载完成之后(在这里非常不推荐cisco出品的一个老版的tftp服务器,非常吃CPU,效率也低),下一步就是
- 检查固件
不知道是不是所有日版的buffalo路由都是这样,反正我是遇到了,Bad Magic Number。
最后选择了一个systemupgrade版的固件通过测试了。
如果顺利的话,就会输出固件的信息,就像这样的
ar7100> iminfo ## Checking Image at 81f00000 … Image Name: DD-WRT v24 Linux Kernel Image Created: 2010-02-03 14:14:55 UTC Image Type: MIPS Linux Kernel Image (lzma compressed) Data Size: 1017569 Bytes = 993.7 kB Load Address: 80002000 Entry Point: 802cd000 Verifying Checksum … OK ar7100>
如果没有,那么你可以选择找到其他的固件继续试,或者像原文一样直接去改固件的内容。
- 清空flash
这一步不是非做不可(大概,我看见openwrt在首次启动的时候会将末尾标记后面的Flash全部清空,格式化,所以应该没有问题),不过还是做一下会比较稳妥。
简单地使用
ar7100> erase all
来清空flash,不过在此之前你要先保证没有做过其他奇怪的事比如说去掉flash开头几个区块的保护,不然就等着用JTAG来修复。如果一路上都是照着教程而没有做其他事情的话就放心地用清空所有,因为重要的区块都是有保护的。
- 将固件写到flash中
这一步比其他类型的路由要麻烦一点,因为这是需要手动来完成的
ar7100> cp.b 81f00000 be060000 a64000 Copy to Flash… Copy 10895360 byte to Flash… 100% done ar7100>
这一步的内容我是照抄的,并且表示跟我的稍微有点不一样,而且和网络上的资讯有点不一样。
根据我的亲身经历和网络上的资讯来看,cp.b应该是“字节”,即你在Windows上看见的那个文件大小,应该不会有“a”这样的字符。详情的请自己试试吧。
- 启动系统(openwrt,ddwrt)
这里可以简单的使用
ar7100> boot
来完成操作,因为固件位置在默认的地方。之后就是一大串文字,系统启动的内核信息之类的,完成之后你的openwrt或是ddwrt就跑起来了,之后怎么折腾,就是你自己的事了。
打完收工~