当前位置: 首页 > news >正文

实战案例分享:Android WLAN Hal层移植(MTK+QCA6696)

本文将详细介绍基于MTK平台,适配高通(Qualcomm)QCA6696芯片的Android WLAN HAL层的移植过程,包括HIDL接口定义、Wi-Fi驱动移植以及wpa_supplicant适配过程,涵盖STA与AP模式的常见问题与解决方法。

1. HIDL接口简介

HIDL(HAL Interface Definition Language)是一种用于定义Android HAL层与Framework之间接口的描述语言(IDL),其核心目的是隔离Framework与厂商提供的HAL实现,使得Framework更新时,无需重新编译厂商的HAL组件。厂商可独立编译并在Vendor分区中单独更新。

HIDL架构

HIDL架构由接口定义、服务端(Server)和客户端(Client)三部分构成。
  • 接口定义(Interface):.hal文件,定义接口及其方法。
  • 服务端(Server):实现HIDL接口,接收客户端调用并返回数据。
  • 客户端(Client):调用服务端提供的接口。
Android 8.0以前,HAL以.so库形式与Framework同进程运行;8.0之后则分属不同进程,通过HIDL进行通信。

2. HIDL的关键文件

HIDL相关的重要文件包括:
  • .hal接口定义文件,如IWifi.hal等以.hal为结尾的文件都是自己创建添加的。这里定义一些未实现的接口。

  • 根据.hal生成的.cpp和.h文件,每对这个文件都是根据前面的.hal生成的,这对文件是实现接口的关键文件。

  • 相关服务启动文件,如android.hardware.wifi@1.0-service.rc、service.cpp。
  • 构建文件,如Android.mk、Android.bp是用Andriod提供的工具生成
以setcountrycode为例:frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiNative.java

frameworks\opt\net\wifi\service\java\com\android\server\wifi\SupplicantStaIfaceHal.java

hardware\interfaces\wifi\supplicant\1.0\ISupplicantStaIface.hal

external\wpa_supplicant_8\wpa_supplicant\hidl\1.1\sta_iface.cpp

3. 移植(STA部分)

Wi-Fi驱动中的wpa_supplicant不是使用的HIDL,换句话说不是为了Andriod设计的,所以我们要使用MTK平台原生的wpa_supplicant。
boardconfig.mk的修改,这里面用到的宏尽量保持和在高通平台用的一致。
准备适配高通的wpa_supplciant时出现问题,关键在于高通的这个wpa_supplicant用的是1.2的,要改成和原来适配的1.1,像下面的报错就是wpa_supplicant中客户端调用的hidl接口没有完全满足。
这个时候就去external\wpa_supplicant_8\wpa_supplicant\hidl\1.1下面去把这些声明加上吗,这是一个比较耗时的操作。
遇到下面这个问题时,换个ctrl_interface
09-01 06:26:22.755 3699 3699 E wpa_supplicant: mkdir[ctrl_interface=/var/run/wpa_supplicant]: No such file or directory
09-01 06:26:22.755 3699 3699 E wpa_supplicant: Failed to initialize control interface '/var/run/wpa_supplicant'.
如下:
ctrl_interface=/data/vendor/wifi/wpa/sockets
#ctrl_interface=/var/run/wpa_supplicant
因为我们执行wpa_cli默认的接口是/var/run/wpa_supplicant,当我们执行wpa_cli时就会去这个接口里找socket,所以此时应该指定接口:
wpa_cli -i wlan0 -p /data/vendor/wifi/wpa/sockets # 这个ctrl_interface只是创建了一个sockets给用户侧交互而已。
把Wi-Fi驱动名字换成wlan.ko,否则会报类似下面的错误:
在我第一天把STA模式导通后,后面导通完AP模式,再来看STA模式时,发现总是报下面的log,找不到原因。
然后就代码跟进去一行一行的看,才发现是以下导致的。
我首先发现以下不对,我是从界面上点击Wi-Fi按钮,log中也能看到WLAN0口起来了
09-16 07:43:01.267 2410 2410 E wificond: :p2p0:wlan0
09-16 07:43:01.267 2410 2410 E wificond: :wlan0:wlan0
为什么下面的代码走的是IfaceType::P2P的分支??
进一步追代码可知,在supplicant.cpp中通过调用wpa_supplicant_get_iface来获取global 接口,默认接口被p2p填充了,而在p2p_supplciant.c中能看到若p2p_disabled参数没有被定义,则p2p会把整个init流程走下来。也就是出问题的点。
而最根本的原因是wpa_supplicant_overlay.conf不知道什么原因没有了,所以得把这个文件加在下面默认的目录下/vendor/etc/wifi/,然后在wpa_supplicant_overlay.conf中会默认定义p2p_disabled=1。
Supplicant.cpp:
constexpr char kStaIfaceConfOverlayPath[] ="/vendor/etc/wifi/wpa_supplicant_overlay.conf";
下面是正常Log(左侧)和异常Log(右侧)的对比。
下面是正常Log:
09-17 05:20:22.112 2912 2912 E wpa_supplicant: Initializing interface 'wlan0' conf '/data/vendor/wifi/wpa/wpa_supplicant.conf' driver 'nl80211' ctrl_interface 'N/A' bridge 'N/A'
09-17 05:20:22.112 2912 2912 E wpa_supplicant: Configuration file '/data/vendor/wifi/wpa/wpa_supplicant.conf' -> '/data/vendor/wifi/wpa/wpa_supplicant.conf'
09-17 05:20:22.112 2912 2912 D wpa_supplicant: Reading configuration file '/data/vendor/wifi/wpa/wpa_supplicant.conf'
09-17 05:20:22.112 2912 2912 D wpa_supplicant: update_config=1
09-17 05:20:22.112 2912 2912 D wpa_supplicant: eapol_version=1
09-17 05:20:22.113 2912 2912 D wpa_supplicant: ap_scan=1
09-17 05:20:22.113 2912 2912 D wpa_supplicant: fast_reauth=1
09-17 05:20:22.113 2912 2912 D wpa_supplicant: pmf=1
09-17 05:20:22.113 2912 2912 D wpa_supplicant: p2p_add_cli_chan=1
09-17 05:20:22.113 2912 2912 D wpa_supplicant: Reading configuration file '/vendor/etc/wifi/wpa_supplicant_overlay.conf'
09-17 05:20:22.113 2912 2912 D wpa_supplicant: disable_scan_offload=1
09-17 05:20:22.113 2912 2912 D wpa_supplicant: p2p_disabled=1

