高通 Wi-Fi 驱动实录:揭秘高通 QRTR 协议栈的“幕后黑手”
我们依然从一个真实的“现场”出发来探究其背后的技术细节。最近在 Amlogic S905x5 平台上适配高通 Wi-Fi 7QCC2072/PCIe 接口芯片时我们遇到了 QRTRQualcomm IPC Router版本不匹配的问题。具体 LOG 如下当然这个问题最后并不是 QRTR 的问题仍然是内存的原因。不过正好借此机会我们聊一聊高通 QRTR 机制。一、 前世今生为什么会有 QRTR我们先来聊一聊 QRTR 的历史背景为什么会有 QRTR在 QRTR 出现之前以及早期的高通平台APApplication Processor与其他子系统如 ModemADSPWi-Fi FW的通信往往依赖于特定的字符设备驱动或私有的内存共享机制如老旧的 SMD - Shared Memory Driver。这种方式有几个明显的痛点私有接口难以维护每次新增一个子系统或者改变底层传输方式比如从共享内存改为 PCIe上层应用都需要修改代码。点对点限制老的机制通常是点对点的Point-to-Point难以处理复杂的路由例如 AP 要通过 Modem 转发消息给另一个挂在 PCIe 上的外设。缺乏服务发现就像没有 DNS 的网络客户端很难知道某个服务例如位置服务、Wi-Fi 控制服务到底运行在哪个 DSP 上端口是多少。QRTRQualcomm IPC Router的引入就是为了解决这些问题。它在 SoC 内部构建了一个“微型互联网”如上图所示QRTR 的核心改进在于接口标准化Socket 化QRTR 在 Linux 内核中实现了一个新的协议族 AF_QIPCRTRLinux 用户空间可以使用标准的 socket 来进行跨核通信。这对于 Linux 开发者来说极其友好。传输层解耦QRTR 位于协议层。底层传输可以是共享内存GLINK/SMEM也可以是 MHI通过 PCIe 传输常见于外挂 Modem/Wi-Fi上层应用完全无感。动态服务发现QRTR 引入了类似 名字服务Name Service的机制服务启动时会广播自己的 ID客户端可以动态查询。QRTR 如何像一个“中央路由器”一样连接起不同架构、不同操作系统的处理器核心。1.1 QRTR 它是如何工作的你可以把 QRTR 想象成一个运行在 SoC 内部的微型互联网如上图所示。地址结构node:portNode节点 ID每个子系统有一个唯一的 ID。例如APApplication Processor可能是 1Modem 可能是 0 或 2ADSP 可能是 3。Port端口号类似于 TCP/UDP 端口。每个服务Service监听一个端口。例如QMI 服务通常会绑定到一个特定的 Port。协议栈位置上层ApplicationQMIQualcomm MSM Interface消息通常作为 Payload 封装在 QRTR 包中传输。中间层Router QRTR 负责路由。它决定这个包是发给本机的另一个进程还是发给 Modem或者是转发给 ADSP。底层Transport真正的物理数据搬运工如 GLINK基于 RAM 的轻量级链路或 MHIHost Interface基于 PCIe。我们可以从驱动开发的视角纵向切开 APApplication Processor纵观 QRTR 是如何从用户态一步步穿透内核最终到达硬件驱动。1.2 为什么高通 Wi-Fi 驱动这么复杂讲完了理论我们回到移植现场。如果你习惯了 Realtek 或 Broadcom 的 Wi-Fi 驱动第一次接触高通 Wi-Fi如 QCC2072移植到第三方平台如 Amlogic/Rockchip时大概率会产生疑问“为什么不像 Realtek 那样直接用 PCIe/SDIO 读写寄存器或者发个简单的 Mailbox 就不行非要搞这么一套复杂的 Socket QMI MHI 机制”其实并不是 Wi-Fi 驱动想用 QRTR而是 Wi-Fi 芯片里的固件Firmware只认 QRTR/QMI。固件架构决定现代高通 Wi-Fi 芯片内部运行着独立的操作系统通常是 ThreadX 或类似的 RTOS并没有为 PCIe 专门写一套控制协议。它们复用了高通 Modem基带的成熟架构。通信对等性在芯片内部Wi-Fi 控制平面Control Plane被视为一个“服务”Service。固件启动后会通过 QRTR 协议向外界广播“我是 Wi-Fi 服务我在节点 X端口 Y有人要连我吗”初始化流程强依赖当你在 Amlogic 上加载 wlan.ko 时驱动必须通过 QRTR 发送 QMI 消息来完成最基本的初始化。例如Capability Exchange告诉固件 Host 端支持多大的内存、什么特性QMI_WLFW_HOST_CAP_REQ。BDF Download下发板级数据Board Data File告诉芯片射频参数。Mode Switch通知固件进入 FTM测试模式还是 Mission正常工作模式。如果没有 QRTR这些握手无法完成芯片连射频都开不起来。1.2.1 利弊分析针对非高通 SoC 宿主对于我们这些移植者Amlogic/Rockchip 开发者来说这确实是一把双刃剑。弊端门槛高启动流程复杂内核配置的“全家桶”依赖你不能只开一个 Wi-Fi 驱动。为了让 Wi-Fi 跑起来你必须在 Linux Kernel 里搞一整套高通的“周边基建”QRTR / MHI / QMI。这对于追求精简的嵌入式系统是负担。调试难度呈指数级上升传统的 PCIe Wi-Fi 驱动加载可能就是“Probe - 寄存器读写 - Ready”。而高通的流程是PCIe Link Up - MHI 初始化 - MHI 通道建立 - QRTR 握手 - QMI 消息往返 - WMI 初始化 - Ready。这中间任何一个环节比如 MHI 状态机卡住都会导致 Wi-Fi 无法启动。好处控制面与数据面彻底解耦。这是最大的技术优势也是高通敢于这么设计的底气。QRTR 只负责控制指令如“扫描”、“连接”、“设置功率”等低频操作。独立的数据通道真正的大流量数据sk_buff走的是独立的 DMA 环CE - Copy Engine 或基于 MHI 的数据通道。这意味着即使控制面因为某种原因阻塞比如 QMI 消息多也不会直接卡死数据传输反之亦然。工具链复用与远程调试因为走了 Socket理论上你可以在 Amlogic 的用户空间写一个工具直接给 Wi-Fi 固件发 QMI 指令查询内部状态温度、死机堆栈等而不需要改内核驱动。甚至你可以用 qrtr-lookup 看到 Wi-Fi 固件在线状态甚至可以用高通的工具直接通过 TCP/IP 远程连接到 QRTR 端口上调试 Wi-Fi 固件。二、Show Me The Code核心代码解析前面梳理了高通 QRTR 的技术原理下面我们扒一扒其源码看看它是如何落地的。下面所有代码都是基于高通 QCC2072 Wi-Fi 驱动及 Linux qrtr 核心模块。如需代码请扫下面群二维码。QRTR 在 Wi-Fi 驱动框架中的核心逻辑基本都藏在如下几个文件中2.1 QRTR 的架构层次我们先看整体总观下 QRTR 的整体架构。在 Linux 内核空间中QRTR 其实并不是孤立存在的它通过清晰的分层向上承接 Socket 调用向下对接硬件总线。如下所示QMI 和 QRTR 通过内核 socket 进行上下层的通信。如上所示QMI 通过 socket 接口下发指令到 QRTRQRTR 负责路由分发它不知道底层是 PCIe 还是共享内存它只认 Node ID。如上图的 Wi-Fi 架构下QRTR 把包发送给 MHI 的 Ring Buffer然后下发给 Wi-Fi 固件。2.2 QRTR 初始化流程对很多做驱动的同学来说一个完整的调用栈往往能让事情事半功倍那我们就来看看 QRTR 在 unified_wlan_cnss_core.c 中调用栈的情况。如上图所示mhi_init先修路。MHI 总线驱动必须先 ReadyPCIe 链路必须通。qrtr_proto_init再建邮局。注册 AF_QIPCRTR 协议族。qrtr_ns_init雇佣邮递员。启动名字服务Name Service准备广播 Hello 包。qrtr_mhi_init最后通车。将 MHI 通道注册为 QRTR 的一个 Endpoint端点打通任督二脉。Endpoint端点管理qrtr.hEndpoint端点结构qrtr.h协议族注册成功后内核就会挂载以下 socket opsqrtr.c2.3 核心数据结构QRTR 的“语言”路通了后我们再来聊一聊 QRTR 如何通信QRTR 定义了一套自己的包结构。具体如下所示Socket 地址结构linux_inc/uapi/linux/qrtr.h协议头格式V1 协议头qrtr.c- 32字节协议头格式V2 协议头qrtr.c- 紧凑格式消息类型linux_inc/uapi/linux/qrtr.h2.4 桥梁MHI 传输层与 API 接口QRTR 的核心层是不碰硬件的它依赖“端点Endpoint”来传输数据。在 Wi-Fi 场景下这个端点就是 MHI。设备结构mhi.c数据流mhi.c发送路径qrtr_sendmsg - node_enqueue - mhi_queue_skb。数据被封装成 sk_buff直接塞入 MHI 的发送队列。接收路径MHI 收到中断 - dl_callback - qrtr_endpoint_post。数据从 PCIe 出来后被丢进 QRTR 的接收队列唤醒等待的 Socket。MHI 通道配置mhi.c2.5 命名服务ns.c为什么不需要知道 Wi-Fi 固件在哪个 Node全靠 NSName Service在后台默默工作。核心数据结构命名服务工作流程核心机制广播NS 启动后会向广播地址发送 HELLO。监听Wi-Fi 固件收到 HELLO回复 NEW_SERVER告诉 AP“我是 Wi-Fi 控制服务我在 Node X”。记录内核更新本地的 Radix Tree基数树将服务 ID 映射到具体的 Node ID。以后应用层发包只需要填“服务 ID”内核自动查找路由表发给对应的 Node。2.4 流控制机制qrtr.c在实战中“发送阻塞”是驱动 Hang 死的最大元凶。QRTR 设计了一套基于水位的流控机制。水位机制QRTR_TX_FLOW_HIGH当待确认的包超过 10 个发送线程就会被强制休眠。QRTR_TX_FLOW_LOW只有当对端确认了足够多的包Pending 数降到 5 以下发送线程才会被唤醒。流控制逻辑通过上述组略的浏览大家我们对高通 Wi-Fi 驱动的底层通信逻辑有一个了解了。其实代码只是骨架数据流才是灵魂。看懂了静态的数据结构并不代表就能搞定驱动代码。真正的挑战发生在其系统上电的那几百毫秒内——QMI 消息是如何被层层封装塞进 QRTR 的信封最后跳上 MHI 的高速列车的当 Wi-Fi 固件“嗷嗷待哺”请求 BDF板级数据时驱动是如何通过 QMI 握手精准响应的为什么我的 Log 里全是 QMI transaction failed究竟是 MHI 的通道堵了还是 QRTR 的路由丢了下一篇我们将离开静态代码结合驱动 Log逐帧拆解 QMI/QRTR/MHI 的交互逻辑。希望本文对你所有帮助也欢迎大家私信或者评论区积极讨论相互学习一起成长。独行者速众行者远。连接 · 交流 · 共创。欢迎加入微信群聊Join US保持联系保持好奇。若二维码过期或群满请添加微信19901741315备注“入群”拉你一把。

