您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

【技术分享】在Android 9&10上面实现WIFI功能

2020/6/12 3:26:20发布126次查看

前言
现如今,wifi已经和我们生活密不可分了,不管我们是在公交车上、地铁上,还是走在大街上,我们都可以享受到wifi的信号,wifi5 已经进入千家万户,下面将分享基于wifi5搭配android 9 pie上面实现2.4/5g上网功能。随着android版本更替,在android 9 与android 10中wifi的结构层次与android 8以前的对比也发生了许多变化。
注:本文章所述的wifi5包括1*1/2*2芯片,有sdio、usb、pcie三种接口方式,在不同的应用场景中有着广泛应用,想详细了解的可以咨询润欣的商务端。
添加cld驱动移植
本文以高通wifi5 cld驱动为例。编译驱动前,请确保linux 内核成功编译完成。低于linux 4.4内核版本需要在wifi 驱动部分适配backports。
操作步骤:
1)   修改linux内核路径和toolchain路径,配置好if_type和board_type
2)   进入aio/build目录
3)   通过命令make进行编译.
编译完成后:
把固件放置到/lib/firmware目录下
然后通过命令sudo insmod ./wlan.ko安装wifi驱动
驱动移植好了,以后就是加载驱动,测试功能,但是在实际过程中可能会有许多问题需要去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 中。
根据我们实际调试情况来看,android 9 pie 走的是 hardware/interfaces/wifi/1.2中的default/wifi.cpp  android 10(android q)走的流程对应的是hardware/interfaces/wifi/1.3/default/ wifi.cpp 。
系统编译的时候会自动产生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
对应的代码:
/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));
}
对应的iwifi.java的asinterface方法
iwifi.asinterface(android.os.hwbinder.getservice("android.hardware.wifi@1.0::iwifi",servicename));
硬件wifi调用
按照iwifi.java的代码接下来的调用路径在hardware/interfaces/wifi/1.3/default/,目前跟踪流程走的是走的1.3下面的wifi.cpp这个文件。
函数入口 wifi::start 
对应的路径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适配层去。对应的路径如下:
//frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp
wifi_load_driver()
libwifi_hal/wifi_hal_common.cpp中。函数wifi_load_driver()
结果反馈调用驱动,通知上层
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 守护进程提供 hidl 接口。
wpa_supplicant 源代码位于 external/wpa_supplicant_8/wpa_supplicant 中。提供 hidl 接口的 wpa_supplicant 代码位于 hidl 子目录中 启动startsupplicant
对应的路径如下:libwifi_system/wifi/supplicant_manager.cpp
hostapd hal
hostapd hal 为 hostapd 守护进程提供 hidl 接口。hostapd 源代码位于 external/wpa_supplicant_8/hostapd 中。提供 hidl 接口的 hostapd 代码位于 hidl 子目录中。
以上是基于android p&android q中调试高通wifi过程中对wifi的简单分析。如有异议的地方欢迎大家与我们一起探讨交流,润欣与您一同成长进步!
文章来源:润欣科技fortune微信公众号

该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product