4. 移植(AP部分)

1、AP部分:出现下面的log时,把hostapd.conf中的下面参数注释掉
#ctrl_interface_group=radio
09-10 08:45:53.858 3720 3720 D hostapd : Using existing control interface directory.
09-10 08:45:53.858 3720 3720 E hostapd : billy ctrl_interface_gid_set:1,ctrl_interface:/data/vendor/wifi/wpa/sockets,ctrl_interface_gid:1001,ctrl_iface_group:0
09-10 08:45:53.858 3720 3720 E hostapd : billy1 lchown[ctrl_interface]: Operation not permitted
09-10 08:45:53.858 3720 3720 E hostapd : Failed to setup control interface for wlan0
2、出现下面的权限问题时chmod 777 /sys/module/wlan/parameters/fwpath
3、解决完了会遇到下面的问题。
09-10 10:52:23.461 4043 4043 E android.hardware.wifi@1.0-service: Unknown iface name: ap0
我在hardware/interface下面发现createApIfaceInternal里面获取interface时直接写死成了ap0,不知道是不是MTK的操作。Ap0我们是没有这样的接口的,把它释放后,上面的错误就OK了。
下面是起AP时起的wlan0口。
09-15 00:43:38.992 2579 2677 I WifiNative: Interface state changed on Iface:{Name=wlan0,Id=16,Type=AP}, isUp=true
09-15 00:43:38.992 2579 2677 I WifiNative: Successfully setup Iface:{Name=wlan0,Id=16,Type=AP}

5. 总结

通过上述方法和注意点,能顺利完成MTK平台对QCA6696 WLAN HAL层的移植。整体改下来,主要是改的wpa_supplciant下面的hidl和.c部分,比较少改动hardware/interface/下面,没有改动framework部分。
也就是说主要改的是HIDL 的server端,即接收hidl调用并返回数据的一方,client端怎么调用那是固定好的,比如在该获取interface的时候我们不管它怎么调,我能保证我返回的interface可用就行。

相关文章:

实战案例分享:Android WLAN Hal层移植(MTK+QCA6696)

本文将详细介绍基于MTK平台,适配高通(Qualcomm)QCA6696芯片的Android WLAN HAL层的移植过程,包括HIDL接口定义、Wi-Fi驱动移植以及wpa_supplicant适配过程,涵盖STA与AP模式的常见问题与解决方法。 1. HIDL接口简介 HID…...

物联网系统搭建

实验项目名称 构建物联网系统 实验目的 掌握物联网系统的一般构建方法。 实验要求: 1.构建物联网系统,实现前后端的交互。 实验内容: CS模式MQTT(不带数据分析处理功能) 实现智能设备与应用客户端的交…...

微前端框架 Qiankun 的应用及问题分析

一、Qiankun 的核心应用场景与优势 多技术栈共存与灵活集成 Qiankun 支持主应用与子应用使用不同技术栈(如 Vue、React、Angular 等),通过 HTML Entry 方式接入子应用,无需深度改造子应用即可实现集成,降低了技术迁移成…...

设计模式-结构型模式-适配器模式

概述 适配器模式 : Adapter Pattern 是一种结构型设计模式. 作用 : 使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 实现思路 : 适配器模式通过将一个类的接口转换成客户希望的另外一个接口来实现这一点。 这里的“接口”指的是类所提供的…...

