Skip to content

Latest commit

 

History

History
executable file
·
440 lines (397 loc) · 27.2 KB

RAX3000M算力版+RAX3000Z增强版单分区刷机+TTL救砖教程20240405.md

File metadata and controls

executable file
·
440 lines (397 loc) · 27.2 KB

这是一个markdown文件,建议使用markdown软件打开,或直接访问github,打开最新链接:
https://github.com/lgs2007m/Actions-OpenWrt/blob/main/刷机教程

mt798x的fip分区实际上包含bl31+uboot,为了方便理解,这里将fip直接称为uboot。

本教程只使用我基于hanwckf大佬bl-mt798x仓库修改编译的带webui的uboot,固件使用immortalwrt-mt798x仓库的闭源单分区固件。
大雕lean的QWRT也是闭源单分区固件,也可以使用。
ImmortalWrt主线和Openwrt主线的CMCC RAX3000M是all in fit,NAND和EMMC版本合并在一个固件内,bl2、uboot和gpt分区表也不同,uboot没有webui,刷机使用tftp,不在本教程范围内。

ImmortalWrt天灵大佬基于hanwckf大佬bl-mt798x的uboot-202206源码修改,独家添加DHCP支持,也制作了单分区的uboot和gpt分区表,需要的可以下载:
https://firmware.download.immortalwrt.eu.org/uboot/mediatek/
但是我试了RAX3000M eMMC的uboot,不能获取到IP,大家自行尝试吧。
大佬的单分区gpt分区表如下:

Number  Start (sector)    End (sector)   Size Name
     1            8192            9215   512K u-boot-env
     2            9216           13311  2048K factory
     3           13312           21503  4096K fip
     4           90112          131071  20.0M config
     5          131072          262143  64.0M kernel
     6          262144         1490943 600.0M rootfs

为了和主线对齐,增加了一个config分区,fip增加到了4M。
rootfs后面的空间没有使用,需要自行分区然后格式化。

关于mt798x改内存:目前开源ATF 7981 DDR3最高512M,DDR4最高1G;7986 DDR3最高512M,DDR4 2G。

  • 版本识别

CMCC RAX3000M配置是MT7981B+DDR4 512M+MT7976CN+MT7531,有两个版本,区别只在闪存,普通版:128M SPI-NAND闪存,算力版:64G eMMC闪存。
NAND普通版:盒子背部和机子背部标签是“CH”字样,生产日期20230515、20230606、20231027、20231124基本就是,或者透过散热孔看PCB右上角印丝结尾是P3。
eMMC算力版:盒子背部和机子背部标签是“CH EC”字样,生产日期20230626、20230703、20231226基本都是,或者透过散热孔看PCB右上角印丝结尾是P1。

新出的CMCC XR30和RAX3000M配置相同,也分区两个版本,eMMC版包装盒正面印的信息是RAX3000Z增强版,机子正面有全屋组网的标志,背面和顶上有贴纸,底部标签有算力版标识。NAND普通版盒子正面印的是CMCC XR30,机子正面没有全屋组网的标志,背面,顶上都没有贴纸,底部的标签也大一圈,标签上没有算力版的标识。虽然它俩具体型号相同,但是增强版才是eMMC的,CMCC XR30目前看是NAND的。
RAX3000M算力版有三个LED灯,RAX3000Z增强版只有两个。它们的刷机文件互刷也没有问题,只不过LED可能不对。

如果不确定NAND还是eMMC版本,建议解锁SSH后用命令查看分区,看哪个命令输出分区就是哪个版本:

# NAND
cat /proc/mtd
# EMMC
fdisk -l /dev/mmcblk0
  • 准备刷机文件和工具软件

SSH工具软件:Xshell https://pan.lanzoui.com/b0f19ry9g 或者putty https://www.423down.com/11333.html
文件传输工具软件:WinSCP https://www.ghxi.com/winscp.html
下载仓库中的刷机文件压缩包,里面包含了需要的刷机文件。

  • 0.开SSH

