前言
現(xiàn)如今,WiFi已經(jīng)和我們生活密不可分了,不管我們是在公交車上、地鐵上,還是走在大街上,我們都可以享受到WiFi的信號,WiFi5 已經(jīng)進(jìn)入千家萬戶,下面將分享基于WIFI5搭配Android 9 pie上面實現(xiàn)2.4/5G上網(wǎng)功能。隨著Android版本更替,在Android 9 與Android 10中wifi的結(jié)構(gòu)層次與Android 8以前的對比也發(fā)生了許多變化。
注:本文章所述的WIFI5包括1*1/2*2芯片,有SDIO、USB、PCIE三種接口方式,在不同的應(yīng)用場景中有著廣泛應(yīng)用,想詳細(xì)了解的可以咨詢潤欣的商務(wù)端。
添加CLD驅(qū)動移植
本文以高通WIFI5 CLD驅(qū)動為例。編譯驅(qū)動前,請確保Linux 內(nèi)核成功編譯完成。低于Linux 4.4內(nèi)核版本需要在wifi 驅(qū)動部分適配backports。
操作步驟:
1) 修改linux內(nèi)核路徑和toolchain路徑,配置好IF_TYPE和BOARD_TYPE
2) 進(jìn)入AIO/build目錄
3) 通過命令make進(jìn)行編譯.
編譯完成后:
把固件放置到/lib/firmware目錄下
然后通過命令sudo insmod ./wlan.ko安裝WIFI驅(qū)動
驅(qū)動移植好了,以后就是加載驅(qū)動,測試功能,但是在實際過程中可能會有許多問題需要去debug。最常見的是wlan 接口生成不成功,以及無法掃描AP等……這些都需要我們一步步跟著wifi的啟動流程去分析。
Android 9.0里wifi的框架做了一些變動,包括wifi開啟流程,前面與8.0差不多,到了WifiServiceImpl后面就有了很大變動,最重要的變化是WIFI HAL層。
WLAN HAL
HIDL 讀作 hide-l,Wifi到Andoid O之后所以Android P也一樣不再使用jni,而是使用HIDL,Hardware Interface Define Language。
WLAN 框架具有三個 WLAN HAL 表面,分別由三個不同的 HIDL 軟件包表示:
Vendor HAL:Android 專用命令的 HAL 表面,HIDL 文件位于hardware/interfaces/wifi/1.x中。
客戶端 HAL:wpa_supplicant的 HAL 表面,HIDL 文件位于hardware/interfaces/supplicant/1.x中。
Hostapd HAL:hostapd的 HAL 表面,HIDL 文件位于hardware/interfaces/hostapd/1.x中。
根據(jù)我們實際調(diào)試情況來看,Android 9 pie 走的是hardware/interfaces/wifi/1.2中的default/wifi.cpp Android 10(Android Q)走的流程對應(yīng)的是hardware/interfaces/wifi/1.3/default/ wifi.cpp 。
系統(tǒng)編譯的時候會自動產(chǎn)生IWifi.java文件。
out/soong/.intermediates/hardware/interfaces/wifi/1.0/android.hardware.wifi_V1.0-java_gen_java/gen/android/hardware/wifi/V1_X/IWifi.java
對應(yīng)的代碼:
/hardware/interfaces/wifi/1.3/IWifi.hal
/**
* Perform any setup that is required to make use of the module. If the module
* is already started then this must be a noop.
* Must trigger |IWifiEventCallback.onStart| on success.
*
* @return status WifiStatus of the operation.
* Possible status codes:
* |WifiStatusCode.SUCCESS|,
* |WifiStatusCode.NOT_AVAILABLE|,
* |WifiStatusCode.UNKNOWN|
*/
@entry
@callflow(next={"registerEventCallback", "start", "stop", "getChip"})
start() generates (WifiStatus status);
IWifi.java的getService方法
public static IWifi getService(String serviceName) throws android.os.RemoteException {
return IWifi.asInterface(android.os.HwBinder.getService("android.hardware.wifi@1.0::IWifi",serviceName));
}
對應(yīng)的IWifi.java的asInterface方法
IWifi.asInterface(android.os.HwBinder.getService("android.hardware.wifi@1.0::IWifi",serviceName));
硬件WIFI調(diào)用
按照IWifi.java的代碼接下來的調(diào)用路徑在hardware/interfaces/wifi/1.3/default/,目前跟蹤流程走的是走的1.3下面的wifi.cpp這個文件。
函數(shù)入口 Wifi::start
對應(yīng)的路徑hardware/interfaces/wifi_hidl/1.3/default/wifi.cpp
初始化 initializeModeControllerAndLegacyHal()
mode_controller_->initialize()
hardware/interfaces/wifi_hidl/1.3/default/wifi_mode_controller.cpp
driver_tool_->LoadDriver()
這個driver_tool.cpp這里開始走到WPA適配層去。對應(yīng)的路徑如下:
//frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp
wifi_load_driver()
libwifi_hal/wifi_hal_common.Cpp中。函數(shù)wifi_load_driver()
結(jié)果反饋調(diào)用驅(qū)動,通知上層
insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG)
wifi_change_driver_state(WIFI_DRIVER_STATE_ON) < 0)
property_set(DRIVER_PROP_NAME, "ok");
客戶端 HAL
客戶端 HAL 為wpa_supplicant守護進(jìn)程提供 HIDL 接口。
wpa_supplicant 源代碼位于external/wpa_supplicant_8/wpa_supplicant中。提供 HIDL 接口的 wpa_supplicant 代碼位于hidl子目錄中 啟動startSupplicant
對應(yīng)的路徑如下:libwifi_system/wifi/supplicant_manager.cpp
Hostapd HAL
Hostapd HAL 為hostapd守護進(jìn)程提供 HIDL 接口。hostapd 源代碼位于external/wpa_supplicant_8/hostapd中。提供 HIDL 接口的 hostapd 代碼位于hidl子目錄中。
以上是基于Android P&Android Q中調(diào)試高通wifi過程中對wifi的簡單分析。如有異議的地方歡迎大家與我們一起探討交流,潤欣與您一同成長進(jìn)步!
-
Android
+關(guān)注
關(guān)注
12文章
3925瀏覽量
127155 -
接口
+關(guān)注
關(guān)注
33文章
8518瀏覽量
150857 -
Linux
+關(guān)注
關(guān)注
87文章
11232瀏覽量
208942 -
WIFI
+關(guān)注
關(guān)注
81文章
5290瀏覽量
203311
發(fā)布評論請先 登錄
相關(guān)推薦
評論