说明:LS1028(LS1028A)上的 SerDes 配置由 RCW(Reset Configuration Word) 决定(是上电/复位时的硬件引脚/SerDes映射配置),同时内核设备树(DT)也必须与 RCW 指定的 SerDes 模式匹配。要切换到 0x99BB 模式,通常需要:准备对应 RCW 二进制 → 更新 U-Boot/Flash 中的 RCW → 修改/编译设备树 → 重启并用 SerDes 验证工具检查。以下按步骤给出可操作方案与示例命令。(CSDN博客)


总体思路(一句话)

生成/替换板级 RCW(对应 0x99BB 模式)→ 将新 RCW 写入板上启动区(QSPI/SD/IFC,取决于你平台)或与 U-Boot 一并烧录 → 修改/编译 DTS/DTB 保证内核按 99BB 分配外设(PCIe/SATA 等)→ 启动并用 NXP SerDes 工具 / 内核日志 / PCIe enumeration 验证通路 → 调整 PHY / link 配置并优化(必要时跑 BIST / eye diagram)。(docs.nxp.com)


详细步骤(可复制执行)

步骤 0 — 准备与风险注意

  • 备份现有 QSPI/SD 卡镜像/U-Boot 与当前 RCW(十分重要)。可以在 U-Boot 下用 md/cp/fatload/tftp 把镜像拉出来。
  • 操作 RCW/烧写会影响上电引脚与高速接口,若RCW错配可能导致板子无法以预期外设启动(例如以太网/PCIe 无法工作),所以请在控制台保持串口并准备恢复原 RCW 的介质(如备用 SD 卡或能通过 JTAG 恢复)。
  • 推荐先在 SD 卡(非 flash)做验证,确认无误后再写入 QSPI/FLASH。(docs.nxp.com)

步骤 1 — 确认当前 SerDes 配置与启动媒介

在串口 U-Boot 提示符下执行(示例):

# 在 U-Boot 或在 Linux 启动日志中查看 RCW 打印
# 在 U-Boot:
printenv
# 或在 u-boot/dtb 日志会打印 Reset Configuration Word
# 在 Linux:
dmesg | grep -i serdes

目标是确认当前 SerDes protocol 值(例如 Using SERDES1 Protocol: 0x30 类似输出)。记录当前值以便回滚。(穆尔电子)


步骤 2 — 获取 / 生成对应 0x99BB 的 RCW

两种常用做法:

A) 使用你板级供应商 / NXP BSP 中已有的 RCW 源(多数 BSP 包含 rcw 模板或生成脚本)。在 LS1028 BSP(LSDK/Flexbuild)里通常能找到 rcw 源文件和示例 RCW,直接修改 serdes protocol 字段为 0x99BB 并生成二进制 RCW。(NXP)

B) 如果没有现成脚本,参考 NXP RCW 文档手工修改 RCW 字段(需要非常小心:RCW 有特定 bit 位定义,SerDes bank/protocol 在特定位)。NXP RCW 文档与设计指南说明了如何配置 SerDes 模式(参考文档)。生成后得到 rcw.bin(或 rcw_image.bin)。(docs.nxp.com)

小提示:某些 BSP 已把 RCW 编入 u-boot 镜像或特定 flash bank(见下面烧写步骤),注意你的板子采用哪种部署方式(QSPI/SD/MMC/IFC)。参考 LSDK 文档查找 rcw 位置。(穆尔电子)


步骤 3 — 在 SD 卡上做验证(强烈推荐)

把新 RCW 放到 SD 卡镜像或放到 tftp 目录上,启动 U-Boot,从 SD 启动并尝试使用新 RCW:

在 U-Boot 中,你可以先把 rcw.bin 载到内存,再用相关更新命令(示例命令依据板级脚本而不同):

tftp 0x80000000 rcw_99bb.bin
# (示例:把 rcw 写入 flash 的偏移,千万注意这里地址)
# 具体写法按你的板子部署文档,例如:
sf probe
sf erase <offset> <size>
sf write 0x80000000 <offset> <size>

注意:不同板子 RCW 的存放方式有差异:有的 RCW 紧跟 U-Boot 或打包在 bank image 中,有的独立在 flash 的固定 offset。一定要参考板级部署文档(Programming a New U-Boot and RCW)。(docs.nxp.com)


步骤 4 — 修改/生成匹配的 Device Tree(DTS → DTB)

RCW 改变了 SerDes lane 的功能分配,内核的设备树(.dts)必须与之对应才能正确驱动 PCIe / SATA / SGMII 等外设。操作要点:

  1. 在你的 BSP / kernel 源中的 board dts 目录,找到对应板子的 *.dts(或 *-ls1028ardb.dts 等)。
  2. 修改或选择与 0x99BB 模式一致的 DTS 片段(参考 LS1028A reference design 的 SerDes assignments 表)。通常是修改 /soc/serdes、pcie、sata、ethernet node 的绑定与 PHY 路径,使之与 lane 映射一致。(Digi-Key)