导出配置文件,因为文件没有加密,所以直接修改里面的dropbear和rc.local增加打开SSH的命令,修改shadow文件清除root密码即可。
RAX3000M和XR30的配置文件通用,可以直接用刷机文件压缩包里面的配置文件,导入恢复配置,等待机子重启应用,即可开启SSH。
Xshell或者putty之类的软件登录SSH,地址192.168.10.1,端口22,用户名root,密码无。

解锁SSH的配置文件有两个,其中RAX3000M_XR30_cfg-ssh.conf是不加密的,RAX3000M_XR30_cfg-ssh-salted-20231027.conf是加密的,主要用于生产日期20231027及之后的RAX3000M NAND普通版。
RAX3000M算力版旧版使用的是不加密的配置文件RAX3000M_XR30_cfg-ssh.conf,不过新版20231124开始的算力版也加密了,如果不行就使用加密的配置文件RAX3000M_XR30_cfg-ssh-salted-20231027.conf。
目前XR30使用不加密的配置文件RAX3000M_XR30_cfg-ssh.conf。

查看配置文件是否加密,使用WinHex之类的二进制软件,查看文件开头有Salted__字符串,就是openssl的加盐加密。
或者直接当压缩文件用7z打开,能打开的是不加密的,打不开的一般是加密的,需要到固件代码中找加密命令和密码。

RAX3000M eMMC算力版和RAX3000Z增强版的分区是一样的,所以gpt分区表和备份分区通用。
这里简单看下原厂分区的信息,不想了解的可以略过。
可以看到原厂有两个系统分区kernel、rootfs和kernel2、rootfs2,即双分区,共用一个256MB的rootfs_data。rootfs、rootfs2都只有64MB,因此刷固件的大小不能大于64MB。输入df -h可以看到overlay直接挂载到了/dev/mmcblk0p8即rootfs_data分区,而不是挂载overlay到/dev/loop0。 df -h可以看到/dev/mmcblk0p10、11都挂载到了/mnt/mmcblk0p11,原厂就是这样,不影响所以不用管。

root@RAX3000M:~# fdisk -l /dev/mmcblk0
Found valid GPT with protective MBR; using GPT

Disk /dev/mmcblk0: 120832000 sectors, 1656M
Logical sector size: 512
Disk identifier (GUID): 2bd17853-102b-4500-aa1a-8a21d4d7984d
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 120800000

Number  Start (sector)    End (sector)  Size Name
     1            8192            9215  512K u-boot-env
     2            9216           13311 2048K factory
     3           13312           17407 2048K fip
     4           17408           82943 32.0M kernel
     5           82944          214015 64.0M rootfs
     6          214016          279551 32.0M kernel2
     7          279552          410623 64.0M rootfs2
     8          410624          934911  256M rootfs_data
     9          934912         1065983 64.0M plugins
    10         1065984         1098751 16.0M fwk
    11         1098752         1131519 16.0M fwk2
    12         1131520       120800000 57.0G data
