Qualcomm android 10 wifi architecture

Android O/P wifi 架構:

android O和Pwifi的代碼框架變化很小,主要在於框架的邏輯控制上。根據上圖提供的架構可以瞭解下整個wifi的代碼分層和結構

 

WiFi Setings:

代碼路徑:packages/apps/Settings/src/com/android/settings/wifi

部分文件

此路徑是手機的設置app和wifi設置操作相關的代碼,wifi的操作都是從此處的代碼開始運行。

eg:wifi的打開:從wifisettings -> WifiEnabler -> frameworks

 

APP ---Frameworks通信--->aidl

app到framework層通過aidl通信

eg:WifiManager -> WifiService

 

                            

 IWifiManager, IWifiManager.Stub, IWifiManager.Stub.Proxy都由IWifiManger.aidl生成

WifiManager:系統爲app提供的接口。

Context.getSystemService(Context.WIFI_SERVICE)返回的實際對象類型是IWifiManager.Stub.Proxy

IWifiManager.Stub.Proxy的實例:app端的代理,將WifiManager的方法的參數序列到parcel,經Binder發送給system_server進程

 

WiFi Frameworks

代碼路徑:

Frameworks/base/wifi/java/android/net/wifiFrameworks/base/wifi/java/android/net/wifi   wifi相關的包

          WifiInfo.java

          WifiScanner.java

           IWifiManager.aidl--aidl文件會自動生成相關的java代碼,用於binder通信

           WifiManager.java  

           ......

Frameworks/opt/net/wifi/service/java/com/android/server/wifi/   wifi相關的服務

           WifiService.java

           WifiController.java

            WifiServiceImpl.java

            WifiNative.java

            ClientModeImpl.java

             ......

   Wifi_Framework----wifistateMachine

      wifi狀態機是framework控制wifi的核心,對wifi的狀態的改動都要經過一個或者幾個狀態機,最後下發指令到HAL層。


HIDL and HAL

從frameworks層到HAl層,之間必須通過一種通信機制纔可以讓代碼流程從java到C/C++

早起版本通過jni:

java聲明native方法->javah -jni命令導出JNI的.h頭文件->實現native方法->編譯本地代碼爲*.so的庫文件。(native依賴於so庫)

adroid Q -> HIDL

HIDL:文件路徑:hardware/interfaces/wifi/1.3/

wifi_chip

wifi_mode_controller

wifi_legacy_hal

HIDL的功能就是爲了java可以直接調用到c/c++,wifi的framework層動用的Iwifi的類,Iwifi.hal文件定義了未實現的接口。

對應目錄下的Android.bp :

filegroup-"[email protected]_hal":包含了該目錄下所有的hal文件

genrule-"[email protected]_genc++":使用上面的filegroup作爲src編譯出對應的cpp文件

genrule-"[email protected]_genc++_headers":使用上面的filegroup作爲src編譯出對應的.h文件

HAL

hal層主要是運行在用戶空間對supplicant等一些工具接口的統一封裝,以便HIDL通信調用

文件路徑:

frameworks/opt/net/wifi/libwifi_hal/

主要文件3個:

driver_tool .cpp 

hal_tool.cpp

 wifi_hal_commom.cpp

 

wpa_supplicant

路徑:external/wpa_supplecant_8/

該項目內包含兩個互相相關的開源項目wpa_supplicant和hostapd,它們將會生成兩個可執行文件:wpa_supplicant和hostapd,分別爲STA模式和AP模式時的守護進程。

除此之外,還會生成用於測試的wpa_cli,hostapd_cli,以及WIFI HAL依賴的wpa_client.so,具體可以到Android.mk中找到

wpa_supplicant通過NETLINK socket與內核通信。

wpa_supplicant項目支持多種驅動編程接口,在Android上使用的是nl80211;

nl80211是新的802.11netlink接口公共頭,與cfg80211一同組成了Wireless-Extensions的替代方案。

cfg80211是Linux 802.11配置API, nl80211用於配置cfg80211設備,同時用於內核到用戶空間的通信。

 

wireless module(in kernel)

代碼位於:

kernel/net/wireless

nl80211.c 中的 nl80211_init 使用genl_register_family_with_ops 註冊了響應應用程序的struct genl_ops nl80211_ops[], 該數組定義了響應NETLINK消息的函數。

nl80211_init 在 cfg80211_init 內被調用,cfg80211_init是被subsys_initcall註冊的子系統初始化程序,被編譯爲cfg80211.ko。

 

wlan driver

代碼位於:

vendor/qcom/opensource/wlan/prima

模塊初始化(module_init),模塊退出(module_exit):
CORE/HDD/src/wlan_hdd_main.c

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章