这篇文章最后修改于 2023-06-30 日,距今已有 241 天,请注意甄别内容是否已经过时!
TL;DR: 现在已有免拆刷机方案here,以下内容仅供参考,可以不看。

0.背景信息 ~ simple introduction.

JCG Q30 Pro 是一款采用了联发科技 Filogic 820 / MT7981 SoC 的 AX3000 WiFi 6 无线路由器,目前售价相对亲民(100 元左右),性价比较高。

原厂固件默认采用移动 DNS,且自带上报插件,刷机似乎是必需的。由天灵 @1715173329 维护的 OpenWrt 分支 ImmortalWrt 已经在 23.05-SNAPSHOT 开始提供了对这款机型,以及其他一些采用 MTK Filogic SoC 设备的支持。

不幸的是,目前并没有免拆机方案。这款机器采用了类似部分安卓手机的 A/B 分区方案,ubi 里有两个 kernel 两个 rootfs 和一个 backup,并且默认不开启 telnet 等连接方式,网页端也暂时没有办法开启。(天灵大佬远程在我机器上调试了一个下午也没搞定,悲)

好消息是,这款机器拆机相对简单,并且固件支持也相对完善,刷机步骤不算太复杂。 237 大佬已经搞定了免拆过渡固件。

目前咸鱼已经买不到这款,据说最近会补货。MT7981 的机器还有很多,不要吊死在一棵树上。囤货涨价的行为没有意义。
笔者不对任何拆机 & 刷机导致的问题负责。

1. 事先准备 ~ prerequisites.

硬件方面:
  • 捷稀 JCG Q30 Pro 无线路由器一台 * 1
  • DC 5.5 * 2.5mm 12V 电源 * 1(机器附带)
  • 适当长度的网线 * 2(机器附带一条,需要自行准备一条)
  • CH340 或其他 USB 转串口工具 * 1
  • 用于连接路由器和 CH340G 的杜邦线 3,插针 3
  • 一台 PC,本文默认以 Windows 进行演示,其他系统的用户请自行寻找替代方案
  • 螺丝刀一把,塑料翘片若干,用于拆机
软件方面:
注意,固件请下载 Factory 镜像,U-Boot 选用 expand 分区版。
其他:

正常的互联网连接,可靠的电力供应,避免刷写途中断电。

2. 开启 telnet ~ establishing connection.

为了刷入 ImmortalWrt 以及自定义 U-Boot,开启 telnet 是必需的前置依赖。目前 JCG Q30 Pro 仅能通过拆机连接 UART 的方式开启 telnet。

拆机非常简单,卸下背面四颗螺丝,然后就可以回到正面开始翘了。笔者是从正面左下角入手,然后撬开侧面的卡口。

推荐拆解位置

接下来找到主板正面右上角的 UART 位置。使用插针将其连接到 CH340。通常不需要焊接,稍微给一点压力保持连接即可。

UART 位置

连接方式如下:
路由器主板CH340
VCCNC(不接),接了可能会烧主板
RXTXD
TXRXD
GNDGND
然后即可将 CH340 连接到 PC。

接下来打开设备管理器,选择 端口(COM 和 LPT),记下系统给 CH340 分配的 COM 端口号。如下图,为 COM4。

COM 口

启动 Putty。选择 SerialSerial Line 选择设备管理器的端口号,COM4Speed/波特率 填入 115200,点击 Open

Putty 会启动一个会话,目前是黑屏。现在可以给路由器上电了。

2.1. 如果出现乱码

请检查波特率。

2.2. 如果无输出

请检查是否接触不良,以及 TX/RX 是否接反。

2.3. 如果 Putty 无法打开 COM 端口

请检查设备管理器中驱动是否正常安装。

路由器上电后,稍等片刻会出现如下输出:

COM 口

等待自动进入系统,或者直接回车即可。

此屏幕过后,不断按 F 和回车,直到进入 OpenWrt 的 failsafe 模式,如下图。

