[OpenWrt] 使用TLL刷FLASH(固件)的方法

原文地址:http://www.openwrt.org.cn/bbs/forum.php?mod=viewthread&tid=11567

第一首先判断UBOOT,或者各分区是否加锁也就是在编译固件中有定义MTD_WRITEABLE的
比如说

  1. static struct mtd_partition tl_wr740n_parts[] = {
  2. {
  3. .name = "u-boot",
  4. .offset = 0,
  5. .size = 0x020000,
  6. .mask_flags = MTD_WRITEABLE,
  7. }, {
  8. .name = "kernel",
  9. .offset = 0x020000,
  10. .size = 0x100000,
  11. }, {
  12. .name = "rootfs",
  13. .offset = 0x120000,
  14. .size = 0x2d0000,
  15. }, {
  16. .name = "art",
  17. .offset = 0x3f0000,
  18. .size = 0x010000,
  19. }, {
  20. .name = "firmware",
  21. .offset = 0x020000,
  22. .size = 0x3d0000,
  23. }, {
  24. .name = "fullflash",
  25. .offset = 0,
  26. .size = 0x400000,
  27. .mask_flags = MTD_WRITEABLE,
  28. }
复制代码
红色的部分就是分区进行了写保护,如果编译固件的时候做了这样的写保护就不能在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
  1. root@WM150R:~# cat /proc/mtd
  2. dev: size erasesize name
  3. mtd0: [color=Red]00020000[/color] [color=Blue]00010000[/color] "u-boot"
  4. mtd1: [color=Red]000dd8e0[/color] [color=Blue]00010000[/color]"kernel"
  5. mtd2: [color=Red]006f2720[/color] [color=Blue]00010000[/color] "rootfs"
  6. mtd3:[color=Blue] 00130000[/color] [color=Blue]00010000[/color] "rootfs_data"
  7. mtd4: [color=Red]00010000[/color] [color=Blue]00010000[/color] "art"
  8. mtd5: [color=Red]007d0000[/color] [color=Blue]00010000[/color] "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
[OpenWrt] 使用TLL刷FLASH(固件)的方法_第1张图片 
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命令方式一样不通的是计算出来的地址和大小而已。

你可能感兴趣的:([OpenWrt] 使用TLL刷FLASH(固件)的方法)