• <tr id='HcaSSl'><strong id='HcaSSl'></strong><small id='HcaSSl'></small><button id='HcaSSl'></button><li id='HcaSSl'><noscript id='HcaSSl'><big id='HcaSSl'></big><dt id='HcaSSl'></dt></noscript></li></tr><ol id='HcaSSl'><option id='HcaSSl'><table id='HcaSSl'><blockquote id='HcaSSl'><tbody id='HcaSSl'></tbody></blockquote></table></option></ol><u id='HcaSSl'></u><kbd id='HcaSSl'><kbd id='HcaSSl'></kbd></kbd>

    <code id='HcaSSl'><strong id='HcaSSl'></strong></code>

    <fieldset id='HcaSSl'></fieldset>
          <span id='HcaSSl'></span>

              <ins id='HcaSSl'></ins>
              <acronym id='HcaSSl'><em id='HcaSSl'></em><td id='HcaSSl'><div id='HcaSSl'></div></td></acronym><address id='HcaSSl'><big id='HcaSSl'><big id='HcaSSl'></big><legend id='HcaSSl'></legend></big></address>

              <i id='HcaSSl'><div id='HcaSSl'><ins id='HcaSSl'></ins></div></i>
              <i id='HcaSSl'></i>
            1. <dl id='HcaSSl'></dl>
              1. <blockquote id='HcaSSl'><q id='HcaSSl'><noscript id='HcaSSl'></noscript><dt id='HcaSSl'></dt></q></blockquote><noframes id='HcaSSl'><i id='HcaSSl'></i>

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

                日期:2020-06-10 作者:福建福彩网创研社 返回列表

                前言


                现如今,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


                1591682965286376.png


                初始化 initializeModeControllerAndLegacyHal()


                1591682995393842.png


                mode_controller_->initialize()


                hardware/interfaces/wifi_hidl/1.3/default/wifi_mode_controller.cpp


                1591683023217710.png


                driver_tool_->LoadDriver()


                这个driver_tool.cpp这里开始走到WPA适配层去。对应的路径如下:


                //frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp


                4.png


                wifi_load_driver()


                libwifi_hal/wifi_hal_common.Cpp中。函数wifi_load_driver()


                1591683064898331.png


                结果反馈调用驱动,通知上层


                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


                1591683093638858.png


                Hostapd HAL


                Hostapd HAL 为 hostapd 守护进程提供 HIDL 接口。hostapd 源代码位于 external/wpa_supplicant_8/hostapd 中。提供 HIDL 接口的 hostapd 代码位于 hidl 子目录中。


                以上是基于Android P&Android Q中调试高通wifi过程中对wifi的简单分析。如有异议的地方欢迎大家与我们一起探@ 讨交流,福建福彩网与您一同∏成长进步!


                返回列表