相关新闻

2026 年 PMP 备考攻略:学长亲测!不同基础考生的精准周期 + 避坑指南

2026 年 PMP 备考攻略:学长亲测!不同基础考生的精准周期 + 避坑指南

作为已经上岸的学长,深知 PMP 这张项目管理领域的 “硬通货” 证书,让不少职场人在备考周期上犯了难。身边有人 1 个月碎片时间冲刺成功,也有人稳扎稳打 3 个月轻松过关,但更多人是因为没找对自己的节奏,盲目压缩或拖延…

2026/7/10 23:37:17 阅读更多 →
MybatisPlus工具(详细教程)

MybatisPlus工具(详细教程)

基本使用导入包&#xff1a;<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> 数据源配置&#xff1a;spring: datasource: drive…

2026/7/10 22:30:44 阅读更多 →
一文搞懂RPC、gRPC与Protobuf:分布式通信的核心技术栈

一文搞懂RPC、gRPC与Protobuf:分布式通信的核心技术栈

在分布式系统中&#xff0c;不同服务间的高效通信是核心需求之一。RPC、gRPC与Protobuf作为一套协同工作的技术组合&#xff0c;广泛应用于微服务、跨语言通信等场景。本文将逐一拆解三者的核心概念、工作原理&#xff0c;并重点分析RPC与HTTP的差异&#xff0c;帮助大家理清技…