root@RAX3000M:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                14.0M     14.0M         0 100% /rom
tmpfs                   240.6M     17.5M    223.2M   7% /tmp
/dev/mmcblk0p8          254.0M     85.5M    168.5M  34% /overlay
overlayfs:/overlay      254.0M     85.5M    168.5M  34% /
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/mmcblk0p10           7.6M      7.6M         0 100% /mnt/mmcblk0p11
/dev/mmcblk0p11           7.6M      7.6M         0 100% /mnt/mmcblk0p11
/dev/mmcblk0p12          55.9G     52.0M     53.0G   0% /mnt/mmcblk0p12
/dev/mmcblk0p9           58.0M      1.3M     52.2M   2% /mnt/mmcblk0p9
/dev/mmcblk0p12          55.9G     52.0M     53.0G   0% /extend
/dev/mmcblk0p9           58.0M      1.3M     52.2M   2% /plugin
/dev/loop0                7.6M      7.6M         0 100% /plugin/cmcc/framework
root@RAX3000M:~# blkid
/dev/loop0: TYPE="squashfs"
/dev/mmcblk0p1: PARTLABEL="u-boot-env" PARTUUID="19a4763a-6b19-4a4b-a0c4-8cc34f4c2ab9"
/dev/mmcblk0p2: PARTLABEL="factory" PARTUUID="8142c1b2-1697-41d9-b1bf-a88d76c7213f"
/dev/mmcblk0p3: PARTLABEL="fip" PARTUUID="18de6587-4f17-4e08-a6c9-d9d3d424f4c5"
/dev/mmcblk0p4: PARTLABEL="kernel" PARTUUID="971f7556-ef1a-44cd-8b28-0cf8100b9c7e"
/dev/mmcblk0p5: TYPE="squashfs" PARTLABEL="rootfs" PARTUUID="309a3e76-270b-41b2-b5d5-ed8154e7542b"
/dev/mmcblk0p6: PARTLABEL="kernel2" PARTUUID="9c17fbc2-79aa-4600-80ce-989ef9c95909"
/dev/mmcblk0p7: TYPE="squashfs" PARTLABEL="rootfs2" PARTUUID="f19609c8-f7d3-4ac6-b93e-7fd9fad4b4af"
/dev/mmcblk0p8: LABEL="rootfs_data" UUID="4959b647-3da7-464b-9b69-6c46b2e762dc" BLOCK_SIZE="4096" TYPE="f2fs" PARTLABEL="rootfs_data" PARTUUID="a4a43b93-f17d-43e2-b7a7-df0bdf610c77"
/dev/mmcblk0p9: LABEL="plugins" UUID="7ae9801f-4dcf-4c79-9c7f-eaefc65f767a" BLOCK_SIZE="1024" TYPE="ext4" PARTLABEL="plugins" PARTUUID="518c1031-c234-4d49-8301-02e7ebe31231"
/dev/mmcblk0p10: TYPE="squashfs" PARTLABEL="fwk" PARTUUID="6e2bd585-7b0b-45b5-a8a1-4cf5436b1f73"
/dev/mmcblk0p11: TYPE="squashfs" PARTLABEL="fwk2" PARTUUID="fd8708ae-59c7-4ed5-a467-54bfe357cb48"
/dev/mmcblk0p12: LABEL="extend" UUID="a2b01ad1-8504-4c5f-a93a-58a6046e46bc" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="data" PARTUUID="3c058515-54c3-452f-9b87-7a4f957b5cd1"
  • 1.备份原厂分区

只需要备份到mmcblk0p11 fwk2即可,最后一个mmcblk0p12 data分区太大不备份了。
因为rootfs_data分区比较大,所以先备份到/mnt/mmcblk0p12目录,再用WinSCP下载下来。
当然也可以压缩这个分区备份到tmp文件夹下,再用WinSCP下载下来。
WinScp软件登录路由,协议SCP,IP 192.168.10.1,端口22。
WInScp下载大文件会提示主机超过15秒无通信,需要登录时点击高级,高级站点设置-连接 去掉勾选“优化连接缓冲大小”,再登录。

提示:bl2在/dev/mmcblk0boot0,uboot在fip分区。
unpartitioned.bin是全0的空白文件,是为了后面可以使用备份的分区按顺序直接合并得到一个eMMC img镜像。
除更换eMMC,这个img基本用不到,不过还是全部分区备份为好。
注意:放在一起的命令可以全部复制粘贴、一次执行,下同,不再赘述。

直接复制下面全部命令,粘贴执行即可,等待执行完成:

