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

先说结论:硬件不弱,原厂固件有点憋屈
这台机器核心不是 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 完整启动日志再校准。这里先不把话说死,免得把不同批次混成一个结论。
| SoC | Qualcomm 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 |

DTS 反推出来的硬件拓扑
这次最有价值的补充,不是跑分,而是从原厂 HLOS/FIT 里反编译 DTB。DTB 里兼容字符串是 qcom,ipq9574-ap-al02-c1、qcom,ipq9574-al02、qcom,ipq9574,基本就是 Qualcomm AP-AL02-C1 参考板路线,Xfinity/ODM 没有做太多私有命名。
| 模块 | DTS / dump 看到的东西 | 我的理解 |
|---|---|---|
| CPU | 4× arm,cortex-a73,PSCI 启动 | 硬件原生能跑 64 位,32 位是原厂 BSP 选择 |
| 千兆 PHY | MDIO 0x10/0x11/0x12/0x13,QCA8075 | DTS 支持 4 个千兆通道,但实物外露口数要看板子焊接 |
| 高速口 | MDIO 0x08、0x00,RTL8261N | 两个 2.5G/10G 方向的高速 PHY,其中 port6 在 DTS 里是 WAN |
| Wi-Fi | IPQ9574 内置 + QCN9224 PCIe0/PCIe2 | 更像 Wi-Fi 6E AP 平台,不是普通低端单 radio 路由 |
| 按键/LED | WPS GPIO37,2.4G LED GPIO64 | 先按 DTS 写入 OpenWrt,更多灯还要靠实物/日志补 |
| eMMC | qcom,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.5 | OpenWrt/ImmortalWrt 仓库选定 | 完成 | 基于 master / kernel 6.12 方向试跑 |
| 0.6 | XER5 DTS 编写 | 完成 | ipq9574-xfinity-xer5.dts 已写入 |
| 0.7 | image makefile + board.d | 完成 | xfinity_xer5 设备入口已加 |
| 1 | feeds update -a | 完成 | feeds 已拉取 |
| 2 | feeds 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 未分配空间。
| # | Name | Start LBA | End LBA | Offset hex | Size | Start magic | First 64K zero |
|---|---|---|---|---|---|---|---|
| 1 | 0:RSV0 | 34 | 16383 | 0x00004400 | 8.0 MiB | zero | yes |
| 2 | 0:SBL1 | 16384 | 19455 | 0x00800000 | 1.5 MiB | ELF | no |
| 3 | 0:QSEE | 19456 | 25599 | 0x00980000 | 3.0 MiB | ELF | no |
| 4 | 0:DEVCFG | 25600 | 26623 | 0x00C80000 | 512.0 KiB | ELF | no |
| 5 | 0:APDP | 26624 | 27647 | 0x00D00000 | 512.0 KiB | ELF | no |
| 6 | 0:TME | 27648 | 28671 | 0x00D80000 | 512.0 KiB | ELF | no |
| 7 | 0:RPM | 28672 | 29695 | 0x00E00000 | 512.0 KiB | ELF | no |
| 8 | 0:CDT | 29696 | 30719 | 0x00E80000 | 512.0 KiB | Qualcomm CDT | no |
| 9 | 0:RSV1 | 30720 | 32767 | 0x00F00000 | 1.0 MiB | zero | yes |
| 10 | 0:APPSBL | 32768 | 36863 | 0x01000000 | 2.0 MiB | ELF | no |
| 11 | 0:RSV2 | 36864 | 49151 | 0x01200000 | 6.0 MiB | zero | yes |
| 12 | 0:SBL1_1 | 49152 | 52223 | 0x01800000 | 1.5 MiB | zero | yes |
| 13 | 0:QSEE_1 | 52224 | 58367 | 0x01980000 | 3.0 MiB | zero | yes |
| 14 | 0:DEVCFG_1 | 58368 | 59391 | 0x01C80000 | 512.0 KiB | zero | yes |
| 15 | 0:APDP_1 | 59392 | 60415 | 0x01D00000 | 512.0 KiB | zero | yes |
| 16 | 0:TME_1 | 60416 | 61439 | 0x01D80000 | 512.0 KiB | zero | yes |
| 17 | 0:RPM_1 | 61440 | 62463 | 0x01E00000 | 512.0 KiB | zero | yes |
| 18 | 0:CDT_1 | 62464 | 63487 | 0x01E80000 | 512.0 KiB | zero | yes |
| 19 | 0:RSV3 | 63488 | 65535 | 0x01F00000 | 1.0 MiB | zero | yes |
| 20 | 0:APPSBL_1 | 65536 | 69631 | 0x02000000 | 2.0 MiB | zero | yes |
| 21 | 0:RSV4 | 69632 | 81919 | 0x02200000 | 6.0 MiB | zero | yes |
| 22 | 0:BOOTCONFIG | 81920 | 82943 | 0x02800000 | 512.0 KiB | BOOTCONFIG | no |
| 23 | 0:BOOTCONFIG1 | 82944 | 83967 | 0x02880000 | 512.0 KiB | BOOTCONFIG | no |
| 24 | 0:APPSBLENV | 83968 | 84991 | 0x02900000 | 512.0 KiB | m..@baudrate=115200.bootargs=console=ttyMSM0,115 | no |
| 25 | 0:TRUST | 84992 | 86015 | 0x02980000 | 512.0 KiB | zero | yes |
| 26 | NVRAM | 86016 | 89087 | 0x02A00000 | 1.5 MiB | zero | yes |
| 27 | 0:RSV5 | 89088 | 98303 | 0x02B80000 | 4.5 MiB | zero | yes |
| 28 | 0:FACDATA | 98304 | 102399 | 0x03000000 | 2.0 MiB | binary/nonzero | no |
| 29 | 0:FACDATA_1 | 102400 | 106495 | 0x03200000 | 2.0 MiB | binary/nonzero | no |
| 30 | 0:ART | 106496 | 110591 | 0x03400000 | 2.0 MiB | a…..a…..a…..a…..a…..a | no |
| 31 | 0:RSV6 | 110592 | 131071 | 0x03600000 | 10.0 MiB | zero | yes |
| 32 | 0:HLOS | 131072 | 262143 | 0x04000000 | 64.0 MiB | FIT | no |
| 33 | RDK | 262144 | 1048575 | 0x08000000 | 384.0 MiB | zero | yes |
| 34 | 0:WIFIFW | 1048576 | 1081343 | 0x20000000 | 16.0 MiB | SquashFS | no |
| 35 | 0:HLOS_1 | 1081344 | 1212415 | 0x21000000 | 64.0 MiB | zero | yes |
| 36 | RDK1 | 1212416 | 1998847 | 0x25000000 | 384.0 MiB | zero | yes |
| 37 | 0:WIFIFW_1 | 1998848 | 2031615 | 0x3D000000 | 16.0 MiB | zero | yes |
| 38 | 0:NVRAM_0 | 2031616 | 2293759 | 0x3E000000 | 128.0 MiB | zero | yes |
| 39 | 0:NVRAM_1 | 2293760 | 2555903 | 0x46000000 | 128.0 MiB | zero | yes |
| 40 | APP_STORAGE | 2555904 | 3080191 | 0x4E000000 | 256.0 MiB | zero | yes |
| 41 | APP_DATA | 3080192 | 3100671 | 0x5E000000 | 10.0 MiB | zero | yes |
| 42 | App_Logging | 3100672 | 3141631 | 0x5EA00000 | 20.0 MiB | zero | yes |
| 43 | rootfs | 3141632 | 3928063 | 0x5FE00000 | 384.0 MiB | SquashFS | no |
| 44 | rootfs_1 | 3928064 | 4714495 | 0x77E00000 | 384.0 MiB | zero | yes |
橙色行是后续刷机/救砖最容易用到的关键分区;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、分区到刷备槽的完整记录。
💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
发表回复