👁 2500

这台 Xfinity XER5 我之前只是按拆机和后台截图简单写了一版,现在补上 dump、DTS、GPT 分区表和 OpenWrt 移植进度后,基本可以把它看成一台“运营商 AP 外壳里的 IPQ9574 开发板”。原厂系统本身很克制,主要就是 AP;真正有意思的是硬件底子和后面能不能把 64-bit OpenWrt 跑起来。

Xfinity XER5 原厂后台信息
原厂后台能看到 IPQ95xx 平台痕迹,但系统本身偏运营商 AP,功能不算多。

先说结论:硬件不弱,原厂固件有点憋屈

这台机器核心不是 IPQ9750,而是 Qualcomm IPQ9574,属于 IPQ9570 系列(同为 IPQ9574 平台的还有 Nokia Beacon 10,那边也是完整 eMMC GPT 分区方案)。CPU 是 4 个 Cortex-A73,硬件本身是 ARMv8-A 64-bit;但原厂 dump 里能看到它跑的是 QSDK 12.5 的 ipq95xx_32 分支,也就是 32 位 OpenWrt/QSDK。这也是我一开始疑惑“明明芯片很新,为什么系统像被压了一档”的原因。

内存这块目前按 dump/系统侧资料看是 2GB DDR4;早先拆料和不同批次信息里出现过 4GB 口径,后面还是要以实物颗粒和 U-Boot 完整启动日志再校准。这里先不把话说死,免得把不同批次混成一个结论。

SoCQualcomm IPQ9574,4× ARM Cortex-A73,ARMv8-A 64-bit
原厂系统OpenWrt/QSDK 风格,Linux 5.4.213,目标路径显示为 ipq95xx_32
无线IPQ9574 内置 radio + 2× QCN9224 PCIe,无线规格是 Wi-Fi 6E 三路思路
有线QCA8075 千兆 PHY + 2× RTL8261N,高速口走 USXGMII/SGMII+ 一类链路
存储4GB eMMC,HS400 + Enhanced Strobe,GPT 共 44 个分区
串口serial@78b1000,115200n8
Xfinity XER5 拆机主板
拆机主板图。网口、PHY、无线子系统后面要结合实物照片和 DTB 一起看,单看后台会漏很多东西。

DTS 反推出来的硬件拓扑

这次最有价值的补充,不是跑分,而是从原厂 HLOS/FIT 里反编译 DTB。DTB 里兼容字符串是 qcom,ipq9574-ap-al02-c1、qcom,ipq9574-al02、qcom,ipq9574,基本就是 Qualcomm AP-AL02-C1 参考板路线,Xfinity/ODM 没有做太多私有命名。

模块DTS / dump 看到的东西我的理解
CPU4× arm,cortex-a73,PSCI 启动硬件原生能跑 64 位,32 位是原厂 BSP 选择
千兆 PHYMDIO 0x10/0x11/0x12/0x13,QCA8075DTS 支持 4 个千兆通道,但实物外露口数要看板子焊接
高速口MDIO 0x08、0x00,RTL8261N两个 2.5G/10G 方向的高速 PHY,其中 port6 在 DTS 里是 WAN
Wi-FiIPQ9574 内置 + QCN9224 PCIe0/PCIe2更像 Wi-Fi 6E AP 平台,不是普通低端单 radio 路由
按键/LEDWPS GPIO37,2.4G LED GPIO64先按 DTS 写入 OpenWrt,更多灯还要靠实物/日志补
eMMCqcom,sdhci-msm-v5,HS400编程器备份和分区刷写都比较友好

所以这台机子的价值点并不在原厂 UI,而在于它把 IPQ9574、QCN9224、RTL8261N、eMMC、A/B 分区这些东西都摆在一起。对折腾 OpenWrt 的人来说,这比一个“能不能进后台”的 AP 有意思多了。

OpenWrt 固件现在跑到哪一步了

目前我已经让 AI 按 XER5 的硬件信息去跑 OpenWrt 移植。当前路线是先把 xfinity_xer5 设备入口、DTS、image makefile、board.d 这些基础东西补上,再看编译和启动日志。

阶段内容状态说明
0硬件分析 + DTS 反推完成5 口/PHY/无线/串口/eMMC 已有基础结论
0.5OpenWrt/ImmortalWrt 仓库选定完成基于 master / kernel 6.12 方向试跑
0.6XER5 DTS 编写完成ipq9574-xfinity-xer5.dts 已写入
0.7image makefile + board.d完成xfinity_xer5 设备入口已加
1feeds update -a完成feeds 已拉取
2feeds install -a进行中后续会进入 defconfig、download、tools/toolchain、完整编译

如果顺利,产物目录会在 bin/targets/qualcommbe/ipq95xx/,目标是先拿到 factory.bin 和 sysupgrade.bin。但这还不是“能放心刷”的意思,IPQ95xx + QCN9224 + RTL8261N 这一套,首次启动大概率还要靠 TTL 日志来回改。

刷机思路:优先碰备槽,不要一上来抹主槽

这台的好处是 eMMC GPT 很清楚,A/B 槽结构也明显(京东云盒 IPQ6018 全记录里就是完整的在线开 telnet → 备份 → 刷 U-Boot → 刷系统的双槽实操流程,思路可以直接搬)。我的倾向是先用 T76/编程器保留原厂主槽,OpenWrt 先写备槽:0:HLOS_1 + rootfs_1,再通过 BOOTCONFIG 切过去试启动。失败了就把 BOOTCONFIG 切回 A 槽,原厂系统还在。

  • 保命方案:写 0:HLOS_1 + rootfs_1,切 B 槽测试。
  • 激进方案:直接覆盖 0:HLOS + rootfs 主槽,不建议第一轮这么干。
  • 必须保留:0:ART、0:FACDATA、0:WIFIFW、APPSBLENV 这类校准/环境/无线相关分区。
  • 首次启动一定要接 TTL,看 U-Boot、FIT、DTB、PHY、Wi-Fi firmware 哪一步挂。

