登录
  • 人们都希望被别人需要 却往往事与愿违
  • Tape is Dead, Disk is Tape, Flash is Disk, RAM Locality is King!@Jim Gray (数据库大牛 图灵奖得主)

小米AX3600救砖

IT Benny小土豆 4421次浏览 3905字 4个评论
文章目录[显示]
这篇文章在 2022年05月05日16:14:00 更新了哦~

天下苦秦久矣!我也因为AX56U痛苦不已。不知道是固件的原因还是什么原因,内网延迟几千毫秒。

小米AX3600救砖

二话不说便出资上闲鱼上淘了一个AX3600。没买AX6000因为6000有些缩水,CPU、闪存都缩水了,背板带宽只有1Gbps。酸奶倒是对这个大家伙有些好奇。

小米AX3600救砖

刷机过程就按照教程来,先降级小米的固件,开SSH,然后刷qdsk,再刷qdsk,然后刷openwrt。看着openwrt没什么问题,我就想着刷自己编译的固件,毕竟自己的固件功能最精简!

编译环境

我用的是这个repo https://github.com/coolsnowwolf/lede

编译这种事,当然要找个多CPU多内存的设备啦。而且当然要用docker啦,毕竟我们只要build artifacts!写一个Dockerfile装好所有工具链,需要的时候commit 一下就好。

这个Dockerfile比较简单,我就不贴出来了。分享一个已经build好的base image,有需要的小伙伴可以自行下载,已经加好了科学上网的源,适合在海外VPS上跑起:

docker pull bennythink/lede
# 或者
docker pull ghcr.io/bennythink/lede

如何使用?直接

docker run --rm -it bennythink/lede bash

然后看steps.txt就好了,构建结束docker cp,或者直接 -v到/lede/bin也可以。

另外我还有一个已经build好了的image,大小是22G,如果你也是AX3600,那么可以拉下来试试,应该编译很快,毕竟不用下载各种依赖

docker pull ghcr.io/bennythink/lede:eff9437-20211101

https://github.com/users/BennyThink/packages/container/package/lede

拆机救砖

刷完自己编译的固件就变砖了,小米救砖工具也没修好……

于是只能买了TTL工具。

先要拆机,AX3600非常不好拆,并且拆机前没有人告诉你底部四角防滑贴纸和说明贴纸下面有螺丝。

准备好TTL工具,我用的是FT232,AX3600左侧有四个口,根据说明分别是VCC,GND,RX,TX。FT232的TX要接路由器的RX,RX要接TX,GND接GND,VCC不接,调到1.8v

小米AX3600救砖

用杜邦线连接就可以

然后电脑这里,如果是macOS/Linux的话,直接用screen就好,通过lsusb/lspci或者系统信息-USB可以看到设备名称,之后将路由器通电开机,执行如下命令就可以了

screen -L /dev/cu.usbserial-A50285BI 115200 –L

Windows 需要用Putty,在设备管理器中确认COM口

进入uboot

正常来说路由器启动后就会进入uboot,默认有5秒延迟,按回车键就可以中断引导,然后就可以进入一个命令行界面救砖啦。

如果screen提示no tty、device busy什么的,可能是杜邦线没插进,再检查看看

准备tftp

macOS自带一个tftp,使用如下命令启动

sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist

把后缀是ubi的nand factory复制到/private/tftpboot中(需要sudo)

停止可以用这个命令

sudo launchctl unload -w /System/Library/LaunchDaemons/tftp.plist

uboot刷分区

配置环境变量

网线连接电脑和路由器LAN,电脑设置IP 192.168.31.100,然后在uboot中执行如下命令

setenv serverip 192.168.31.100
setenv ipaddr 192.168.31.1

加载固件

然后加载固件到内存中

tftpboot 1.ubi

此时能看到屏幕上在走进度条,如果你没走,提示tftp server died或者卡住了,那多半是tftp服务器没配置好。

大概能看到这样的输出:

Load address: 0x44000000

done

Bytes transferred = 31457280 (1e00000 hex)

ipq807x_eth_halt: done

进度条走完之后,会留下一个数字,byte transferred 31457280(1e00000 hex)也就是固件的大小,同时最开始load address还会告诉你固件的起始地址,我这里是0x44000000。这两个数值很重要,要记下来

获取分区信息

smeminfo可以获取分区信息

IPQ807x# smeminfo

flash_type: 0x2

flash_index: 0x0

flash_chip_select: 0x0

flash_block_size: 0x20000

flash_density: 0x100000

partition table offset 0x0

