AndroidのO / P無線LANアーキテクチャ:
前記メイン論理制御フレームアンドロイドO及びPwifiフレームコードは、ほとんど変化します。アーキテクチャは、図層状構造のコードを提供し、全体のより低い無線LANを理解することができ
WiFiのSetings:
コードパス:パッケージ/アプリケーション/設定/ SRC / COM /アンドロイド/設定/無線LAN
ファイルの一部
このパスは、携帯電話の設定アプリのコードと操作に関連した無線LANの設定は、無線LANの操作は、ここでのコードから実行されています。
例えば:WIFIオープン:wifisettingsから - > WifiEnabler - >フレームワーク
APP ---フレームワーク通信---> AIDL
通信層AIDLにアプリケーションフレームワーク
例えば:WifiManager - > WifiService
IWifiManger.aidlによって生成されたIWifiManager、IWifiManager.Stub、IWifiManager.Stub.Proxy
WifiManager:アプリのためのインタフェースシステムを提供します。
Context.getSystemService(Context.WIFI_SERVICE)実際のオブジェクト・タイプはIWifiManager.Stub.Proxy返されます
IWifiManager.Stub.Proxyの例:アプリエンドプロキシ、パーセルWifiManager配列メソッドのパラメータ、system_serverバインダープロセスを
WiFiのフレームワーク
コードパス:
フレームワーク/ベース/無線LAN / javaの/アンドロイド/ネット/ wifiFrameworks /ベース/無線LAN / javaの/アンドロイド/ネット/無線LAN無線LAN相关的包
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