6. 机器人实现远程遥控(具身智能机器人套件)

1. 启动控制脚本 远程作到 Raspberry Pi 中,并运行以下脚本: conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登录笔记本电脑上,同时运行以下脚本: conda ac…...

多模态知识图谱融合

1.Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey 1.1多模态实体对齐 1.2多模态实体链接 研究进展&#...

windows 平台如何点击网页上的url ,会打开远程桌面连接服务器

你可以使用自定义协议方案(Protocol Scheme)实现网页上点击URL后自动启动远程桌面连接(mstsc),参考你提供的C代码思路,如下实现: 第一步:注册自定义协议 使用类似openmstsc://协议…...

基于Spark的热门动漫推荐数据分析与可视化系统的设计与实现(采用Python语言Django框架,Hadoop,spider爬虫等技术实现)

基于Hadoop的热门动漫推荐数据分析与可视化系统 基于Django的热门动漫推荐数据分析与可视化系统 1. 开发工具和实现技术 Pycharm, Python3.7,Django框架,Hadoop,Spark,Hive,spider爬虫(爬取动漫之家的动…...

8. 机器人模型训练与评估(具身智能机器人套件)

1. 训练 使用python lerobot/scripts/train.py可以进行机器人控制模型训练,一般需要几个小时,可以在outputs/train/act_lekiwi_test/checkpoints查看锚点数据,下面为一组示例参数: python lerobot/scripts/train.py \--dataset.…...

计算机网络-服务器模型

一.服务器模型 1.支持多客户端访问 //单循环服务器 socket bind listen while(1) { accept while(1) { recv/send } } close 注:该模式remvform为阻塞态,服务器将等待接收数据 2..支持多客户端同时访问 (并发能力) socket…...

DeepSeek大模型 —— 全维度技术解析

DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1…...

OSPF网络类型:NBMA与P2MP

一、NBMA网络 NBMA网络的特点 连接方式: 支持多台设备连接到同一个网络段,但网络本身不支持广播或组播。典型例子:帧中继、ATM。 DR/BDR选举: 由于网络不支持广播,OSPF需要手动配置邻居。 仍然会选举DR&#xff08…...

大数定律详解

前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 🌟 一、大数定律的…...

2025生物科技革命:AI驱动的基因编辑与合成生物学新纪元

一、基因编辑技术的精准化突破 第三代基因编辑工具CRISPR-Cas12f的研发成功,将编辑精度提升至0.1碱基对级别。中国科学院团队利用该技术在灵长类动物模型中修复遗传性视网膜病变基因,治愈率达到92%。对比传统CRISPR-Cas9技术,新型编辑器脱靶…...

百度SEO关键词布局从堆砌到场景化的转型指南

百度SEO关键词布局:从“堆砌”到“场景化”的转型指南 引言 在搜索引擎优化(SEO)领域,关键词布局一直是核心策略之一。然而,随着搜索引擎算法的不断升级和用户需求的多样化,传统的“关键词堆砌”策略已经…...

macOS常用网络管理配置命令

目录 **1. ifconfig:查看和配置网络接口****2. networksetup:管理系统网络配置****3. ping:测试网络连通性****4. traceroute:跟踪数据包路径****5. nslookup/dig:DNS 查询****6. netstat:查看网络连接和统…...

Selenium 中 ActionChains 支持的鼠标和键盘操作设置及最佳实践

Selenium 中 ActionChains 支持的鼠标和键盘操作设置及最佳实践 一、引言 在使用 Selenium 进行自动化测试时,ActionChains 类提供了强大的功能,用于模拟鼠标和键盘的各种操作。通过 ActionChains,可以实现复杂的用户交互,如鼠标…...

【五.LangChain技术与应用】【31.LangChain ReAct Agent:反应式智能代理的实现】

一、ReAct Agent是啥?为什么说它比「普通AI」聪明? 想象一下,你让ChatGPT查快递物流,它可能直接编个假单号糊弄你。但换成ReAct Agent,它会先推理(Reasoning)需要调用哪个接口,再行动(Action)查询真实数据——这就是ReAct的核心:让AI学会「动脑子」再动手。 举个真…...

【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(七) -> JS动画(二)

目录 1 -> 动画动效 1.1 -> 创建动画对象 1.2 -> 添加动画事件和调用接口 2 -> 动画帧 2.1 -> 请求动画帧 2.2 -> 取消动画帧 1 -> 动画动效 通过设置插值器来实现动画效果。 说明 从API Version 6 开始支持。 1.1 -> 创建动画对象 通过cre…...

SpaCy处理NLP的详细工作原理及工作原理框图

spaCy处理NLP的详细工作原理及工作原理框图 spaCy处理NLP的详细工作原理 spaCy是一个基于Python的开源自然语言处理(NLP)库,它提供了一系列高效且易用的工具,用于执行各种NLP任务,如文本预处理、文本解析、命名实体识…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

C++使用 new 来创建动态数组

问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...