3、Wi-Fi 固件与 NVRAM:固件加载流程、NVRAM 参数配置、校准数据管理
Wi-Fi 芯片要跑起来,离不开两样东西:固件和NVRAM。固件是芯片的"操作系统",NVRAM 则是它的"出厂身份证"。这两者搞错了,Wi-Fi 要么起不来,要么性能一塌糊涂。
我个人习惯把这一章当作调试 Wi-Fi 的第一道关卡。很多"Wi-Fi 连不上"的假故障,其实都是固件没加载对,或者 NVRAM 参数配错了。
3.1 固件加载流程
Wi-Fi 芯片上电后,内部只有一段很小的 BootROM。真正的协议栈代码,需要主机通过 SDIO/USB/PCIe 接口下载进去。这个过程,我们叫它固件加载。
核心流程:
- 主机驱动申请内存,从文件系统读取
.bin固件文件 - 驱动通过总线将固件数据写入芯片的 RAM 区域
- 芯片 BootROM 校验固件签名(如果有的话)
- 芯片跳转到固件入口地址,开始执行
- 固件初始化硬件,上报 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、校准数据的关系串起来了。我建议你把它打印出来贴在工位上。
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,备份好,再开始做驱动移植。