恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
当贝投影
查看: 15193|回复: 21

小米路由器3 U-Boot TTL 恢复及一些注意事项

  [复制链接]
发表于 2018-3-5 21:37 | 显示全部楼层 |阅读模式
本文原发于我的博客 https://blog.ysc3839.com/archive ... 3-ttl-recovery.html

TTL 连接路由器的方法大同小异,就直接略过。这里只讲一些注意事项。

默认情况下 TTL 是不可输入的
如果你不做任何设置,直接连上 TTL,会发现按什么都没反应。需要修改 nvram 开启。
官方/Padavan 固件下执行:
  1. nvram set boot_wait=on
  2. nvram set uart_en=1
  3. nvram commit
复制代码

OpenWRT 固件下执行:
  1. fw_setenv boot_wait on
  2. fw_setenv uart_en 1
复制代码

uart_en 开启后才可以输入。
boot_wait 开启后会在 Please choose the operation: 这里等待 5 秒。
一般情况下刷其他固件前就会先设置这个选项,避免刷坏后无法恢复。

官方固件的闪存布局
  1. 0x000000000000-0x000000040000 : "Bootloader"
  2. 0x000000040000-0x000000080000 : "Config"
  3. 0x000000080000-0x0000000c0000 : "Bdata"
  4. 0x0000000c0000-0x000000100000 : "Factory"
  5. 0x000000100000-0x000000140000 : "crash"
  6. 0x000000140000-0x000000180000 : "crash_syslog"
  7. 0x000000180000-0x000000200000 : "reserved0"
  8. 0x000000200000-0x000000600000 : "kernel0"
  9. 0x000000600000-0x000000a00000 : "kernel1"
  10. 0x000000a00000-0x000002a00000 : "rootfs0"
  11. 0x000002a00000-0x000004a00000 : "rootfs1"
  12. 0x000004a00000-0x000008000000 : "overlay"
复制代码

上面的十六进制数字都是对应闪存中的位置,单位为字节。
kernel0 kernel1 rootfs0 rootfs1 分别为两个系统,是为了防止其中一个损坏的。
官方 U-Boot 会根据 nvram 中几个变量来选择启动哪一个 kernel。具体规则可见 这里 (这里针对的是小米路由器 3G,不过实测是一样的)

TTL 恢复
和大多数路由器的操作相同,启动时 U-Boot 会提示选择操作:
  1. Please choose the operation:
  2.    1: Load system code to SDRAM via TFTP.
  3.    2: Load system code then write to Flash via TFTP.
  4.    3: Boot system code via Flash (default).
  5.    4: Entr boot command line interface.
  6.    9: Load Boot Loader code then write to Flash via TFTP.
复制代码

选择 2 ,按提示操作即可
  1. 2: System Load Linux Kernel then write to Flash via TFTP.
  2. Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)
  3. Please Input new ones /or Ctrl-C to discard
  4.         Input device IP (192.168.1.1) ==:192.168.1.1
  5.         Input server IP (192.168.1.3) ==:192.168.1.3
  6.         Input Linux Kernel filename () ==:
复制代码

最后的 filename 为 TFTP 服务器上的文件名。
前面提到了闪存布局,在这里有用:U-Boot 会先把下载来的数据写到闪存的 0x200000 位置 (也就是 kernel0),再把数据写到 0x600000 位置 (kernel1)。
这样的话,就变成了 kernel0 和 kernel1 数据是相同的。不能实现 kernel0 和 kernel1 写入不同的数据。
另外,小米官网提供的固件不能通过 U-Boot 直接刷入,因为它是有特定格式的文件,要解包后才能得到实际能写入的文件。

构造一个可以通过 U-Boot 刷入的文件
OpenWRT
小米路由器 3 的 OpenWRT 固件一般为一个 kernel 文件,一个 rootfs 文件。

从上面的闪存布局可算出 kernel0 和 kernel1 的大小都是 4MB,所以把 kernel 文件补满 4MB,后面接上 rootfs 文件就可直接刷入。

假设有 kernel.bin 和 rootfs.bin,执行下列代码:
  1. dd if=/dev/zero bs=4M count=1 | tr "\000" "\377" > padded_kernel.bin
  2. dd if=kernel.bin of=padded_kernel.bin conv=notrunc
  3. cat padded_kernel.bin rootfs.bin > kernel_rootfs.bin
