|
本帖最后由 djcash 于 2012-10-1 13:37 编辑
今天上论坛看到一位朋友给了我一份wr740 的UBOOT就想着找法子来刷到路由里,结果悲剧了,现在正在使用编程器恢复中,利用这时间给大家写个过程让大家以后不再犯和我一样的错误
第一首先判断UBOOT,或者各分区是否加锁也就是在编译固件中有定义MTD_WRITEABLE的
比如说- static struct mtd_partition tl_wr740n_parts[] = {
- {
- <FONT color=red>.name = "u-boot",
- .offset = 0,
- .size = 0x020000,
- .mask_flags = MTD_WRITEABLE,
- </FONT>}, {
- .name = "kernel",
- .offset = 0x020000,
- .size = 0x100000,
- }, {
- .name = "rootfs",
- .offset = 0x120000,
- .size = 0x2d0000,
- }, {
- .name = "art",
- .offset = 0x3f0000,
- .size = 0x010000,
- }, {
- .name = "firmware",
- .offset = 0x020000,
- .size = 0x3d0000,
- }, {
- .<FONT color=red>name = "fullflash",
- .offset = 0,
- .size = 0x400000,
- .mask_flags = MTD_WRITEABLE,</FONT>
- }
复制代码 红色的部分就是分区进行了写保护,如果编译固件的时候做了这样的写保护就不能在Openwrt的命令行下进行刷写(也就是SSH或者TELNET)
判断方法很简单
使用wget或者是TFTP下下载UBOOT.bin到/tmp下
然后执行
mtd -r write xxxx.bin u-boot
如果提示
写入保护的话那你的Uboot就已经写保护了必须通过TTL的方式来写入
如果提示成功,那就重启路由以后就可以了,大多数固件在编译的时候Uboot都是写保护的
下面来说说TTL的方式写入Uboot或者其他分区
首先你可以看看你的分区情况
登陆终端(SSH或者TELNET)
执行
cat /proc/mtd- root@WM150R:~# cat /proc/mtd
- dev: size erasesize name
- mtd0: <FONT color=red>00020000 </FONT><FONT color=blue>00010000</FONT> "u-boot"
- mtd1: <FONT color=red>000dd8e0 </FONT><FONT color=blue>00010000</FONT> "kernel"
- mtd2: <FONT color=red>006f2720 </FONT><FONT color=blue>00010000</FONT> "rootfs"
- mtd3: <FONT color=red>00130000 </FONT><FONT color=blue>00010000</FONT> "rootfs_data"
- mtd4: <FONT color=red>00010000 </FONT><FONT color=blue>00010000</FONT> "art"
- mtd5: <FONT color=red>007d0000 </FONT><FONT color=blue>00010000</FONT> "firmware"
复制代码 可以看到以上分区列表
红色部分是分区大小,其实我们要知道的很简单一个带有Uboot的编程器固件的组成其实就是Uboot+firmware+Art=编程器固件
Uboot的大小大家都知道是128k也就是0x20000
art的大小是0x10000
如此也就得出了
编程器固件 - Uboot - art =firmware的大小,用winhex可以从编程器固件中提取出firmware然后再WEB里升级或者刷机( 有点废话很多人都知道)
说了很多理论上的东西主要还是让大家灵活应用,不要照抄网上的方法,导致我今天的错误。
ttl刷FLASH的时候首先要记住一些地址,也就是FLASH的起始地址
普通的uboot一个是 0x9f000000开始
ubnt是 0xbf000000 开始
有了这个就可以计算出各分区在FLASH中的位置
比如说Uboot 在普通的Uboot命令中的位置就是0x9f000000 - 0x9f020000这一段
art在普通uboot中的位置就是 0x9f000000 + 0x20000 + firmware的大小 然后一直到 0x9f000000 + 0x20000 + firmware +0x10000(不知道这么说大家会明白没有)
下面就实例说明下
1、进入ttl查看信息
比如在 WR740的TTL下刷新Uboot
上电直接在键盘输入TPL终止uboot启动
在uboot下键入printenv
可以看到
serverip 192.168.1.100 (可能其他的Uboot不一样)
现在把你需要刷的分区固件放到TFTP的同目录下面然后开启开启TFTP32
2、载入固件到路由内存
在uboot命令行键入 tftpboot 0x80000000 *****.bin
然后等待固件载入路由内存
3、清楚要刷新的分区
然后使用erase清除需要刷新的分区
注意上图中的红色框中的大小
我们的uboot的大小是0x20000所以如果是刷新uboot的时候红色框框中的大小应该是20000所以命令应该是
erase FLASH起始地址 +需要刷新的固件大小,由此得出命令应该如下
erase 0x9f000000 +0x20000 注意这个加号一定要的具体命令参数可以看
http://www.doc88.com/p-98941639479.html
4、写入要刷新的分区
然后写入Uboot 也就是内存复制
命令方式
cp.b 源地址 目的地址 大小
所以这里应该输入
pb.b 0x80000000 0x9f000000 0x20000
当然原地地址也是可以计算的,比如TFTPBOOT载入估计爱你到的时候你的固件不是Uboot,而是一个完整的编程器固件的话
源地址计算方法也和分区计算的起始地址是一样的
5启动路由
命令方式
bootm FLASH地址(这里具体还没弄明白是刷新的地址还是firmware的地址)一般我用下面这个命令就OK了
bootm 0x9f020000
如果启动正常表示你已经刷新完成了,
如果刷新firmware,或者ART命令方式一样不通的是计算出来的地址和大小而已。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|