dd if=/dev/mmcblk0boot0 of=/mnt/mmcblk0p12/boot0_bl2.bin conv=fsync
dd if=/dev/mmcblk0 bs=512 count=34 of=/mnt/mmcblk0p12/mmcblk0_GPT.bin conv=fsync
dd if=/dev/mmcblk0 bs=512 skip=34 count=8158 of=/mnt/mmcblk0p12/mmcblk0_unpartitioned.bin conv=fsync
dd if=/dev/mmcblk0p1 of=/mnt/mmcblk0p12/mmcblk0p1_u-boot-env.bin conv=fsync
dd if=/dev/mmcblk0p2 of=/mnt/mmcblk0p12/mmcblk0p2_factory.bin conv=fsync
dd if=/dev/mmcblk0p3 of=/mnt/mmcblk0p12/mmcblk0p3_fip.bin conv=fsync
dd if=/dev/mmcblk0p4 of=/mnt/mmcblk0p12/mmcblk0p4_kernel.bin conv=fsync
dd if=/dev/mmcblk0p5 of=/mnt/mmcblk0p12/mmcblk0p5_rootfs.bin conv=fsync
dd if=/dev/mmcblk0p6 of=/mnt/mmcblk0p12/mmcblk0p6_kernel2.bin conv=fsync
dd if=/dev/mmcblk0p7 of=/mnt/mmcblk0p12/mmcblk0p7_rootfs2.bin conv=fsync
dd if=/dev/mmcblk0p8 of=/mnt/mmcblk0p12/mmcblk0p8_rootfs_data.bin conv=fsync
dd if=/dev/mmcblk0p9 of=/mnt/mmcblk0p12/mmcblk0p9_plugins.bin conv=fsync
dd if=/dev/mmcblk0p10 of=/mnt/mmcblk0p12/mmcblk0p10_fwk.bin conv=fsync
dd if=/dev/mmcblk0p11 of=/mnt/mmcblk0p12/mmcblk0p11_fwk2.bin conv=fsync

执行完后使用WinSCP之类的软件登录路由器,到/mnt/mmcblk0p13下载下来保存到电脑。

  • 2.刷单分区uboot:

因为没有像京东云百里那样锁bl2,所以这里只刷uboot就行了。
RAX3000M算力版的uboot是mt7981_cmcc_rax3000m-emmc-fip.bin
RAX3000Z增强版的uboot是mt7981_cmcc_xr30-emmc-fip.bin
上传对应机型的单分区uboot文件到tmp文件夹,SSH输入命令验证md5:

md5sum /tmp/mt7981_cmcc_*-fip.bin

我这个2024.04.05版的uboot,是编译输出的fip文件刷入fip分区后的分区备份,所以有2MB大小,md5sum输出是这样:

root@RAX3000M:~# md5sum /tmp/mt7981_cmcc_*-fip.bin
0c2acea7e242c4f2a46d8f75517517ef  /tmp/mt7981_cmcc_rax3000m-emmc-fip.bin
7ba8a602909843e2577055be238d1201  /tmp/mt7981_cmcc_xr30-emmc-fip.bin

核对上传uboot的md5正常后,输入命令刷写uboot所在的fip分区。
RAX3000M eMMC算力版用这个命令:

dd if=/tmp/mt7981_cmcc_rax3000m-emmc-fip.bin of=$(blkid -t PARTLABEL=fip -o device) conv=fsync

RAX3000Z增强版用这个命令:

dd if=/tmp/mt7981_cmcc_xr30-emmc-fip.bin of=$(blkid -t PARTLABEL=fip -o device) conv=fsync

验证fip分区的md5和刷入文件一样即可,输入命令:

md5sum $(blkid -t PARTLABEL=fip -o device)

RAX3000M eMMC算力版:

root@RAX3000M:~# md5sum $(blkid -t PARTLABEL=fip -o device)
0c2acea7e242c4f2a46d8f75517517ef  /dev/mmcblk0p3

RAX3000Z增强版:

root@XR30:~# md5sum $(blkid -t PARTLABEL=fip -o device)
7ba8a602909843e2577055be238d1201  /dev/mmcblk0p3

到这里单分区uboot已经刷好了,可以断电重启,刷我提供的ImmortalWrt固件,然后接着刷单分区gpt分区表。

注:如果是从带有一个config分区的ImmortalWrt单分区分区表刷这个单分区,这里验证fip分区的md5是不一样的。
因为ImmortalWrt的单分区的把原厂2M的fip扩大到了4M,我这个分区表还是保持fip为2M。
下面再刷我的这个gpt分区表之后,fip分区会变为2M,mmcblk0p3分区的md5就会和我的一样了。

  • 3.刷单分区gpt分区表

