實戰案例分享: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可用就行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72712.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72712.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Greenplum6.19集群搭建

一,安裝說明 1.1環境說明 1、首先確定部署的環境,確定下服務器的端口,一般默認是22的端口; 2、當前這份文檔是服務器處于10022端口下部署的(現場生產環境要求,22端口在生產環境存在安全隱患)&…

電商項目-秒殺系統(四)秒殺異步下單防止重復秒殺

一、 防止惡意刷單解決 在生產場景下,可能會有一些人會惡意訪問當前網站,來進行惡意的刷單。這樣會造成當前系統出現一些業務上的業務混亂,出現臟數據,或者造成后端訪問壓力大等問題。 一般要解決這個問題的話,前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件: uniapp-v8-release.aar 2.提供uniapp調用的接口,新建類文件繼承UniModule, package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用戶相關

Android 多用戶相關 本文主要記錄下android 多用戶相關的adb 命令操作. 1: 獲取用戶列表 命令: adb shell pm list users 輸出如下: Users:UserInfo{0:機主:c13} running默認只有一個用戶, id為0 ,用戶狀態為運行 2: 創建新用戶 命令: adb shell …

基于Spring Boot的高校就業招聘系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

前端安全面試題匯總及參考答案

目錄 簡述 XSS 攻擊的原理及三種常見類型(存儲型、反射型、DOM 型) 如何在前端防御 XSS 攻擊?列舉編碼、過濾、CSP 策略的具體實現方式 富文本編輯器場景下如何安全處理用戶輸入的 HTML 內容? 如何通過 HttpOnly 屬性增強 Cookie 安全性?它與 XSS 防御的關系是什么? …

Linux驅動開發(1.基礎創建)

序言:從高層邏輯到底層硬件的回歸 在當今的軟件開發中,我們習慣于用高級語言構建抽象層——通過框架、庫和云服務快速實現功能。這種“軟邏輯”的便利性讓開發效率倍增,卻也逐漸模糊了我們對計算機本質的認知:一切代碼終將落地為…

Gradle本地配置文件分享

Gradle本地配置文件分享 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }ma…

deepseek 本地部署

deepseek 本地部署 純新手教學,手把手5分鐘帶你在本地部署一個私有的deepseek,再也不用受網絡影響。流暢使用deepseek!!! 如果不想看文章,指路:Deep seek R1本地部署 小白超詳細教程 &#xff0…

HTML學習筆記(全)

基本結構 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title></title> </head> <body></body> </html> 基本標簽元素 標題&#xff08;heading&#xff09; <h1>一級標題</h1> &…

騰訊云對象存儲服務(COS)

騰訊云對象存儲服務&#xff08;COS&#xff09; 安全、可擴展、低成本的云存儲解決方案 騰訊云 對象存儲服務&#xff08;COS&#xff0c;Cloud Object Storage&#xff09; 是一種高可靠、高性能、可擴展的云存儲服務&#xff0c;專為海量非結構化數據&#xff08;如圖片、…

從ETL到數倉分層:大數據處理的“金字塔”構建之道

在當今數據驅動的時代&#xff0c;大數據處理已成為企業決策和業務優化的核心。而ETL&#xff08;Extract, Transform, Load&#xff09;作為數據處理的基石&#xff0c;其背后的數倉分層理念更是決定了數據處理的效率與質量。本文將深入探討ETL工作中的數倉分層理念&#xff0…

數字孿生對于新基建的價值淺析,算是拋磚引玉。

數字孿生&#xff08;Digital Twin&#xff09;作為一項融合物理世界與數字世界的關鍵技術&#xff0c;在新基建中扮演著虛實協同、智能決策、全生命周期管理的核心角色&#xff0c;其價值貫穿于基礎設施的設計、建設、運維到優化全流程。 一、核心價值&#xff1a;虛實映射與智…

從零開始實現大語言模型(十三):預訓練大語言模型GPTModel

1. 前言 使用梯度下降算法通過下一個token預測任務預訓練大語言模型GPTModel&#xff0c;前向傳播流程每次會輸入一個batch的長度均為context_len的訓練樣本&#xff0c;執行 batch_size context_len \text{batch\_size}\times\text{context\_len} batch_sizecontext_len次下…

QWQ大模型評測榜單

評測榜單說明 在數學推理基準AIME24上&#xff0c;QwQ-32B達到了79.5分&#xff0c;幾乎與DeepSeek-R1-617B的79.8分持平&#xff0c;遠超OpenAI o1-mini的63.6分&#xff0c;及相同尺寸的R1蒸餾模型。 在編程能力方面&#xff0c;QwQ-32B 在LiveCodeBench上獲得了63.4分&…

bash: uwsgi: 未找到命令

針對你提出的“bash: uwsgi: command not found”問題&#xff0c;以下是一些可能的解決方案&#xff0c;請按照步驟逐一排查&#xff1a; ?1、檢查uwsgi命令是否正確?&#xff1a; 確保你輸入的命令是uwsgi&#xff0c;而不是uWSGI或其他變體。 ?2、確認uwsgi是否已安裝?&…

超圖(Hypergraph)

超圖&#xff08;Hypergraph&#xff09;是圖結構學習&#xff08;Graph Learning&#xff09;中的一種擴展形式&#xff0c;它比傳統圖&#xff08;Graph&#xff09;更具表達能力&#xff0c;適用于建模復雜的多元關系。 超圖是一種由 超節點&#xff08;Hypernodes&#xff…

PyTorch中的線性變換:nn.Parameter VS nn.Linear

self.weight nn.Parameter(torch.randn(in_channels, out_channels)) 和 self.linear nn.Linear(in_channels, out_channels) 并不完全一致&#xff0c;盡管它們都可以用于實現線性變換&#xff08;即全連接層&#xff09;&#xff0c;但它們的使用方式和內部實現有所不同。 …

鴻蒙生態日日新,夸克、順豐速運、駕校一點通等多款應用功能更新

3月5日鴻蒙生態日日新PLOG&#xff1a;吉事辦、健康甘肅等政務服務App上架原生鴻蒙應用市場&#xff1b;夸克、順豐速運、駕校一點通等多款應用功能更新。

基于SpringBoot的智慧停車場小程序(源碼+論文+部署教程)

運行環境 ? 前端&#xff1a;小程序 Vue ? 后端&#xff1a;Java ? IDE工具&#xff1a;IDEA&#xff08;可自行選擇&#xff09; HBuilderX 微信開發者工具 ? 技術棧&#xff1a;小程序 SpringBoot Vue MySQL 主要功能 智慧停車場微信小程序主要包含小程序端和…