2026/7/10 22:29:30 阅读更多 →

最新新闻

3个声音痛点如何解决?eqMac系统级音频均衡器让你的Mac音质脱胎换骨

3个声音痛点如何解决?eqMac系统级音频均衡器让你的Mac音质脱胎换骨

3个声音痛点如何解决&#xff1f;eqMac系统级音频均衡器让你的Mac音质脱胎换骨 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer &#x1f3a7; 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 你是否经常在视频会议中听不清对方讲话…

2026/7/10 23:38:04 阅读更多 →
荣获年度私域服务商的拓氪科技,GEO能力升级了吗?

荣获年度私域服务商的拓氪科技,GEO能力升级了吗?

2026年&#xff0c;生成式AI大模型全面重构全球信息检索、商业采购与用户消费决策体系&#xff0c;逐步替代传统搜索引擎&#xff0c;成为品牌信息传播、企业商务对接、用户获取服务的核心主流渠道。随着新加坡、欧美等跨境市场持续扩容&#xff0c;中国工贸出海品牌迎来确定性…

2026/7/10 23:36:04 阅读更多 →
终端剪贴板神器!xclip命令超全详解|Linux命令行复制粘贴终极方案

终端剪贴板神器!xclip命令超全详解|Linux命令行复制粘贴终极方案