原厂系统中fdisk写入修复分区表会报错,我建议在刷好uboot后直接断电按reset进uboot,刷一个小于60MB的op后再刷分区表。
建议用我提供的那个ImmortalWrt固件,已集成sgdisk,后面新建分区需要用到。如果用其他固件请先安装sgdisk。
电脑需要设置ip 192.168.1.2/24,连接网线到路由器lan口,路由上电按reset按键,等待灯变为蓝色,说明uboot webui已启动,可以松开按钮。
浏览器打开192.168.1.1,上传固件刷写成功后绿灯会亮3秒,然后重启。注意:其他大佬的uboot可能指示灯不一样。
此时电脑ip和dns可以设置回自动获取,然后等待OP系统启动后再操作刷分区表。

RAX3000M eMMC算力版和RAX3000Z增强版的gpt分区表通用。
分区表文件夹中的gpt文件,rootfs512M对应rootfs是512MB大小,依次类推。
这个rootfs就是固件+overlay的大小,overlay近似是刷固件后剩余软件包空间大小,选择自己需要的rootfs大小的分区表即可。
上传自己需要的rootfs大小的gpt分区表到tmp文件夹,这里以rootfs 512M的分区表为例,不同分区表自行修改命令中的文件名即可,其他不用修改。

上传你需要rootfs大小的gpt分区表文件到tmp文件夹,先验证md5:

md5sum /tmp/rax3000m-emmc_xr30-emmc_single-boot_rootfs*M_no-last-partition-gpt.bin
root@RAX3000M:~# md5sum /tmp/rax3000m-emmc_xr30-emmc_single-boot_rootfs*M_no-last-partition-gpt.bin
bcccd804eb53fb5346ef4612f910c772  /tmp/rax3000m-emmc_xr30-emmc_single-boot_rootfs512M_no-last-partition-gpt.bin
1419a4c0d83addb0c505600433751a24  /tmp/rax3000m-emmc_xr30-emmc_single-boot_rootfs1024M_no-last-partition-gpt.bin
c659120428da42788be1d98a4a67d1f5  /tmp/rax3000m-emmc_xr30-emmc_single-boot_rootfs2048M_no-last-partition-gpt.bin

你上传的文件的md5信息和上面对应文件的md5对比,没问题即可。
接着修改下面命令中的gpt文件名为你上传的文件名,然后复制命令粘贴一起执行:
(只修改gpt文件名,其他不变,这里以rootfs512M的分区表为例)
dd命令是写入gpt文件到/dev/mmcblk0的前34个扇区
sgdisk是用未分配空间新建data分区

dd if=/tmp/rax3000m-emmc_xr30-emmc_single-boot_rootfs512M_no-last-partition-gpt.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync && \
sgdisk -e -n 0:0:0 -c 0:data -t 0:0FC63DAF-8483-4772-8E79-3D69D8477DE4 -u 0:3C058515-54C3-452F-9B87-7A4F957B5CD1 -p /dev/mmcblk0

你会看到如下输出:

