前言
現(xiàn)如今,WiFi已經(jīng)和我們生活密不可分了,不管我們是在公交車(chē)上、地鐵上,還是走在大街上,我們都可以享受到WiFi的信號(hào),WiFi5 已經(jīng)進(jìn)入千家萬(wàn)戶(hù),下面將分享基于WIFI5搭配Android 9 pie上面實(shí)現(xiàn)2.4/5G上網(wǎng)功能。隨著Android版本更替,在Android 9 與Android 10中wifi的結(jié)構(gòu)層次與Android 8以前的對(duì)比也發(fā)生了許多變化。
注:本文章所述的WIFI5包括1*1/2*2芯片,有SDIO、USB、PCIE三種接口方式,在不同的應(yīng)用場(chǎng)景中有著廣泛應(yīng)用,想詳細(xì)了解的可以咨詢(xún)潤(rùn)欣的商務(wù)端。
添加CLD驅(qū)動(dòng)移植
本文以高通WIFI5 CLD驅(qū)動(dòng)為例。編譯驅(qū)動(dòng)前,請(qǐng)確保Linux 內(nèi)核成功編譯完成。低于Linux 4.4內(nèi)核版本需要在wifi 驅(qū)動(dòng)部分適配backports。
操作步驟:
1) 修改linux內(nèi)核路徑和toolchain路徑,配置好IF_TYPE和BOARD_TYPE
2) 進(jìn)入AIO/build目錄
3) 通過(guò)命令make進(jìn)行編譯.
編譯完成后:
把固件放置到/lib/firmware目錄下
然后通過(guò)命令sudo insmod ./wlan.ko安裝WIFI驅(qū)動(dòng)
驅(qū)動(dòng)移植好了,以后就是加載驅(qū)動(dòng),測(cè)試功能,但是在實(shí)際過(guò)程中可能會(huì)有許多問(wèn)題需要去debug。最常見(jiàn)的是wlan 接口生成不成功,以及無(wú)法掃描AP等……這些都需要我們一步步跟著wifi的啟動(dòng)流程去分析。
Android 9.0里wifi的框架做了一些變動(dòng),包括wifi開(kāi)啟流程,前面與8.0差不多,到了WifiServiceImpl后面就有了很大變動(dòng),最重要的變化是WIFI HAL層。
WLAN HAL
HIDL 讀作 hide-l,Wifi到Andoid O之后所以Android P也一樣不再使用jni,而是使用HIDL,Hardware Interface Define Language。
WLAN 框架具有三個(gè) WLAN HAL 表面,分別由三個(gè)不同的 HIDL 軟件包表示:
Vendor HAL:Android 專(zhuān)用命令的 HAL 表面,HIDL 文件位于hardware/interfaces/wifi/1.x中。
客戶(hù)端 HAL:wpa_supplicant的 HAL 表面,HIDL 文件位于hardware/interfaces/supplicant/1.x中。
Hostapd HAL:hostapd的 HAL 表面,HIDL 文件位于hardware/interfaces/hostapd/1.x中。
根據(jù)我們實(shí)際調(diào)試情況來(lái)看,Android 9 pie 走的是hardware/interfaces/wifi/1.2中的default/wifi.cpp Android 10(Android Q)走的流程對(duì)應(yīng)的是hardware/interfaces/wifi/1.3/default/ wifi.cpp 。
系統(tǒng)編譯的時(shí)候會(huì)自動(dò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
對(duì)應(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));
}
對(duì)應(yīng)的IWifi.java的asInterface方法
IWifi.asInterface(android.os.HwBinder.getService("android.hardware.wifi@1.0::IWifi",serviceName));
硬件WIFI調(diào)用
按照IWifi.java的代碼接下來(lái)的調(diào)用路徑在hardware/interfaces/wifi/1.3/default/,目前跟蹤流程走的是走的1.3下面的wifi.cpp這個(gè)文件。
函數(shù)入口 Wifi::start
對(duì)應(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()
這個(gè)driver_tool.cpp這里開(kāi)始走到WPA適配層去。對(duì)應(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ū)動(dòng),通知上層
insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG)
wifi_change_driver_state(WIFI_DRIVER_STATE_ON) < 0)
property_set(DRIVER_PROP_NAME, "ok");
客戶(hù)端 HAL
客戶(hù)端 HAL 為wpa_supplicant守護(hù)進(jìn)程提供 HIDL 接口。
wpa_supplicant 源代碼位于external/wpa_supplicant_8/wpa_supplicant中。提供 HIDL 接口的 wpa_supplicant 代碼位于hidl子目錄中 啟動(dòng)startSupplicant
對(duì)應(yīng)的路徑如下:libwifi_system/wifi/supplicant_manager.cpp
Hostapd HAL
Hostapd HAL 為hostapd守護(hù)進(jìn)程提供 HIDL 接口。hostapd 源代碼位于external/wpa_supplicant_8/hostapd中。提供 HIDL 接口的 hostapd 代碼位于hidl子目錄中。
以上是基于Android P&Android Q中調(diào)試高通wifi過(guò)程中對(duì)wifi的簡(jiǎn)單分析。如有異議的地方歡迎大家與我們一起探討交流,潤(rùn)欣與您一同成長(zhǎng)進(jìn)步!
-
Android
+關(guān)注
關(guān)注
12文章
3941瀏覽量
127720 -
接口
+關(guān)注
關(guān)注
33文章
8685瀏覽量
151655 -
Linux
+關(guān)注
關(guān)注
87文章
11336瀏覽量
210100 -
WIFI
+關(guān)注
關(guān)注
81文章
5306瀏覽量
204389
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論