加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:22:59 所属栏目:百科 来源:网络整理
导读:原文地址:http://www.openwrt.org.cn/bbs/forum.php?mod=viewthreadtid=11567 第一首先判断UBOOT,或者各分区是否加锁也就是在编译固件中有定义MTD_WRITEABLE的 比如说 static struct mtd_partition tl_wr740n_parts[] = { { .name = "u-boot", .offset = 0

原文地址: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,serif; font-size:12px; line-height:1.8em"> .size = 0x020000,serif; font-size:12px; line-height:1.8em"> .mask_flags = MTD_WRITEABLE,
  5. },{
  6. .name = "kernel",
  7. .offset = 0x020000,serif; font-size:12px; line-height:1.8em"> .size = 0x100000,serif; font-size:12px; line-height:1.8em"> .name = "rootfs",serif; font-size:12px; line-height:1.8em"> .offset = 0x120000,serif; font-size:12px; line-height:1.8em"> .size = 0x2d0000,serif; font-size:12px; line-height:1.8em"> .name = "art",serif; font-size:12px; line-height:1.8em"> .offset = 0x3f0000,serif; font-size:12px; line-height:1.8em"> .size = 0x010000,serif; font-size:12px; line-height:1.8em"> .name = "firmware",serif; font-size:12px; line-height:1.8em"> .size = 0x3d0000,{
  8. .name = "fullflash",serif; font-size:12px; line-height:1.8em"> .size = 0x400000,serif; font-size:12px; line-height:1.8em"> }
复制代码
红色的部分就是分区进行了写保护,如果编译固件的时候做了这样的写保护就不能在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

图像 1.jpg

?
2、载入固件到路由内存
在uboot命令行键入 tftpboot 0x80000000 *****.bin
然后等待固件载入路由内存

2.jpg

? 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命令方式一样不通的是计算出来的地址和大小而已。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读