root@ImmortalWrt:~# dd if=/tmp/rax3000m-emmc_xr30-emmc_single-boot_rootfs512M_no-last-partition-gpt.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync && \
> sgdisk -e -n 0:0:0 -c 0:data -t 0:0FC63DAF-8483-4772-8E79-3D69D8477DE4 -u 0:3C058515-54C3-452F-9B87-7A4F957B5CD1 -p /dev/mmcblk0
34+0 records in
34+0 records out
Setting name!
partNum is 5
Disk /dev/mmcblk0: 120832000 sectors, 57.6 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 2BD17853-102B-4500-AA1A-8A21D4D7984D
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 120831966
Partitions will be aligned on 1024-sector boundaries
Total free space is 8158 sectors (4.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            8192            9215   512.0 KiB   8300  u-boot-env
   2            9216           13311   2.0 MiB     8300  factory
   3           13312           17407   2.0 MiB     8300  fip
   4           17408           82943   32.0 MiB    8300  kernel
   5           82944         1131519   512.0 MiB   8300  rootfs
   6         1131520       120831966   57.1 GiB    8300  data
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

dd写入没有报错,sgdisk最后输出successfully即可,有错误则及时排错,重新刷。
检查第5分区rootfs是分区表设置的大小,比如rootfs512M的分区表rootfs就是512MB。
检查第6分区data大小接近整个EMMC大小,比如64G EMMC,data分区有57GB左右。

建议此时备份下载修改后的分区表,以后有问题进不了系统,可以直接uboot刷这个分区表。
当然刷no-last-partition的分区表后再新建分区也行,一样的。

dd if=/dev/mmcblk0 bs=512 count=34 of=/tmp/mmcblk0_GPT_sgdisk.bin

都没有问题可以断电,按reset上电进uboot刷固件了。

##【刷分区表的一点小提示】##
不建议用diskman磁盘管理修改分区,可能会导致系统不能启动。建议用fdisk、gdisk之类的进行修改分区。
如果不慎修改后系统不能启动,可以进入uboot,浏览器输入 http://192.168.1.1/gpt.html 重新刷正常的gpt分区表即可。

如果uboot或系统中更换了其他分区表,但不需要使用前面的sgdisk命令新建分区并保存分区表。
这样则建议在系统中使用fdisk或者sgdisk(一般需要先安装)单独保存下分区表,这样在diskman那里显示才正确:
例如系统中单独写gpt分区表:

dd if=/tmp/gpt.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync

则建议保存下分区表:

echo -e 'w' | fdisk /dev/mmcblk0

或者

sgdisk -e /dev/mmcblk0

##【关于分区表不包含最后那个大分区的原因】##
gpt分区表的最大扇区数不能大于EMMC的物理最大扇区数,小于等于则没问题。比如128G的EMMC刷64G的分区表可以,刷256G的分区表会出错。
MT798X EMMC机子的bl2在boot0硬件分区,不受userdata硬件分区的gpt分区表影响,即使gpt坏了也可以启动uboot,所以比较抗揍。
比如百里测试刷最大扇区数大于EMMC扇区数的分区表也能启动uboot,只是固件启动会报错,可以进uboot重新刷正常的分区表。
不过高通IPQ60XX EMMC机子SBL是在userdata硬件分区中由gpt分区表划分出来的第一个软件分区,会受到gpt分区表的影响。
比如京东云AX1800 Pro亚瑟测试直接刷最大扇区数大于EMMC扇区数的分区表会砖,需要USB救砖。

同时如果最后一个大的分区超过了EMMC的扇区数,fdisk、parted、gdisk这些工具并不能直接修复,仍然需要删除新建。

基于这两个原因,我改的分区表都采用天灵大佬的gpt分区表的做法,不保留最后一个最大的分区了,即no-last-partition。
这样的分区表只包含前面的小分区,扇区总数也不会超过4G,所以适用所有大于4G的EMMC。
刷好no-last-partition分区表后,使用sgdisk用未分配空间新建一个分区,并还原分区的type code和UUID,这样这个分区和原厂分区是一样的。

  • 4.uboot刷固件和格式化data分区

我改的这个uboot不支持DHCP,电脑需要设置ip 192.168.1.2/24,连接网线到路由器lan口,路由上电按reset,等待灯变为蓝色,说明uboot webui已启动,可以松开按钮,浏览器打开192.168.1.1,上传固件刷写成功后绿灯会亮3秒,然后重启。注意:其他大佬的uboot可能指示灯不一样。
我改的这个uboot是2024.04.05编译的:
RAX3000M算力版:U-Boot 2022.07-rc3 (Apr 05 2024 - 16:00:05 +0800)
RAX3000Z增强版:U-Boot 2022.07-rc3 (Apr 05 2024 - 16:00:32 +0800)

进入uboot webui页面后,最下方会显示这个编译日期,可以作为判断是否刷的是我改的uboot的标识。
uboot不仅可以刷固件,还可以更新bl2、uboot和gpt,打开相应网页即可,非不要不需要更新:
http://192.168.1.1/bl2.html
http://192.168.1.1/uboot.html
http://192.168.1.1/gpt.html

uboot刷好第三方OP系统后,先SSH格式化下最后一个data分区。

mkfs.ext4 $(blkid -t PARTLABEL=data -o device)

需要把data分区挂载给docker,则在系统->挂载点菜单,添加挂载点,UUID选择mmcblk0p6,输入自定义挂载位置/opt,回车,然后保存,再在外层点保存并应用,最后重启系统即可。
最后检查系统->挂载点菜单,已挂载的文件系统中,是否有/dev/loop0设备挂载为/overlay,如果没有重新在备份与升级菜单升级下固件,直至有。

  • 5.刷回原厂方法

回原厂要用支持环境变量修改和fdisk的固件,目前hanwckf大佬仓库的新固件都支持了。
输入下面命令不报错即可:

fw_setenv dual_boot.current_slot 0

回原厂需要先刷回备份分区表,恢复原厂的mmcblk0p9-11这三个分区,p12如果没有格式化需要格式化下。
刷回原厂备份的gpt分区表:

dd if=/tmp/mmcblk0_GPT.bin of=/dev/mmcblk0 bs=512 count=34 conv=fsync && echo -e 'w' | fdisk /dev/mmcblk0

刷好原厂分区表后,断电进uboot刷下OP固件。

OP系统起来后还原plugins、fwk和fwk2分区:
上传mmcblk0p9_plugins.bin、mmcblk0p10_fwk.bin和mmcblk0p11_fwk2.bin到tmp文件夹,然后刷回去:

dd if=/tmp/mmcblk0p9_plugins.bin of=$(blkid -t PARTLABEL=plugins -o device) conv=fsync
dd if=/tmp/mmcblk0p10_fwk.bin of=$(blkid -t PARTLABEL=fwk -o device) conv=fsync
dd if=/tmp/mmcblk0p11_fwk2.bin of=$(blkid -t PARTLABEL=fwk2 -o device) conv=fsync

接着格式化下data分区:

umount $(blkid -t PARTLABEL=data -o device)
mkfs.ext4 -L extend $(blkid -t PARTLABEL=data -o device)

格式化后web页面挂载点那里,手动挂载/dev/mmcblk0p12到/mnt/mmcblk0p12,记住勾选启用,保存并应用。
然后SSH输入命令在这个路径下新建一个ecmanager文件夹,这样就还原了所有分区了,SSH输入命令:

mkdir /mnt/mmcblk0p12/ecmanager

刷回原厂uboot和固件:
接着上传原厂mmcblk0p3_fip.bin、mmcblk0p4_kernel.bin、mmcblk0p5_rootfs.bin到tmp,刷写uboot设置从系统0启动,刷写kernel、rootfs并清空rootfs_data,为了保险kernel2、rootfs2也一并写入原厂固件:

dd if=/tmp/mmcblk0p3_fip.bin of=$(blkid -t PARTLABEL=fip -o device) conv=fsync
fw_setenv dual_boot.current_slot 0
dd if=/tmp/mmcblk0p4_kernel.bin of=$(blkid -t PARTLABEL=kernel -o device) conv=fsync
dd if=/tmp/mmcblk0p5_rootfs.bin of=$(blkid -t PARTLABEL=rootfs -o device) conv=fsync
dd if=/tmp/mmcblk0p4_kernel.bin of=$(blkid -t PARTLABEL=kernel2 -o device) conv=fsync
dd if=/tmp/mmcblk0p5_rootfs.bin of=$(blkid -t PARTLABEL=rootfs2 -o device) conv=fsync
dd if=/dev/zero of=$(blkid -t PARTLABEL=rootfs_data -o device) conv=fsync

注意:dd: error writing '/dev/mmcblk0p8': No space left on device
这个报错是正常的,不用管!!

等待mmcblk0p8 rootfs_data分区刷完,刷完断电重启即可。

  • 6.MT798X路由器串口TTL救砖

路由器断电,使用USB转TTL(建议使用3.3V电平的)连接路由器TTL接口。
运行“打开设备管理器命令.bat”在设备管理器查看USB转TTL对应的COM口号。这个COM口不能被其他程序占用。
运行“串口TTL救砖命令.bat”,选择对应型号的fip序号,选择正常波特率,然后输入COM口号回车即可。
如果波特率报错,则尝试低波特率。

路由器断电,使用USB转TTL(建议使用3.3V电平的)连接路由器TTL接口。
运行“打开设备管理器命令.bat”在设备管理器查看USB转TTL对应的COM口号。这个COM口不能被其他程序占用。
运行“MT798X串口TTL救砖命令.bat”,选择对应型号的fip序号,选择正常波特率,然后输入COM口号回车即可。
如果波特率报错,则尝试低波特率。

注意mtk_uartboot文件夹中的bl2是ram boot bl2,不是闪存用的bl2!!!
除了京东云百里jdcloud_re-cp-03要刷解锁Secure Boot的bl2,一般恢复bl2,刷原厂即可。
eMMC机型在uboot的bl2.html刷bl2限制上传文件大小1MB。
还有bl-mt798x仓库编译xdr4288/608x的bl2和fip是没有开NMBM,恢复bl2的话根据自己情况考虑。

也可以手动运行mtk_uartboot命令,详见mtk_uartboot文件夹里的教程。
下面说下大致过程,运行命令后会出现等待握手信息:

mtk_uartboot - 0.1.1
Using serial port: COM3
Handshake...

然后路由器上电开机,握手成功CMD会输出sending payload信息开始发送bl2:

hw code: 0x7986
hw sub code: 0x8a00
hw ver: 0xca01
sw ver: 0x1
Baud rate set to 115200
sending payload to 0x201000...

发送完成加载bl2会输出信息同时开始发送fip:

Checksum: 0x3c82
Setting baudrate back to 115200
Jumping to 0x201000 in aarch64...
Waiting for BL2. Message below:
==================================
NOTICE:  BL2: v2.10.0   (release):v2.4-rc0-5845-gbacca82a8-dirty
NOTICE:  BL2: Built : 20:30:05, Feb  2 2024
NOTICE:  WDT: Cold boot
NOTICE:  WDT: disabled
NOTICE:  CPU: MT7986 (2000MHz)
NOTICE:  EMI: Using DDR4 settings
NOTICE:  EMI: Detected DRAM size: 1024MB
NOTICE:  EMI: complex R/W mem test passed
NOTICE:  Starting UART download handshake ...
==================================
BL2 UART DL version: 0x10
Baudrate set to: 115200

此时开始在上传fip,600KB的fip使用1500000波特率只需要几秒钟,低波特率则大概45秒。
此时如果需要进入uboot webui可以直接按住reset按键不放,等待uboot指示灯闪烁并进入uboot。
如果没有按reset会直接启动固件,进入固件再恢复刷砖的分区也行。

fip加载完后输出:

FIP sent.
==================================
NOTICE:  Received FIP 0x90b59 @ 0x40400000 ...
==================================

此时程序已经执行完,已经加载uboot,如果没有按reset会直接启动固件,按reset就进入uboot webui恢复刷砖的文件。

  • 关于52MHz频率固件

mt7981的eMMC接口最高可以跑52MHz,因为RAX3000M算力版的eMMC体质比较菜,跑52MHz固件会爆I/O error导致系统崩溃,所以原厂固件设置eMMC频率是26MHz,大佬们的固件默认也是26MHz,比较稳定。RAX3000Z增强版没有机子所以没有测试。
如果想尝试eMMC 52MHz固件,大概率会I/O error,无解只能换eMMC,但是费用高不值得,还是建议26MHz固件即可。
52MHz eMMC读写速度约45MB/s,26MHz约为20MB/s,使用上是感觉不出差别的。

SSH输入命令查看是否有I/O error报错:

dmesg | grep 'I/O error'

查看固件eMMC频率用命令:

cat /sys/kernel/debug/mmc0/ios