第三章:WiFi固件加载与初始化

好,咱们今天聊聊WiFi固件加载。说实话,这个环节是很多移植工程师的噩梦。我见过太多人卡在这一步,板子死活起不来,最后发现是固件路径配错了。

固件加载,说白了就是给WiFi芯片喂饭吃。芯片上电后只是个空壳,你得把固件、配置、校准数据一股脑塞进去,它才能干活。

3.1 固件文件结构

高通平台的WiFi固件,通常包含这么几个文件。我列个表,大家先混个眼熟:

文件名 作用 是否必须
bdwlan.bin 主固件,WiFi核心代码
otp.bin 一次性编程数据,芯片唯一标识 否(但推荐)
board.bin 板级配置,天线参数等
nv.bin NV校准数据,射频参数

嗯,这里要注意。bdwlan.bin是主固件,体积最大。我见过有人图省事,把不同芯片的bdwlan.bin混用,结果WiFi能扫描但连不上。为什么?因为固件里的寄存器配置对不上。

otp.bin这个文件,很多人会忽略。我个人习惯是一定要带上。它存的是芯片的MAC地址和校准信息。不带的话,每次启动MAC地址都是随机的,这在产品里是致命问题。

3.2 固件加载流程解析

加载流程,我拆成几步来讲。你想想看,芯片上电后其实是个哑巴,你得一步步唤醒它。

  1. 上电复位:芯片进入ROM代码模式,等待主机发指令
  2. 下载主固件:通过SDIO或PCIe接口,把bdwlan.bin灌进去
  3. 固件校验:芯片检查固件签名和CRC,防止被篡改
  4. 加载Board Data:把board.bin里的天线参数写进去
  5. 加载NV Items:把nv.bin里的校准数据写进去
  6. 启动完成:芯片发出Ready信号,可以正常工作了

我在项目中遇到过一个问题:固件加载到第4步就卡死了。查了半天,发现是board.bin的版本和固件不匹配。高通有个规矩,board.bin的版本号必须和固件一致,否则芯片直接罢工。

核心要点:固件加载顺序不能乱。先主固件,再配置,最后校准。跳步或顺序错了,芯片会进入未知状态。

3.3 Board Data配置

Board Data,说白了就是告诉芯片:你长在什么板子上?天线怎么接的?功率多大?

这个文件通常由硬件工程师提供。我建议你拿到板子后,先找硬件要一份board.bin。如果没有,就得自己用高通工具生成。嗯,这里有个坑——board.bin里的天线参数如果写错了,WiFi信号会差得离谱。

Board Data里包含的关键参数:

  • 天线类型:板载天线还是外接天线
  • 天线增益:单位dBi,影响发射功率
  • 频段配置:2.4G还是5G,或者双频
  • GPIO映射:WiFi芯片和主控的引脚连接
  • 时钟配置:外部晶振频率,通常是40MHz或26MHz

我曾经遇到一个案例:客户说WiFi距离只有3米。我一看board.bin,天线增益填了-10dBi。这相当于给天线戴了个口罩,信号能好才怪。改回2dBi后,距离直接到30米。

小技巧:调试阶段,可以把board.bin里的发射功率调低一点,防止烧坏射频前端。等量产时再恢复。

3.4 NV Items校准数据加载

NV Items,全称是Non-Volatile Items。它存的是每台设备独有的校准数据。为什么是每台独有?因为芯片制造有公差,每颗芯片的射频性能都不一样。

NV Items里包含:

  • MAC地址:全球唯一,不能重复
  • TX功率校准:每个频道的发射功率补偿值
  • RX灵敏度校准:接收端的增益调整
  • 温度补偿:不同温度下的功率修正
  • 晶体频率微调:让晶振工作在最佳频率点

加载NV Items时,我建议你注意两点:

第一,NV数据必须和芯片一一对应。量产时每台设备都要单独校准,不能共用一份NV文件。否则会出现这台设备信号好,那台设备信号差的情况。

第二,NV加载失败时,芯片会使用默认值。但默认值通常不准,会导致WiFi性能下降。我见过一个项目,NV加载路径配错了,结果所有设备的WiFi速率都只有正常的一半。

警告:千万不要在生产环境中跳过NV校准。省这一步,后面会付出十倍代价。我曾经帮一个客户返工3000台设备,就是因为NV数据没校准。

3.5 实战中的常见问题

最后,我总结几个实战中容易踩的坑:

  1. 固件路径问题:Linux内核里固件路径是/etc/firmware/,别放错了
  2. 文件权限:固件文件要有读权限,否则加载失败
  3. 版本匹配:bdwlan.bin、board.bin、nv.bin三者版本要一致
  4. 加载超时:如果芯片没响应,检查SDIO/PCIe时钟是否正常
  5. MAC地址冲突:同一局域网内MAC地址不能重复,否则会掉线

嗯,今天就先聊这么多。固件加载这块,说白了就是细心活。你只要把文件放对位置,顺序走对,大部分问题都能解决。下一章咱们聊聊蓝牙协议栈的移植,那个更有意思。