3、Wi-Fi 固件与 NVRAM:固件加载流程、NVRAM 参数配置、校准数据管理

Wi-Fi 芯片要跑起来,离不开两样东西:固件和NVRAM。固件是芯片的"操作系统",NVRAM 则是它的"出厂身份证"。这两者搞错了,Wi-Fi 要么起不来,要么性能一塌糊涂。

我个人习惯把这一章当作调试 Wi-Fi 的第一道关卡。很多"Wi-Fi 连不上"的假故障,其实都是固件没加载对,或者 NVRAM 参数配错了。

3.1 固件加载流程

Wi-Fi 芯片上电后,内部只有一段很小的 BootROM。真正的协议栈代码,需要主机通过 SDIO/USB/PCIe 接口下载进去。这个过程,我们叫它固件加载。

核心流程:

  1. 主机驱动申请内存,从文件系统读取 .bin 固件文件
  2. 驱动通过总线将固件数据写入芯片的 RAM 区域
  3. 芯片 BootROM 校验固件签名(如果有的话)
  4. 芯片跳转到固件入口地址,开始执行
  5. 固件初始化硬件,上报 Ready 事件给主机

我在项目中遇到过最典型的问题:固件文件路径配错了。Tina Linux 默认固件路径在 /lib/firmware/ 下,但有些 SDK 改到了 /etc/firmware/。驱动找不到文件,直接报 Firmware request failed。

调试技巧: 用 lsmod | grep wifi 确认驱动已加载,再用 dmesg | grep firmware 查看加载日志。如果看到 Direct firmware load for ... failed,先检查路径。

以 Realtek 8821CS 为例,加载顺序是这样的:

# 驱动加载时自动触发
rtw88: loading firmware rtw88/rtw8821c_fw.bin
rtw88: firmware loaded, size: 56320 bytes
rtw88: firmware version 24.5.0, build time 20220301
rtw88: firmware started, ready to scan

嗯,这里要注意:有些芯片需要多段固件。比如 Broadcom 的 brcmfmac 驱动,会先加载 brcmfmac43430-sdio.bin,再加载 brcmfmac43430-sdio.clm_blob。少一个都不行。

3.2 NVRAM 参数配置

NVRAM 全称 Non-Volatile RAM,说白了就是芯片的"出厂配置表"。它存了每个板子的独有参数:MAC 地址、天线增益、频段校准值等等。

你想想看,同一款芯片贴在不同 PCB 上,天线走线长度不一样,匹配电路也不一样。如果没有 NVRAM 做差异化校准,那 Wi-Fi 性能就只能看运气了。

参数名 含义 典型值
macaddr MAC 地址 00:11:22:33:44:55
ccode 国家码,影响信道列表 CN / US / EU
regrev 法规修订版本 0 ~ 255
boardflags 板级特性标志位 0x1000
pa0maxpwr PA 最大发射功率 (dBm) 20
antswitch 天线开关配置 0x1

我曾经踩过一个坑:某批次模组的 NVRAM 里 ccode 写的是 US,导致在中国区 5G 信道只能扫到 36~48,149~165 全没了。改回 CN 后一切正常。

注意: NVRAM 文件通常以 .txt 或 .nvram 结尾,放在固件同目录下。驱动加载时会自动匹配。文件名必须与芯片型号严格对应,比如 brcmfmac43430-sdio.txt。

3.3 校准数据管理

校准数据是 NVRAM 里最敏感的部分。它记录了每颗芯片在产线上测出来的个体差异。比如:

  • TX 功率校准:每个频点、每个速率下的最佳发射功率
  • RX 灵敏度校准:接收链路的增益补偿值
  • 温度补偿:PA 增益随温度变化的曲线
  • IQ 校准:调制解调器的正交误差修正

这些数据一旦丢失或损坏,Wi-Fi 还能用,但性能会大幅下降。我见过一个案例:某客户反馈 2.4G 吞吐量只有 10Mbps,查了半天发现是校准数据全为 0,芯片用默认值在工作。

备份建议: 量产前一定要把校准数据从模组里读出来,存到文件系统。Tina Linux 下可以用 wl 工具或 iwpriv 命令导出:

# Broadcom 芯片
wl dump nvram > /data/nvram_backup.txt

# Realtek 芯片
iwpriv wlan0 set_mib dump_regulatory

3.4 知识体系总览

下面这张图把固件、NVRAM、校准数据的关系串起来了。我建议你把它打印出来贴在工位上。

Wi-Fi 固件与 NVRAM 知识体系 主机驱动 (Kernel) 固件文件 (.bin) NVRAM 文件 (.txt) Wi-Fi 芯片 (SDIO/USB/PCIe) BootROM → 加载固件 → 解析 NVRAM → 初始化硬件 校准数据管理 TX 功率校准 RX 灵敏度校准 温度补偿 / IQ 校准 NVRAM 参数配置 MAC 地址 / 国家码 天线增益 / 板级标志 PA 最大功率 / 天线开关 调试手段:dmesg / iwpriv / wl / 固件日志 检查加载状态 → 验证参数 → 导出校准数据

3.5 常见故障与定位

最后,我把实际调试中遇到最多的几个问题列出来,你可以直接对照排查:

现象 根因 快速定位
Wi-Fi 无法启动 固件文件缺失或路径错误 dmesg | grep firmware
扫描不到任何 AP NVRAM 国家码导致信道被禁 检查 ccode 和 regrev
吞吐量极低 校准数据丢失或全零 导出 NVRAM 对比出厂值
连接后频繁断线 TX 功率过高导致 PA 饱和 降低 pa0maxpwr 测试
MAC 地址随机变化 NVRAM 中 macaddr 未设置 手动写入固定 MAC

重要提醒: 量产时,NVRAM 文件必须与模组一一对应。不要图省事用同一个 NVRAM 刷所有板子,否则每块板的校准数据都一样,性能会参差不齐。

嗯,这一章的内容就到这里。固件和 NVRAM 是 Wi-Fi 的根基,根基不稳,后面所有调试都是白费力气。我建议你拿到一个新模组时,第一件事就是导出它的完整 NVRAM,备份好,再开始做驱动移植。