Qcom底层WIFI驱动简介(一)


前言

前面以一些基本的WIFI操作为例子,讲解了上层的一些流程调用,这篇开始讲讲底层驱动的一些基本流程。包括驱动是如何初始化的,以及STR相关的驱动处理等。


一、CNSS2驱动简介

先从串口看一下编译出来的模块,在/vendor_dlkm/lib/modules路径下,可以看到以下相关ko模块:

-rw-r--r-- 1 root root   4414544 2009-01-01 00:00 cnss2.ko
...
-rw-r--r-- 1 root root 328085816 2009-01-01 00:00 qca_cld3_qca6390.ko
-rw-r--r-- 1 root root 392532288 2009-01-01 00:00 qca_cld3_qca6490.ko
-rw-r--r-- 1 root root 259933344 2009-01-01 00:00 qca_cld3_qcn7605.ko

通过lsmod命令也可以看到如下内容:

qca6490             10862592  0
cnss2                 356352  1 qca6490

不难看出,编译出来的文件主要是cnss2模块以及qca不同型号对应的模块,实际会根据具体芯片加载具体的qca驱动。
比如qca6490就是硬件对应使用的驱动,那么cnss2后面信息是记载的used by内容,也就是cnss2是被qca6490所使用的。
因此从上面信息可以看出来cnss应该是qca驱动的一个子模块,或者子系统。

为了更好的理解,再来看看官方的解释:
CNSS2为qcom的wlan驱动(qca)的一个子系统。驱动程序旨在将 PCIe 驱动程序打包,并在主机设备驱动程序级别中添加特殊的 Qualcomm WLAN 驱动程序功能,这在常见的 Linux 内核设备驱动程序中是不包含的。
CNSS2 是连接子系统软件 (CNSS) 的第二个版本,用于支持 qcacld3.0 主机驱动程序。

cnss2(Connectivity Subsystem driver 2.0)从他的名字来看,就是用于连接的子系统一个驱动。因为网卡芯片的接口不同,比如常见的PCIe,还有一些使用的是SDIO接口,也有使用USB接口的网卡。不同的接口意味着对应的处理也不同,那么作为网络驱动,Qcom将共通的部分作为主驱动,即qca,而对于不同接口以及不同芯片的处理剥离出来作为其子系统,即cnss
这样针对不同的芯片,不同的接口在处理上的差分我们就只需要关注cnss驱动即可。

二、QCA_CLD驱动简介

qcacld作为网络设备主驱动,那么通常网络设备需要注册的网络接口等都是在这里操作的,以及数据的发送和接收。

static const struct net_device_ops wlan_drv_ops = {
	.ndo_open = hdd_open,
	.ndo_stop = hdd_stop,
	.ndo_uninit = hdd_uninit,
	.ndo_start_xmit = hdd_hard_start_xmit,
	.ndo_fix_features = hdd_fix_features,
	.ndo_set_features = hdd_set_features,
	.ndo_tx_timeout = hdd_tx_timeout,
	.ndo_get_stats = hdd_get_stats,
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)
	.ndo_do_ioctl = hdd_ioctl,
#endif
	.ndo_set_mac_address = hdd_set_mac_address,
	.ndo_select_queue = hdd_select_queue,
	.ndo_set_rx_mode = hdd_set_multicast_list,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0)
	.ndo_siocdevprivate = hdd_dev_private_ioctl,
#endif
};

除此之外,它还要负责接收netlink的消息,因此对应的cfg80211处理接口的注册也都是在这里实现的:

static struct cfg80211_ops wlan_hdd_cfg80211_ops = {
	.add_virtual_intf = wlan_hdd_add_virtual_intf,
	.del_virtual_intf = wlan_hdd_del_virtual_intf,
	.change_virtual_intf = wlan_hdd_cfg80211_change_iface,
	.change_station = wlan_hdd_change_station,
	.start_ap = wlan_hdd_cfg80211_start_ap,
	.change_beacon = wlan_hdd_cfg80211_change_beacon,
	.stop_ap = wlan_hdd_cfg80211_stop_ap,
	.change_bss = wlan_hdd_cfg80211_change_bss,
	.add_key = wlan_hdd_cfg80211_add_key,
	.get_key = wlan_hdd_cfg80211_get_key,
	.del_key = wlan_hdd_cfg80211_del_key,
	.set_default_key = wlan_hdd_cfg80211_set_default_key,
	.scan = wlan_hdd_cfg80211_scan,
	.connect = wlan_hdd_cfg80211_connect,
	.disconnect = wlan_hdd_cfg80211_disconnect,
...

三、总结

总的来说,通常网络设备的注册,网络设备接口的实现,以及通信等处理,都是在qcacld驱动中完成和处理的。
而关于具体芯片的接口注册和处理,以及芯片的电源控制,都是在cnss中完成的。

<think>嗯,用户想了解高通WiFi驱动框架的相关信息,包括架构和组件。首先,我需要回忆下Android系统的整体架构,因为高通的WiFi驱动应该是在Linux内核层工作的。根据引用[2],Android的核心系统服务基于Linux内核,所以WiFi驱动应该属于内核层的部分。 接下来,用户可能需要知道高通的WiFi驱动在整个Android系统中的位置。根据引用[1],Android WiFi的整体架构分为用户空间、内核空间和硬件层。高通的驱动应该属于内核空间的部分,特别是作为WLAN驱动模块存在。高通通常会提供SoftMAC架构的驱动,这涉及到mac80211子系统,这个子系统负责管理无线接口和协议栈的交互。 然后,组件方面,可能包括WLAN固件、驱动模块(比如qca6174)、cfg80211和mac80211这些Linux内核的无线子系统。cfg80211提供配置管理,而mac80211处理更底层的MAC层功能。另外,用户空间的服务如wpa_supplicant和Hostapd也是重要的,它们通过netlink与内核通信,处理认证和接入点管理。 用户可能还想知道高通特有的组件,比如WiFi HAL(硬件抽象层),这部分在Android系统中允许上层通过HIDL接口访问驱动功能。同时,高通可能会优化电源管理和吞吐量,这些属于驱动层的优化点。 需要注意的是,引用[3]提到NFC的相关知识,但用户的问题是关于WiFi的,所以可能不需要涉及NFC的内容。不过,结构上可以参考类似的模块分析方式,比如驱动框架的分层和与硬件的交互。 最后,要确保回答结构清晰,分点说明架构和组件,并引用相关的参考资料。同时,生成的相关问题要围绕驱动框架的优化、调试、与其他模块的交互等方面展开,帮助用户进步深入学习。</think>### 高通 WiFi 驱动框架介绍 #### 、整体架构 高通WiFi驱动框架基于Linux内核的无线子系统,主要分为以下三层: 1. **硬件层** 包括WiFi芯片(如QCA系列)、射频前端及天线模块,负责信号收发和物理层协议处理[^1][^2]。 2. **驱动层** - **WLAN固件**:高通芯片运行的专有固件,实现协议栈和硬件控制 - **Linux内核驱动模块** - `cfg80211`:提供无线配置接口 - `mac80211`:实现软件MAC层功能(如帧封装/解析) - 高通定制驱动(如`qca6174.ko`):处理芯片寄存器操作、DMA传输等底层交互 - 采用SoftMAC架构,MAC层功能由软件实现[^3] 3. **用户空间服务** - `wpa_supplicant`:实现WPA/WPA2认证 - `hostapd`:管理AP模式 - Android WiFi HAL:通过HIDL接口向上层提供标准API #### 二、核心组件详解 1. **mac80211子系统** 实现以下关键功能: $$ \text{帧分类} \rightarrow \text{速率控制} \rightarrow \text{重传机制} \rightarrow \text{QoS调度} $$ 通过`ieee80211_ops`结构体注册驱动回调函数。 2. **cfg80211接口** 提供`nl80211` netlink接口,支持以下操作: ```c // 典型配置流程 struct cfg80211_ops qcom_ops = { .change_virtual_intf = qca_vintf_change, .scan = qca_hw_scan, .connect = qca_connect }; ``` 3. **电源管理** 采用WOWLAN(Wake-on-WLAN)技术,通过以下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IAYL.BL

创作不易,投个硬币😆

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值