前言

现如今,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微信公众号

java实现wife链接硬件_【技术分享】在Android 910上面实现WIFI功能相关推荐

  1. java最长公共子序列_技术分享 | 最长公共子序列在比对工具的应用

    即使如何1 在实际工作中,我们常常要对输出的文本和数据进行比对:以取证大师为例,取证大师导出的取证结果数据量很容易达到上万条.这类数据特点除了数量级大外,其实数据结构很相近.即使我们以无以伦比的细致和 ...

  2. java实现wife链接硬件_360推首款硬件设备 “随身Wifi”实现免费无线上网

    不仅如此,此前用户在360手机助手等PC端渠道获取手机软件.游戏.Mp3等各种资源的时候,都需要数据线连接手机和电脑.尽管有些渠道开放 了无线连接功能,但是需要多步骤手动操作,十分繁琐.360随身Wi ...

  3. android4 设置栈大小,【技术分享】Android内核漏洞利用技术实战:环境搭建栈溢出实战...

    [技术分享]Android内核漏洞利用技术实战:环境搭建&栈溢出实战 2017-08-14 16:22:02 阅读:0次 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn ...

  4. java生成sm4算法的对称密钥_技术分享丨这是一篇简单的小科普——什么是对称加密算法?(下)...

    原标题:技术分享丨这是一篇简单的小科普--什么是对称加密算法?(下) 大家好~我是贾正经,又到了干货满满的技术分享趴啦~ 上期我们讲解了对称加密算法的小知识,并介绍了国密算法中SM4算法的原理. 本期 ...

  5. mysql优化说出九条_技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢?

    原标题:技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢? 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 ...

  6. python个人博客搭建说明书_技术分享|利用Python Django一步步搭建个人博客(二)...

    原标题:技术分享|利用Python Django一步步搭建个人博客(二) Hello,欢迎来到我们的"利用Python Django一步步搭建个人博客"系列的第二部分.在第一部分中 ...

  7. 对称加密算法_技术分享丨这是一篇简单的小科普——什么是对称加密算法?(下)...

    大家好~我是贾正经,又到了干货满满的技术分享趴啦~ 上期我们讲解了对称加密算法的小知识,并介绍了国密算法中SM4算法的原理.(上集回顾) 本期带大家了解一下分组密码的五个模式. 分组密码的模式 首先了 ...

  8. 干涉测量技术的应用_技术分享 | 石化行业测量仪表应用在线答疑

    众所周知,在化工和石化这类流程行业当中,稳定性和持续性是至关重要的生产"命脉",对于生产过程中使用的测量仪表有着极其严格的要求. 不仅所有测量仪表都必须满足严苛的国际标准,如PED ...

  9. 大表与大表join数据倾斜_技术分享|大数据技术初探之Spark数据倾斜调优

    侯亚南 数据技术处 支宸啸 数据技术处 在大数据计算中,我们可能会遇到一个很棘手的问题--数据倾斜,此时spark任务的性能会比预期要差很多:绝大多数task都很快执行完成,但个别task执行极慢或者 ...

最新文章

  1. MySQL-MMM实现MySQL高可用
  2. 学习笔记(五)——JavaScript(二)
  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
  4. 【Java音频操作】调用有道词典语音接口,生成单词MP3文件,支持自定义重复次数
  5. multisim连接MySQL_首次使用Multisim软件进行电路仿真设计
  6. CCNA——网络初认识
  7. UI设计师缺乏灵感,看看这些可以临摹的网站架构!
  8. win11组策略如何恢复默认设置 windows11组策略恢复默认设置的步骤方法
  9. Android ClassLoader笔记(二)
  10. 还在繁琐的敲MVP接口和实现类吗,教你一秒搞定。
  11. DeepFake技术--win7下faceswap环境配置(一)(二)(三)
  12. Spring源码下载及安装
  13. HTML命名空间的使用
  14. 常用工具类之十一 XML报文加签工具类 http://www.w3.org/2000/09/xmldsig
  15. k8s 1.23 及keda 2.7.1 安装测试
  16. 360网站卫士能防服务器吗,360网站卫士测评
  17. eval 函数 java_[Java教程]eval()函数用法详解
  18. WDCP各种停止重启命令
  19. python sklearn Rideg岭回归--交通流量预测实例
  20. 读书笔记 |余华 | 文城

热门文章

  1. mysqldump 备份报 Warning: A partial dump from a server that has GTIDs will by default include the..
  2. 网络爬虫的“盗亦有道”
  3. 红黑数和普通的二叉排序树有什么要求
  4. 浅谈:APP开发市场的发展轨迹与未来趋势
  5. macbook 打开以后没有声音,重启以后又好了的解决方法
  6. 微信小程序--数据库数据批量导出为excel文件,预览下载
  7. aria2 linux一键安装,Aria2一键安装及管理脚本,搭建AriaNg前端
  8. 05.Linux 常用命令-网络命令\关机重启命令
  9. 区块链和博弈论(以下转载自网络)
  10. Delphi惹谁了?