复制代码

刷入 kernel_rootfs.bin 即可。

Padavan
从 Prometheus (用来刷固件的虚拟机里的脚本) 这个脚本中可以看到,Padavan 是把固件写到 kernel1 的位置并往后覆盖的,所以可以直接刷入 Padavan 的固件文件。

小米官方固件的恢复模式
许多教程会讲到小米路由器的恢复模式。就是路由器红灯闪烁的时候,插入 U 盘按 Reset 键可以恢复官方固件。我以前曾认为这是 U-Boot 提供的功能,但是通过 TTL 输出的信息来看这是官方固件内核中 initramfs 的功能。
也就是说,如果没有官方固件的内核的话,就没有这个功能了。这也是为什么 OpenWRT 和 Padavan 都不修改 kernel0,因为这样可以直接进入官方固件的恢复模式,然后刷回官方固件。
同时也意味着,用上面 U-Boot 的方法刷入的话,不会包含官方内核,也就无法使用这个功能了。
也因为有这个功能,如果你一开始备份了官方固件中每个 mtd 的数据,那 U-Boot 刷入 mtd8 或 mtd9 就可以进入恢复模式了。
进入恢复模式还有个条件: nvram 中 flag_try_sys1_failed flag_try_sys2_failed 的值都为 1。
在前面提到的提示选择操作的时候,选择 4,然后执行:
  1. setenv flag_try_sys1_failed 1
  2. setenv flag_try_sys2_failed 1
  3. saveenv
复制代码

即可修改这两个变量。

评分

参与人数 2恩山币 +3 收起 理由
ago + 2 面对这种帖子,我内心复杂,真不知道说什么好……
尼玛死 + 1 率全体恩山路由党以及党魁向你学习!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
发表于 2018-3-6 09:43 | 显示全部楼层
问下,如果只有TTL如何备份u-boot
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2018-3-6 10:20 | 显示全部楼层
醉老仙 发表于 2018-3-6 09:43
问下,如果只有TTL如何备份u-boot

不能备份,得先刷一个系统进去,在系统内备份。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2018-3-6 16:45 来自手机 | 显示全部楼层
我看看。。。。。。。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2018-3-7 13:47 | 显示全部楼层
完全看不懂
我的恩山、我的无线 The best wifi forum is right here.
发表于 2018-4-16 15:31 | 显示全部楼层
楼主你好,我想请教一下ttl 怎么接的  一直没有找到这些资料
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2018-4-17 00:00 来自手机 | 显示全部楼层
bilibbb 发表于 2018-4-16 15:31
楼主你好,我想请教一下ttl 怎么接的  一直没有找到这些资料

TTL RX 接 路由器 TX
TTL TX 接 路由器 RX
TTL GND 接 路由器 GND
VCC 不用接
我的恩山、我的无线 The best wifi forum is right here.
发表于 2018-4-17 21:22 | 显示全部楼层
ysc3839 发表于 2018-4-17 00:00
TTL RX 接 路由器 TX
TTL TX 接 路由器 RX
TTL GND 接 路由器 GND

谢谢了 一直没有看你的回复,自己链接成功了 现在彻底砖头了,貌似boot loader掉了,现在链接上电源lan,wan灯之久就亮了,led等没有任何反应,ttl链接上也没有输出了
我的恩山、我的无线 The best wifi forum is right here.
发表于 2018-5-10 11:04 | 显示全部楼层
我的boot 就还在, 呵呵, 直接TTL 修复了kernel 。我的小米3 活了
我的恩山、我的无线 The best wifi forum is right here.
发表于 2019-6-12 18:51 | 显示全部楼层
兄弟高手啊,你的意思是刷了padavan以后,要想恢复官版,只需要按照u盘强刷官版的方法即可恢复了?意思是老毛子的脚本是padvan刷在1上面的,0分区依然可用,依然保留官版强刷的功能,对吧。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2019-6-12 19:00 | 显示全部楼层
请问已经刷了padavan固件的mi-r3,如何开启uart_en和boot_wait?

点评