failsafe 模式
对,自带的固件是基于 OpenWrt 21.02-SNAPSHOT 魔改的。
在 Putty 终端中,执行:
mount_root 
输出如下:
root@(none):/# mount_root
[ 2776.795678] mount_root: loading kmods from internal overlay
[ 2776.811117] kmodloader: loading kernel modules from //etc/modules-boot.d/*
[ 2776.819610] kmodloader: done loading kernel modules from //etc/modules-boot.d/*
[ 2777.593048] UBIFS (ubi0:4): Mounting in unauthenticated mode
[ 2777.598922] UBIFS (ubi0:4): background thread "ubifs_bgt0_4" started, PID 901
[ 2777.627414] UBIFS (ubi0:4): recovery needed
[ 2777.715239] UBIFS (ubi0:4): recovery completed
[ 2777.719749] UBIFS (ubi0:4): UBIFS: mounted UBI device 0, volume 4, name "rootfs_data"
[ 2777.727574] UBIFS (ubi0:4): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
[ 2777.737476] UBIFS (ubi0:4): FS size: 7237632 bytes (6 MiB, 57 LEBs), journal size 1015809 bytes (0 MiB, 6 LEBs)
[ 2777.747550] UBIFS (ubi0:4): reserved for root: 341850 bytes (333 KiB)
[ 2777.753983] UBIFS (ubi0:4): media format: w5/r0 (latest is w5/r0), UUID 9444B876-C077-469E-97D8-0AB7ADF55446, small LPT model
[ 2777.766320] block: attempting to load /tmp/ubifs_cfg/upper/etc/config/fstab
[ 2777.777126] block: extroot: not configured
[ 2777.781355] UBIFS (ubi0:4): un-mount UBI device 0
[ 2777.786069] UBIFS (ubi0:4): background thread "ubifs_bgt0_4" stops
[ 2777.794808] UBIFS (ubi0:4): Mounting in unauthenticated mode
[ 2777.800566] UBIFS (ubi0:4): background thread "ubifs_bgt0_4" started, PID 904
[ 2777.844293] UBIFS (ubi0:4): UBIFS: mounted UBI device 0, volume 4, name "rootfs_data"
[ 2777.852130] UBIFS (ubi0:4): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
[ 2777.862033] UBIFS (ubi0:4): FS size: 7237632 bytes (6 MiB, 57 LEBs), journal size 1015809 bytes (0 MiB, 6 LEBs)
[ 2777.872108] UBIFS (ubi0:4): reserved for root: 341850 bytes (333 KiB)
[ 2777.878541] UBIFS (ubi0:4): media format: w5/r0 (latest is w5/r0), UUID 9444B876-C077-469E-97D8-0AB7ADF55446, small LPT model
[ 2777.892395] mount_root: loading kmods from internal overlay
[ 2777.906672] kmodloader: loading kernel modules from /tmp/overlay/upper/etc/modules-boot.d/*
[ 2777.916348] kmodloader: done loading kernel modules from /tmp/overlay/upper/etc/modules-boot.d/*
[ 2778.609220] block: attempting to load /tmp/ubifs_cfg/upper/etc/config/fstab
[ 2778.618570] block: extroot: not configured
[ 2778.624356] mount_root: switching to ubifs overlay
root@(none):/#
接下来执行:
vi /etc/rc.local
在开头两行注释后添加如下内容:
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
busybox telnetd
vi 操作说明:按 i 进入编辑模式,编写好内容后,按 ESC 退出编辑模式;输入 :wq 保存并退出。
修改完成后,执行 reboot 或者直接断电,重启路由器。至此,telnet 开启完成。

3. 备份固件 ~ just in case.

同样是使用 Putty,选择 Others - Telnet

Hostname/IP 地址填写路由器 IP 地址,默认为 192.168.10.1。端口号不变。点击 Open

输入用户名 root, 密码和 WebUI 默认登录密码一致,可查看路由器底面或包装盒上的标签。

执行 cat /proc/mtd 查看分区表。默认的分区表如下:
root@Q30PRO:~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 08000000 00020000 "spi0.0"
mtd1: 00100000 00020000 "BL2"
mtd2: 00080000 00020000 "u-boot-env"
mtd3: 00200000 00020000 "Factory"
mtd4: 00200000 00020000 "FIP"
mtd5: 04000000 00020000 "ubi"
mtd

接下来,在 PC 上启动一个终端,或者 cmd/powershell。执行如下命令:
nc -lvp 33333 > mtd0.bin
如果弹出防火墙提示,请放行。

然后,在 telnet 中执行如下命令。注意将 192.168.10.172 修改为电脑的实际 LAN IP 地址。
cat /dev/mtd0 | nc 192.168.10.172 33333
执行结束后,电脑和路由器的 nc 会自动退出。用同样的方法,继续备份 mtd1~mtd5。注意修改文件名。

结束后会在 cmd/powershell 执行目录获得 mtd0~mtd5 共六个备份文件。保存好以备不时之需。

4. 刷入 U-Boot ~ rebootstrap.

备份结束后,可以放心刷入天灵的修改版 U-Boot 和固件了。

U-Boot 刷写有两种方法,借助 telnet 连接在原厂系统中直接刷写,或者借助 USB-TTL 串口连接在 U-Boot 中刷写。笔者使用前一种方式。如果您在 U-Boot 中刷写 FIP 遇到问题,请直接使用第一种方式在系统中刷写。

4.1. 在原厂系统中刷入修改版 U-Boot

使用先前 #3 的方法连接到 telnet 并登录。执行:
curl https://firmware.download.immortalwrt.eu.org/uboot/mediatek/mt7981-jcg_q30-fip-expand.bin -Lo /tmp/mt7981-jcg_q30-fip-expand.bin
echo '61f32e22b05c6a3d6f81cdbefd2e0451552f2d9f7f189290214283cb1d3a7793  /tmp/mt7981-jcg_q30-fip-expand.bin' | sha256sum -c - || exit 1
mtd write /tmp/mt7981-jcg_q30-fip-expand.bin FIP
务必确定 sha256 校验通过后再进行 mtd 刷写操作。

刷入 FIP

4.2. 在原厂 U-Boot 中刷入修改版 U-Boot

断电,重启路由器。

还记得刚开始使用 Putty 时候出现的 U-Boot 启动菜单吗?选择 Upgrade ATF FIP 并回车。

U-Boot 菜单

然后选择 0 - TFTP client,或者直接回车。

选中 TFTP

接下来前三项可以默认,第三项修改为我们 U-Boot 的文件名:mt7981-jcg_q30-fip-expand.bin

修改参数

输入完文件名后先别急着敲回车。打开系统的网络设置,手动设置 IP 地址:

设置静态 IP

打开 tftpd64 所在目录,将先前下载的 U-Boot 放置在和 tftpd64 主程序同级目录下。启动 tftpd64,如有防火墙提示请放行。

tftpd64

tftpd64 中的 server interfaces 选择连接了路由器的网卡。现在可以在 Putty 那边回车刷入了。

设置 tftpd64

5. 刷入 ImmortalWrt SNAPSHOT ~ in a flash.

使用上述任意一种方式刷入后,给路由器断电,按住 Reset 按钮上电,大约不到 10s 后红灯闪烁三下,然后蓝灯常亮,代表进入了 U-Boot 恢复模式的 WebUI。目前 U-Boot 的 DHCP 可能不工作,需要手动设置 IP,和 #4.2. 一致。

电脑浏览器打开 http://192.168.1.1 ,点击 upload 上传 Factory 固件。注意检查固件 MD5 是否正确。

上传完成后点击 Update,等待系统重启的途中可以将电脑网络切换回 DHCP 模式。

刷入系统镜像

6. 结束 ~ Voilà!

至此,你已经成功将 ImmortalWrt 刷入 JCG Q30 Pro。现在可以把路由器上盖装回去上好螺丝,网页端打开 http://192.168.1.1 开始体验。

默认用户名 root,密码 password

Enjoy.

TTL

WebUI

9. 一些其他优化 ~ minor tweaks.

目前固件默认没完全开启 WiFi 硬件转发加速,天灵修改这个配置之前,可能需要手动开启。SSH 或 TTYD 连接到路由器并执行:
opkg update && opkg install bridger
echo 'mt7915e wed_enable=Y' > /etc/modules.d/mt7915e
执行完成后,reboot 重启路由器。现在 WiFi 跑满的时候不会再拉炸 CPU 了。

8. 致谢 ~ Credits.

天灵 @1715173329 - Project ImmortalWrt Creator & Maintainer、修改版 U-Boot、刷机指导,以及尝试调试原厂固件免拆刷机。

标签: 技术, 路由器, OpenWrt, ImmortalWrt, MTK, MT7981, Filogic, 刷机, 教程

添加新评论