原文地址:http://www.openwrt.org.cn/bbs/forum.php?mod=viewthread&tid=11567
第一首先判断UBOOT,或者各分区是否加锁也就是在编译固件中有定义MTD_WRITEABLE的
比如说
判断方法很简单
使用wget或者是TFTP下下载UBOOT.bin到/tmp下
然后执行
mtd -r write xxxx.bin u-boot
如果提示
写入保护的话那你的Uboot就已经写保护了必须通过TTL的方式来写入
如果提示成功,那就重启路由以后就可以了,大多数固件在编译的时候Uboot都是写保护的
下面来说说TTL的方式写入Uboot或者其他分区
首先你可以看看你的分区情况
登陆终端(SSH或者TELNET)
执行
cat /proc/mtd 可以看到以上分区列表
红色部分是分区大小,其实我们要知道的很简单一个带有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命令方式一样不通的是计算出来的地址和大小而已。