No.: Name Attributes Start Size

0: 0:SBL1 0x0000ffff 0x0 0x100000

1: 0:MIBIB 0x0000ffff 0x100000 0x100000

2: 0:QSEE 0x0000ffff 0x200000 0x300000

3: 0:DEVCFG 0x0000ffff 0x500000 0x80000

4: 0:RPM 0x0000ffff 0x580000 0x80000

5: 0:CDT 0x0000ffff 0x600000 0x80000

6: 0:APPSBLENV 0x0000ffff 0x680000 0x80000

7: 0:APPSBL 0x0000ffff 0x700000 0x100000

8: 0:ART 0x0000ffff 0x800000 0x80000

9: bdata 0x0000ffff 0x880000 0x80000

10: crash 0x0000ffff 0x900000 0x80000

11: crash_syslog 0x0000ffff 0x980000 0x80000

12: rootfs 0x0000ffff 0xa00000 0x23c0000

13: rootfs_1 0x0000ffff 0x2dc0000 0x8000000

14: overlay 0x0000ffff 0xadc0000 0x1ec0000

15: rsvd0 0x0000ffff 0xcc80000 0x80000

16: 0:WIFIFW 0x0000ffff 0xcd00000 0x900000

IPQ807x#

我们需要关注12和13分区的起始和结束地址,这两个非常重要,每个人都可能不同。

由于我搞了双系统(类似Android的A/B分区),因此能看到rootfs和rootfs_1。当前我要刷的分区是13分区。

清除分区内容

保险起见,先给rootfs抹掉,自己对应起始结束地址

nand erase 0xa00000 0x23c0000
nand erase 0x2dc0000 0x8000000

写入固件

写到rootfs_1中,使用nand write命令,这个命令接受三个参数,分别是固件内存地址,分区起始地址,固件大小。对我来说,写到rootfs_1也就是

nand write 0x44000000 0x2dc0000 0x1e00000

写到rootfs就是

nand write 0x44000000 0xa00000 0x1e00000

然后断电开机,就会发现神奇的救回来啦!

后续

之后我想用ubiformat给小米的固件刷到rootfs

ubiformat /dev/mtd12 -y -f /tmp/xiaomi1.1.12.ubi

但是发现刷完无法切换

fw_setenv flag_last_success 0
fw_setenv flag_boot_rootfs 0

使用这个命令切不过去,即使在uboot中nand write似乎也不行。无所谓啦,反正都用openwrt的,并且这个时候在openwrt中刷自己编译的sysupgrade就没问题,可能是我第一次选的是nand-factory所以变砖了吧……

存在的问题

Wi-Fi断流

在我的MBP16上,存在Wi-Fi断流问题,具体表现是Wi-Fi连接信号满格,但是却无法ping通任何地址,关闭Wi-Fi再开才可以。

其他设备没问题,怀疑是MBP16有什么特殊的兼容性问题?

内存泄漏

感觉似乎openwrt存在内存泄漏的问题,什么也没干就剩这么点了。当然我懂,内存这东西用起来了才好,要不然闲置就是浪费,只要尽量少用swap就好,毕竟路由器上的swap那可是闪存,不仅慢还会磨损。

感谢群友指教,openwrt默认开了zram,也就是把内存的一部分拿来压缩用,默认是系统管理大小,于是这里我看到虚拟内存202M,其实就是从RAM中拿出来的。在系统-系统中如果手动指定一个值并重启,上面的内存数值就正常了。

小米AX3600救砖

至少内网几千毫秒的延迟修好了!

参考资料

https://www.right.com.cn/FORUM/thread-6119565-1-1.html

https://www.right.com.cn/forum/thread-5044604-1-1.html

警告:似乎由于什么奇怪的原因,小米设备的支持被删除了,可以看这个commit https://github.com/coolsnowwolf/lede/commit/edbd8d2e9839357f3a4f0a06174d243f362b1544

git reset --hard 20a437026ae6fb7834063dbc56685b11023f06c9 可解决


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/fix-ax3600.html
喜欢 (34)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(4)个小伙伴在吐槽
  1. 必须要用1.8v的电压?通电后拔掉?
    artisan2021-12-15 10:19 回复
    • 要1.8v呀。
      --本评论由Telegram Bot回复~❤️
      Benny小土豆2021-12-15 10:21 回复
  2. 那多半是 tftp 服务器配置好。 少了个(没)字
    johnpoint2021-11-24 10:15 回复
    • 别说,还真是!
      Benny小土豆2021-11-24 14:23 回复