举例思路(非直接复制):

  • 如果 RCW 在 99BB 模式下把 SerDes1 分配为 2×PCIe + 1×SATA(示例),确保 DTS 中 pcie@...sata@... 节点 enabled,且正确指定 fsl,serdes-lane/assigned-clocks 等属性。
  • 如果板厂提供了多个 DTS 版本(针对不同 serdes protocols),直接选择或合并这些 dts 片段最保险(BSP 通常会提供 protocol 对应的 DTS 示例)。(穆尔电子)
  1. 编译 DTB:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs
# 或使用 LSDK / build 系统编译目标板的 dtb


步骤 5 — 烧写 RCW + U-Boot + DTB(先在 SD 做验证)

  1. 把新的 rcw.binu-boot.bin(若需要)以及 *.dtb 放到 tftp 目录或 SD 卡。
  2. 在 U-Boot 中使用 tftp / mmc 命令把这些文件加载并替换(BSP 文档通常给出具体 update 脚本)。典型流程参见 LSDK 文档“Verification in U-Boot / update rcw and U-Boot”。(穆尔电子)

步骤 6 — 上电/重启 & 初步验证

  • 观察串口输出,注意 U-Boot 与 Linux bootlog 中关于 SerDes 的打印(会显示 “Using SERDES1 Protocol: 0x99BB” 或类似信息)。
  • 进入 Linux 后检查设备是否按预期枚举(例如 PCIe 设备被发现,lspci 有条目;SATA 驱动/磁盘能被识别)。示例命令:
dmesg | grep -i pcie
lspci -vv
dmesg | grep -i serdes
lsblk   # 查看 SATA disk

若 PCIe 没有枚举,先检查 SERDES PLL/REFCLK 是否锁定(dmesg 会有 clue)并确认 PHY driver 是否加载。(community.nxp.com)


步骤 7 — 深度验证(可选但建议)

  • 使用 NXP 的 SerDes Configuration & Validation Tool(QCVS / SerDes 工具)做眼图 / BIST / Tx/Rx equalization 验证,确保链路电气层良好。文档 AN5119 提供如何使用工具做 BIST 和 jitter/eye 测试。(NXP)
  • 进行 PCIe link speed negotiation 与带宽测试,SATA 简单读写测试,SGMII/ETH 用 ethtool 检查 link。
  • 若需要调优:调整 PHY/equalization 参数(通常通过 SerDes tool 或在内核 PHY 驱动/DT 中的属性)直到链路稳定。(NXP)

常见问题 & 排查技巧

  • 板子不开机或无法串口输出:可能 RCW 写错把 UART 引脚改了,准备备用恢复方式(原 SD 卡 / JTAG)。始终先在 SD 卡试验。(docs.nxp.com)
  • 设备树与 RCW 不一致导致驱动不出现:对照 reference design 的 SerDes assignments 表,逐项核对 lane→功能映射,然后重新编译 dtb。(Digi-Key)
  • PCIe 无法枚举:检查 REFCLK、SERDES PLL 锁定、PHY power rails,运行 SerDes BIST。社区也有经验贴排查流程(NXP community 讨论)。(community.nxp.com)

需要的参考/工具(链接)

  • LS1028A Reference Design & SerDes assignments(参考表)— 用于核对 lane 功能分配。(Digi-Key)
  • LS1028A / Layerscape BSP 文档(包含如何在 U-Boot 中验证/更新 RCW 的说明)。(NXP)
  • NXP SerDes Configuration & Validation Tool 文档(AN5119)— SerDes 验证/BIST/eye。(NXP)
  • 社区经验贴:“How can I change serdes mode 99BB on ls1028?” 与 CSDN 实践贴(提供实战操作思路)。(community.nxp.com)

最后给你一份「最小可行验证清单」—— 做完这些就能判定是否成功

  1. 在 U-Boot 串口看到 Using SERDESx Protocol: 0x99BB(或等效日志)。
  2. Linux 下 dmesg 报告 PCIe / SATA driver 被识别(lspci 能列出设备 / lsblk 显示 SATA 磁盘)。
  3. 使用 ethtool / smartctl / fio 等工具对链路做功能测试(链路速率、读写)。
  4. (可选)用 NXP SerDes Tool 做 eye / BIST 检测确认信号与抖动在可接受范围内。

如果你愿意,我可以接着为你做任一一项具体交付(我会直接给出可复制命令 / 补丁 / dts 片段):

  • A)帮你在 LSDK / BSP 源中定位并修改 RCW 源(并给出生成 rcw.bin 的步骤);或
  • B)根据你的板级代码仓(把 repo 链接/压缩包发来)给出精确的 DTS 修改差异(patch)并给出 dtb 编译命令;或
  • C)给出一套 U-Boot 下用于在 SD 卡上安全验证并回滚的具体脚本(包含 tftp/mmc 命令)。

你选 A、B 或 C(或者直接把你的板子型号 / BSP 目录结构发来),我就把对应可执行的文件/命令/patch 一次性给你。