第一章 高通平台概述
1.1 高通SoC架构简介
做无线协议栈移植,首先得搞清楚你面对的平台长什么样。高通SoC,说白了就是一颗高度集成的芯片。它把CPU、GPU、DSP、ISP,还有我们最关心的WiFi和蓝牙模块,全塞进了一个封装里。
我个人习惯把高通SoC分成三个域来看:
- 应用处理器域(APSS):跑Linux/Android系统的地方。你的WiFi驱动、蓝牙协议栈上层,都在这儿运行。
- 调制解调器域(MPSS):负责蜂窝通信。嗯,这个域跟我们做WiFi/BT移植关系不大,但有时候调试共存问题会涉及。
- 连接子系统(CNSS):这才是我们的主战场。WiFi和蓝牙的固件、硬件加速器,全归它管。
我在项目中遇到过一种情况:APSS和CNSS之间的通信通道没配好,导致WiFi扫描结果一直为空。查了两天才发现是IPC中断路由表配错了。你想想看,这种问题光看代码是看不出来的。
核心要点:高通SoC里,WiFi和蓝牙不是独立芯片,而是作为CNSS的一部分存在。它们通过共享内存和APSS交换数据。
1.2 WCN系列芯片介绍
高通WCN系列,是专门做连接功能的芯片家族。我这些年经手过的型号不少,挑几个典型的说说:
| 型号 | WiFi标准 | 蓝牙版本 | 典型应用 |
|---|---|---|---|
| WCN3660 | 802.11a/b/g/n | BT 4.0 | 老款手机、IoT设备 |
| WCN3680 | 802.11ac | BT 4.2 | 中端手机、平板 |
| WCN3990 | 802.11ac Wave-2 | BT 5.0 | 旗舰手机、车载 |
| WCN685x | 802.11ax (WiFi 6) | BT 5.2 | 最新旗舰、VR设备 |
这里有个坑,我曾经踩过:WCN3680和WCN3990的固件加载方式完全不同。前者用SDIO,后者用PCIe。如果你拿WCN3680的移植经验直接套到WCN3990上,嗯,等着加班吧。
我的建议:拿到新平台后,第一件事不是看代码,而是去查WCN芯片的Power Management文档。电源管理序列错了,芯片根本起不来。
1.3 WiFi/BT协议栈整体架构
高通的协议栈,分三层。我习惯从下往上讲:
- 固件层(Firmware):跑在CNSS内部。处理最底层的帧收发、速率控制、蓝牙基带。这部分我们一般不动,除非要修bug。
- 驱动层(Driver):跑在APSS的内核空间。高通的WiFi驱动叫
wlan.ko,蓝牙驱动叫btusb.ko。它们负责和固件通信,向上提供接口。 - 协议栈层(Protocol Stack):跑在用户空间。WiFi这边是
wpa_supplicant,蓝牙那边是BlueZ。我们移植时,主要改的是驱动层和协议栈的适配层。
为什么会这样分层?说白了,是为了解耦。固件处理实时性要求高的活儿,驱动做数据搬运,协议栈管策略。我在移植WCN3990时,就遇到过驱动和固件版本不匹配的问题——驱动发了一个新格式的命令,固件不认识,直接死机。
注意:高通协议栈的版本号很讲究。比如WLAN.HL.3.0和WLAN.HL.3.1,API可能不兼容。我曾经因为没注意小版本号,多花了一周时间适配。
1.4 移植前的准备工作与环境搭建
好,到了动手环节。移植前,你得把家伙事儿备齐。我列个清单:
- 硬件:目标板(带高通SoC)、JTAG调试器、串口线、电源。别小看串口线,我见过有人用劣质线,数据丢包严重,查了半天以为是驱动问题。
- 软件:高通提供的
QCAMSS包(包含驱动源码、固件、工具链)、Linux内核源码(版本要匹配)、交叉编译工具链。 - 文档:
80-NL466-1(WCN芯片硬件手册)、80-NL467-1(协议栈移植指南)。这两份文档,我建议打印出来放桌上。
环境搭建的步骤,我一般这么走:
# 1. 安装交叉编译工具链
sudo apt-get install gcc-arm-linux-gnueabihf
# 2. 解压高通SDK
tar -xzf qca-mss-5.4.tar.gz
cd qca-mss-5.4
# 3. 配置内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make menuconfig
# 在Networking support -> Wireless 中启用高通驱动
这里有个细节:编译内核时,记得把CONFIG_QCACLD和CONFIG_BT_HCIBTUSB选上。我刚开始做移植时,漏了蓝牙的HCI驱动配置,结果蓝牙一直报hci0: command tx timeout。
避坑指南:我曾经因为内核版本太新,导致高通驱动编译不过。后来学乖了,先用高通SDK里推荐的内核版本。等驱动跑通了,再考虑升级内核。
最后,验证环境是否搭好。我习惯先编译一个最小的测试镜像,烧到板子上,确认串口能打印、网络能ping通。这一步看似简单,但能帮你排除掉80%的环境问题。
嗯,第一章就讲这么多。记住,移植不是写代码,而是配环境、读文档、调参数。后面几章,我会带你一步步把WiFi和蓝牙跑起来。