eMMC GPT 分区表(Excel 风格整理)

下面这张表是从 UserData.BIN 直接解析 GPT 得到的,不是凭印象手写(eMMC 整体备份/还原的通用玩法见 EMMC Backup/Restore 各种盒子原版数据)。镜像大小 3665821696 bytes,512B 扇区,总扇区 7159808,已用 GPT 分区 44 个;最后一个分区结束在 LBA 4714495,后面还剩约 1.2GiB 未分配空间。

#NameStart LBAEnd LBAOffset hexSizeStart magicFirst 64K zero
10:RSV034163830x000044008.0 MiBzeroyes
20:SBL116384194550x008000001.5 MiBELFno
30:QSEE19456255990x009800003.0 MiBELFno
40:DEVCFG25600266230x00C80000512.0 KiBELFno
50:APDP26624276470x00D00000512.0 KiBELFno
60:TME27648286710x00D80000512.0 KiBELFno
70:RPM28672296950x00E00000512.0 KiBELFno
80:CDT29696307190x00E80000512.0 KiBQualcomm CDTno
90:RSV130720327670x00F000001.0 MiBzeroyes
100:APPSBL32768368630x010000002.0 MiBELFno
110:RSV236864491510x012000006.0 MiBzeroyes
120:SBL1_149152522230x018000001.5 MiBzeroyes
130:QSEE_152224583670x019800003.0 MiBzeroyes
140:DEVCFG_158368593910x01C80000512.0 KiBzeroyes
150:APDP_159392604150x01D00000512.0 KiBzeroyes
160:TME_160416614390x01D80000512.0 KiBzeroyes
170:RPM_161440624630x01E00000512.0 KiBzeroyes
180:CDT_162464634870x01E80000512.0 KiBzeroyes
190:RSV363488655350x01F000001.0 MiBzeroyes
200:APPSBL_165536696310x020000002.0 MiBzeroyes
210:RSV469632819190x022000006.0 MiBzeroyes
220:BOOTCONFIG81920829430x02800000512.0 KiBBOOTCONFIGno
230:BOOTCONFIG182944839670x02880000512.0 KiBBOOTCONFIGno
240:APPSBLENV83968849910x02900000512.0 KiBm..@baudrate=115200.bootargs=console=ttyMSM0,115no
250:TRUST84992860150x02980000512.0 KiBzeroyes
26NVRAM86016890870x02A000001.5 MiBzeroyes
270:RSV589088983030x02B800004.5 MiBzeroyes
280:FACDATA983041023990x030000002.0 MiBbinary/nonzerono
290:FACDATA_11024001064950x032000002.0 MiBbinary/nonzerono
300:ART1064961105910x034000002.0 MiBa…..a…..a…..a…..a…..ano
310:RSV61105921310710x0360000010.0 MiBzeroyes
320:HLOS1310722621430x0400000064.0 MiBFITno
33RDK26214410485750x08000000384.0 MiBzeroyes
340:WIFIFW104857610813430x2000000016.0 MiBSquashFSno
350:HLOS_1108134412124150x2100000064.0 MiBzeroyes
36RDK1121241619988470x25000000384.0 MiBzeroyes
370:WIFIFW_1199884820316150x3D00000016.0 MiBzeroyes
380:NVRAM_0203161622937590x3E000000128.0 MiBzeroyes
390:NVRAM_1229376025559030x46000000128.0 MiBzeroyes
40APP_STORAGE255590430801910x4E000000256.0 MiBzeroyes
41APP_DATA308019231006710x5E00000010.0 MiBzeroyes
42App_Logging310067231416310x5EA0000020.0 MiBzeroyes
43rootfs314163239280630x5FE00000384.0 MiBSquashFSno
44rootfs_1392806447144950x77E00000384.0 MiBzeroyes

橙色行是后续刷机/救砖最容易用到的关键分区;zero 只表示分区开头 64K 为空,不等于整个分区一定完全无数据。

几个容易误判的点

  • 不是 IPQ9750:原文里那段 IPQ9750 图和说明容易误导,按 DTB 和 dump 看应按 IPQ9574/IPQ9570 系列写。
  • 不是硬件不支持 64 位:Cortex-A73 天生支持 AArch64,原厂跑 32 位更像 BSP/交付选择。
  • 端口要分“DTS 支持”和“实物焊出”:DTS 里能看到 4 个千兆通道 + 2 个高速 PHY,但最终外壳露了几个、哪个口接哪颗 PHY,还得结合拆机和链路日志。
  • Wi-Fi 是难点:QCN9224、BDF、firmware、ath12k/qcawifi 路线都会影响最终能不能稳定开无线。
  • 分区别乱抹:ART/FACDATA/WIFIFW/APPSBLENV 这类不是“空闲空间”,动错了 MAC、校准、无线都可能出问题。

后面准备怎么继续

现在先让编译跑完,拿到第一版 OpenWrt 镜像后,下一步不是马上吹“适配完成”,而是先做三件事:binwalk 看 FIT 结构,dtc 反编译 DTB 校对设备树,dumpimage 看 kernel/DTB 打包是否正常。确认镜像结构没问题后,再考虑用 T76 写备槽测试。

这台 XER5 现在对我来说已经不是“拆一台运营商 AP 看看”了,更像是拿一块 IPQ9574/QCN9224/RTL8261N 的板子练 OpenWrt 移植。等固件真跑起来,再单独写一篇从 dump、DTS、分区到刷备槽的完整记录。