1. 命令简介 xclip 是一个用于在命令行中管理 X Window 系统粘贴板&#xff08;剪贴板&#xff09;的工具。它允许用户在终端和图形界面之间高效地复制和粘贴文本或文件内容&#xff0c;支持 X 系统中的 Selections 和 Cut Buffers 两种剪贴板机制。 主要用途包括&#xff1a…

2026/7/10 23:36:04 阅读更多 →
ft_engine性能优化秘籍:3个技巧让您的应用在Linux桌面飞起来

ft_engine性能优化秘籍:3个技巧让您的应用在Linux桌面飞起来

ft_engine性能优化秘籍&#xff1a;3个技巧让您的应用在Linux桌面飞起来 【免费下载链接】ft_engine ft_engine is contains modules window display and window management, providing the core capabilities of the Windows engine 项目地址: https://gitcode.com/openeule…

2026/7/10 23:36:04 阅读更多 →
3步掌握C++ Excel处理:OpenXLSX库的完整实践指南

3步掌握C++ Excel处理:OpenXLSX库的完整实践指南

3步掌握C Excel处理&#xff1a;OpenXLSX库的完整实践指南 【免费下载链接】OpenXLSX A C library for reading, writing, creating and modifying Microsoft Excel (.xlsx) files. 项目地址: https://gitcode.com/gh_mirrors/op/OpenXLSX 还在为C项目中处理Excel文件而…

2026/7/10 23:32:02 阅读更多 →
制造业生产现场管理:计划、组织、协调、控制与检测的全面实践

制造业生产现场管理:计划、组织、协调、控制与检测的全面实践

引言&#xff1a;制造业生产现场管理的核心价值在竞争日益激烈的全球制造业环境中&#xff0c;生产现场的管理水平直接决定了企业的生产效率、产品质量和成本控制能力。对制造业生产现场的各要素进行合理有效的计划、组织、协调、控制和检测&#xff0c;不仅是提升运营效率的关…

2026/7/10 23:30:01 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中&#xff0c;模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器&#xff0c;配合STM32F101ZG这类主流微控制器&#xff0c;能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件&#xff1a;浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域&#xff0c;直流有刷电机因其结构简单、控制方便、成本低廉等优势&#xff0c;仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器&#xff0c;与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