一楼提到官方/Padavan 固件下执行nvram,其实是没用的,这点可以比较nvram commit前后的BootEnv分区MD5Sum得知 Padavan的BootEnv分区包含官方的Config+Bdata分区,u-boot变量存放于Config前0x1000字节,最前面是  详情 回复 发表于 2019-6-13 03:32
我的恩山、我的无线 The best wifi forum is right here.
发表于 2019-6-13 03:32 | 显示全部楼层
ago 发表于 2019-6-12 19:00
请问已经刷了padavan固件的mi-r3,如何开启uart_en和boot_wait?

一楼提到官方/Padavan 固件下执行nvram,其实是没用的,这点可以比较nvram commit前后的BootEnv分区MD5Sum得知

Padavan的BootEnv分区包含官方的Config+Bdata分区,u-boot变量存放于Config前0x1000字节,最前面是个Little Endian CRC32,PROMETHEUS's start-99.sh 脚本就是把算好的Config刷回去,其实PROMETHEUS还提供修改过的官方u-boot,也就保证可以从串口登陆u-boot,一旦刷回官方固件时,只要不刷名称包含 "_all_" 的官方固件,那就不会重刷u-boot

Replace MI-R3's stock U-Boot with PROMETHEUS's which permanently enables serial console / UART.
  1. cd /tmp
  2. wget http://pm.freize.net/scripts/loki.tar
  3. tar -xvf loki.tar uboot/mips/profiles/xiaomi_mi-3/
  4. cd uboot/mips/profiles/xiaomi_mi-3/
  5. md5sum -c uboot.md5 && mtd write uboot.bin Bootloader && mtd verify uboot.bin Bootloader
复制代码

Padavan之下请改成
  1. md5sum -c uboot.md5 && mtd_write write uboot.bin Bootloader
复制代码

官方固件/OpenWrt 可再执行以下脚本,而Padavan则不支持fw_setenv/fw_printenv
  1. cat << EOF >fw_env.script
  2. boot_wait on
  3. uart_en 1
  4. ssh_en 1
  5. telnet_en 1
  6. flag_try_sys1_failed 1
  7. flag_try_sys2_failed 0
  8. flag_last_success 1
  9. flag_boot_rootfs 1
  10. EOF
  11. fw_setenv -s fw_env.script
复制代码

安装PandoraBox则必须改
  1. flag_try_sys1_failed 0
  2. flag_try_sys2_failed 1
  3. flag_last_success 0
  4. flag_boot_rootfs 0
复制代码
否则必须把官方u-boot换成pb-boot

最後要注意的是官方固件和Padavan不锁闪存分区,而OpenWrt/PandoraBox则只能修改包含固件的分区,所以最好在刷第三方固件以前便改好Bootloader和Config分区

点评

大佬在吗,ttl接小米路由器3,不通电的时候,secure通过串口连接是可以连接的,但是界面是空白。路由器通电后,就网线接口一个灯是亮的,其他都不亮。secure的页面还是空白。长安reset通电也是一样的,这种情况怎么  详情 回复 发表于 2019-12-18 15:46
ago
兄弟高手啊,感觉有点懵逼。  详情 回复 发表于 2019-6-13 07:02
我的恩山、我的无线 The best wifi forum is right here.
发表于 2019-6-13 07:02 | 显示全部楼层
fyi2000 发表于 2019-6-13 03:32
一楼提到官方/Padavan 固件下执行nvram,其实是没用的,这点可以比较nvram commit前后的BootEnv分区MD5Su ...

兄弟高手啊,感觉有点懵逼。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2019-12-18 15:46 | 显示全部楼层
fyi2000 发表于 2019-6-13 03:32
一楼提到官方/Padavan 固件下执行nvram,其实是没用的,这点可以比较nvram commit前后的BootEnv分区MD5Su ...

大佬在吗,ttl接小米路由器3,不通电的时候,secure通过串口连接是可以连接的,但是界面是空白。路由器通电后,就网线接口一个灯是亮的,其他都不亮。secure的页面还是空白。长安reset通电也是一样的,这种情况怎么办
我的恩山、我的无线 The best wifi forum is right here.
发表于 2019-12-18 15:47 | 显示全部楼层
大佬在吗,ttl接小米路由器3,不通电的时候,secure通过串口连接是可以连接的,但是界面是空白。路由器通电后,就网线接口一个灯是亮的,其他都不亮。secure的页面还是空白。长安reset通电也是一样的,这种情况怎么办
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )|网站地图

GMT+8, 2022-1-24 14:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表