`
20386053
  • 浏览: 461894 次
文章分类
社区版块
存档分类
最新评论

android wifi驱动开发日记(一)

 
阅读更多

学习android wifi开发已经一周了,今天开始立帖,将每天的学习成果贴出来,以备以后查阅,从framework到wpa_supplicant的适配层(wifi.c)网上介绍的帖子很多,而且本身也并不复杂,其中framework部分需要注意的是wifiService和wifiMoniter两部分,这两快一个是转发AP的CMD另一个是接收来自wpa_supplicant的CMD。他们与本地库的连接都是通过JNI方法,具体实现方法在android_net_wifi_Wifi.cpp中。在这个文件中可以大致看出AP会给wpa_supplicant下哪些命令。这些命令通过wifi.c的wifi_command发送给wpa_supplicant,在发送命令的过程中实际是调用wpa_ctrl_request来完成命令发送的,wpa_ctrl_request是通过socket的方式与wpa_supplicant进行通信的,然后通过wpa_ctrl_recv来接收来自wpa_supplicant的命令,并返回标识给wifi_wait_for_event。

但是命令发到wpa_supplicant后的流程网上提到的资料就非常少了,不过由于wpa_supplicant是一个标准的开源项目,已经被移植到很多平台上,它中间的过程我暂时还没有去细看。比较关心的是wpa_supplicant在接收到上层的命令后是怎么将命令发给DRIVER的,DRIVER在接收到命令后的解析的动作以及之后调用驱动功能函数的流程以及驱动对寄存器控制的细节。由于需要注意代码保密,之后不会提及具体使用了哪块WIFI芯片也不会提及此WIFI DRIVER是在什么平台什么产品。

先贴一张wpa_supplicant的标准结构框图:


重点关注框图的下半部分,即wpa_supplicant是如何与DRIVER进行联系的。整个过程暂以AP发出SCAN命令为主线。由于现在大部分WIFI DRIVER都支持wext,所以就假设我们的设备走的是wext这条线,其实用ndis也一样,流程感觉差不多。

首先要说的是,在Driver.h文件中有个结构体wpa_driver_ops:

/**
* struct wpa_driver_ops - Driver interface API definition
*
* This structure defines the API that each driver interface needs to implement
* for core wpa_supplicant code. All driver specific functionality is captured
* in this wrapper.
*/
struct wpa_driver_ops

这个结构体在Driver.c中被声明为

#ifdef CONFIG_DRIVER_WEXT
extern struct wpa_driver_ops wpa_driver_wext_ops; /* driver_wext.c */

然后在driver_wext.c填写了结构体的成员,

const struct wpa_driver_ops wpa_driver_wext_ops = {
.name = "wext",
.desc = "Linux wireless extensions (generic)",
.get_bssid = wpa_driver_wext_get_bssid,
.get_ssid = wpa_driver_wext_get_ssid,
.set_wpa = wpa_driver_wext_set_wpa,
.set_key = wpa_driver_wext_set_key,
.set_countermeasures = wpa_driver_wext_set_countermeasures,
.set_drop_unencrypted = wpa_driver_wext_set_drop_unencrypted,
.scan = wpa_driver_wext_scan,
.combo_scan = wpa_driver_wext_combo_scan,
.get_scan_results2 = wpa_driver_wext_get_scan_results,
.deauthenticate = wpa_driver_wext_deauthenticate,
.disassociate = wpa_driver_wext_disassociate,
.set_mode = wpa_driver_wext_set_mode,
.associate = wpa_driver_wext_associate,
.set_auth_alg = wpa_driver_wext_set_auth_alg,
.init = wpa_driver_wext_init,
.deinit = wpa_driver_wext_deinit,
.add_pmkid = wpa_driver_wext_add_pmkid,
.remove_pmkid = wpa_driver_wext_remove_pmkid,
.flush_pmkid = wpa_driver_wext_flush_pmkid,
.get_capa = wpa_driver_wext_get_capa,
.set_operstate = wpa_driver_wext_set_operstate,
#ifdef ANDROID
.driver_cmd = wpa_driver_priv_driver_cmd,
#endif
};

这些成员其实都是驱动和wpa_supplicant的接口,以SCAN为例:

int wpa_driver_wext_scan(void *priv, const u8 *ssid, size_t ssid_len)

中的LINE1174:if (ioctl(drv->ioctl_sock, SIOCSIWSCAN, &iwr) < 0)从这里可以看出wpa_cupplicant是通过IOCTL来调用SOCKET与DRIVER进行通信的,并给DRIVER下达SIOCSIWSCAN这个命令。

这样,一个命令从AP到FRAMEWORK到C++本地库再到wpa_supplicant适配层,再由wpa_supplicant下CMD给DRIVER的路线就打通了,写起来虽然不多但也是一点小成果。

时间过得很快,毕业已经三周了,后悔当初在实验室没有去学习关于WIFI的知识,现在只好从头看起。好在公司环境比较轻松,可以有时间抓抓细节,后面就要开始将DRIVER部分的结构和流程理理清楚了。


分享到:
评论

相关推荐

    Android WIFI驱动工作流程

    Android WIFI驱动工作流程是一个复杂的主题,包含了硬件与软件的协作以及网络通信的原理。首先,Android设备的WIFI功能通常是由内置硬件模块实现的,如Marvell 8686。在硬件层面,它集成了802.11a/g/b RF、基带、CPU...

    Android Wifi开发Demo示例

    在Android平台上,Wi-Fi开发是一项重要的技术,它允许设备通过无线局域网(WLAN)进行通信,实现数据的高速传输。本示例主要涵盖了Wi-Fi的搜索、连接以及数据传输这三个关键环节,这对于构建涉及网络通信的Android...

    Android HAL USB WIFI 驱动移植详解

    Android HAL USB WIFI 驱动移植详解,都是一些比较常用的USB WIFI包括rtl8192cu ,rtl8192du ,rtl8192ce ,rtl8192de,rtl8723as ,rtl8723au ,rtl8189es ,android WIFI 架构和控制流程详解,理解Android架构从Linux底层...

    全志系列芯片android与Linux内核WIFI驱动源码

    全志系列芯片在Android和Linux内核中的WIFI驱动源码是嵌入式系统开发中的重要组成部分,尤其对于基于全志处理器的设备来说,理解并掌握这些驱动代码有助于优化网络性能,解决硬件兼容性问题,以及进行定制化开发。...

    android wifi开发简单demo

    在Android平台上进行WiFi开发是一项常见的任务,特别是在构建与网络通信相关的应用程序时。"android wifi开发简单demo"这个项目提供了一个基础示例,帮助开发者理解如何在Android设备上管理和使用WiFi功能。下面我们...

    《Android驱动开发与移植实战详解》.pdf

    《Android驱动开发与移植实战详解》.pdf 带书签 书签自己做的

    《Android系统移植和驱动开发》 PDF

    本书共12章,开篇介绍了Android底层开发和嵌入式开发之间的关系,接着介绍Android系统的编译和移植,在这个基础上进一步阐述了Android驱动开发的原理,最后给出了一个Android智能家居的实例。 本书是大学院校嵌入式...

    Android_BSP驱动开发

    6. Android BSP驱动开发技术:Android BSP驱动开发技术是指基于Android操作系统,实现平板电脑的驱动开发,包括驱动开发、驱动测试和驱动优化等阶段。 7. 平板电脑的驱动开发流程:平板电脑的驱动开发流程包括硬件...

    android wifi连接与断开

    在Android平台上,实现WiFi连接与断开是一项基本且重要的任务,尤其对于开发涉及网络功能的应用时。本节将深入探讨如何构建一个可以完全替代系统原生WiFi管理功能的应用,包括搜索WiFi热点、按信号强度排序、按钮...

    android wifi开发流程和关键点分析

    ### Android WiFi开发流程与关键点分析 ...综上所述,Android WiFi开发是一项复杂的技术挑战,涉及到硬件、驱动和应用等多个层面。开发者需要全面了解WiFi技术原理,并具备扎实的编程技能,才能顺利完成项目。

    《Android驱动开发全过程》

    这一部分是Android内核驱动程序开发的基础,为后续的开发工作奠定基础。 以上知识点涉及Android驱动开发的方方面面,从概念理解到开发步骤,从商业策略到技术实现,为学习者提供了全面的指导和参考。掌握这些知识点...

    Android WiFi Camera (无线局域网IP摄像头)

    Android WiFi Camera是一款基于Android平台的应用程序,它将用户的Android设备转变为一个无线局域网(WLAN)IP摄像头。这个应用程序允许用户通过WiFi网络在不同设备上实时查看、控制和记录来自Android设备的视频流,...

    Android开发案例驱动教程 配套代码

    《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...

    Android-WIFI.rar_WiFi模块程序_android wifi_android wifi slam_android

    总之,Android WiFi开发涉及硬件驱动、系统服务和应用程序等多个层次,需要开发者具备扎实的Android编程基础和网络知识。通过学习和实践,我们可以创建功能丰富的WiFi应用,如智能家居控制、室内导航等,极大地丰富...

    wifi模块使用安卓编程驱动例子

    综上所述,"WiFi模块使用安卓编程驱动例子"是一个涉及硬件驱动编程、Android系统架构理解以及应用程序开发的综合实践。通过这个例子,开发者可以学习到如何在Android环境下有效地控制和利用WiFi模块,为用户提供无缝...

    Android Wifi开发介绍

    Android平台上的WiFi开发是移动应用开发中的一个重要方面,它允许应用与设备的WiFi硬件交互,实现网络连接、扫描、配置等功能。本知识点介绍将基于给定文件内容,深入解析Android中的WiFi开发关键概念和技术细节。 ...

    Android wifi资料合集(驱动、应用)

    这些文档的综合阅读将为读者提供一个全面理解Android Wi-Fi系统的机会,无论是对于系统开发者、应用开发者还是对Wi-Fi技术感兴趣的爱好者,都能从中获益匪浅。理解Android Wi-Fi的工作原理和架构对于优化设备性能、...

    android wifi 连接Demo.rar

    android wifi 连接Demo.rar

Global site tag (gtag.js) - Google Analytics