转自:http://bbs.imp3.net/thread-10558924-1-1.html

对于刚入手android没多久的人来说,android wifi 驱动的移植确实还是有难度的,不过参考了网友的相关帖子后,最终还是移植成功了,,以便自己和他人查看学习:
&&&& WIFI的基本架构 &&&&
(这一部分比较重要,是一直wifi驱动的基础)
1、wifi用户空间的程序和库:
external/wpa_supplicant/
生成库libwpaclient.so和守护进程wpa_supplicant。
2、hardware/libhardware_legary/wifi/是wifi管理库。
3、JNI部分:
frameworks/base/core/jni/android_net_wifi_Wifi.cpp
4、JAVA部分:
frameworks/base/services/java/com/android/server/
frameworks/base/wifi/java/android/net/wifi/
5、WIFI Settings应用程序位于:
packages/apps/Settings/src/com/android/settings/wifi/
&&&& WIFI在Android中如何工作 &&&&
(理解wifi的工作机制有助于调试wifi的相关错误)
Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,代码位于
external/wpa_supplicant。wpa_supplicant是通过socket与
hardware/libhardware_legacy/wifi/wifi.c通信。UI通过android.net.wifi package
(frameworks/base/wifi/java/android/net/wifi/)发送命令给wifi.c。
相应的JNI实现位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp。
更高一级的网络管理位于frameworks/base/core/java/android/net。
(了解完wifi的框架和工作机制,下面就正式开始wifi驱动的移植)
&&&& 配置Android支持WIFI &&&&
在BoardConfig.mk中添加:
BOARD_HAVE_WIFI := true
BOARD_WPA_SUPPLICANT_DRIVER := WEXT
这将在external/wpa_supplicant/Android.mk设置WPA_BUILD_SUPPLICANT为true,
默认使用驱动driver_wext.c。
如果使用定制的wpa_supplicant驱动(例如 madwifi),可以设置:
BOARD_WPA_SUPPLICANT_DRIVER := MADWIFI
&&&& 使能wpa_supplicant调试信息 &&&&
默认wpa_supplicant设置为MSG_INFO,为了输出更多信息,可修改:
1、在common.c中设置wpa_debug_level = MSG_DEBUG;
2、在common.c中把#define wpa_printf宏中的
if level) >= MSG_INFO)
改为
if level) >= MSG_DEBUG)
&&&& 配置wpa_supplicant.conf &&&&
wpa_supplicant是通过wpa_supplicant.conf中的ctrl_interface=来指定控制socket的设备,应该在
AndroidBoard.mk中配置好复制到$(TARGET_OUT_ETC)/wifi(也就是
/system/etc/wifi/wpa_supplicant.conf)
这个位置会在init.rc中再次检测的。
一般的wpa_supplicant.conf配置为:
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi    //////// (其实这里直接指定接口就可以了,即ctrl_interface=wlan0或eth0)
update_config=1
fast_reauth=1
有时,驱动需要增加:
ap_scan=1
如果遇到AP连接问题,需要修改ap_scan=0来让驱动连接,代替wpa_supplicant。
如果要连接到non-WPA or open wireless networks,要增加:
network={
key_mgmt=NONE
}
&&&& 配置路径和权限&&&&
Google修改的wpa_supplicant要运行在wifi用户和组下的。代码可见wpa_supplicant/os_unix.c
中的os_program_init()函数。
如果配置不对,会出现下面错误:
E/WifiHW  (  ): Unable to open connection to supplicant on
“/data/system/wpa_supplicant/wlan0″: No such file or directory will appear.
确认init.rc中有如下配置:
mkdir /system/etc/wifi 0770 wifi wifi
chmod 0770 /system/etc/wifi
chmod 0660 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf
# wpa_supplicant socket
mkdir /data/system/wpa_supplicant 0771 wifi wifi
chmod 0771 /data/system/wpa_supplicant
#wpa_supplicant control socket for android wifi.c
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
如果系统的/system目录为只读,那应该使用路径/data/misc/wifi/wpa_supplicant.conf。
&&&& 运行wpa_supplicant和dhcpcd &&&&
在init.rc中确保有如下语句:
service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant -dd
-Dwext -iwlan0 -c /data/misc/wifi/wpa_supplicant.conf
user root
group wifi inet
socket wpa_wlan0 dgram 660 wifi wifi
oneshot
service dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d -B wlan0
disabled
oneshot
根据所用的WIFI驱动名字,修改wlan0为自己驱动的名字。
&&&& 编译WIFI驱动为module或kernel built in &&&&
1、编译为module
在BoardConfig.mk中添加:
WIFI_DRIVER_MODULE_PATH := “/system/lib/modules/ar6000.ko”
WIFI_DRIVER_MODULE_ARG := “”  #for example nohwcrypt
WIFI_DRIVER_MODULE_NAME := “ar6000″  #for example wlan0
WIFI_FIRMWARE_LOADER := “”
2、编译为kernel built in
1)在hardware/libhardware_legacy/wifi/wifi.c要修改interface名字,
2)在init.rc中添加:
setprop wifi.interface “wlan0″
3)在hardware/libhardware_legacy/wifi/wifi.c中当insmod/rmmod时,
直接return 0。
&&&& WIFI需要的firmware &&&&
Android不使用标准的hotplug binary,WIFI需要的firmware要复制到/etc/firmware。
或者复制到WIFI驱动指定的位置,然后WIFI驱动会自动加载。
&&&& 修改WIFI驱动适合Android &&&&
Google修改的wpa_supplicant要求SIOCSIWPRIV ioctl发送命令到驱动,及接收信息,例如signal
strength, mac address of the AP, link speed等。所以要正确实现WIFI驱动,需要从
SIOCSIWPRIV ioctl返回RSSI (signal strength)和MACADDR信息。
如果没实现这个ioctl,会出现如下错误:
E/wpa_supplicant(  ): wpa_driver_priv_driver_cmd failed
wpa_driver_priv_driver_cmd RSSI len = 4096
E/wpa_supplicant(  ): wpa_driver_priv_driver_cmd failed
D/wpa_supplicant(  ): wpa_driver_priv_driver_cmd LINKSPEED len = 4096
E/wpa_supplicant(  ): wpa_driver_priv_driver_cmd failed
I/wpa_supplicant(  ): CTRL-EVENT-DRIVER-STATE HANGED
&&&& 设置dhcpcd.conf &&&&
一般/system/etc/dhcpcd/dhcpcd.conf的配置为:
interface wlan0
option subnet_mask, routers, domain_name_servers

android wifi驱动移植详细过程的更多相关文章

  1. Android平台开发-WIFI 驱动移植 -- 详细

    一.WIFI的基本架构(代码路径)     1.WIFI Settings应用程序:       packages/apps/Settings/src/com/android/settings/wif ...

  2. Android wifi驱动的移植 realtek 8188

    Android wifi驱动的移植 一般我们拿到的android源代码中wifi应用层部分是好的, 主要是wifi芯片的驱动要移植并添加进去. wifi驱动的移植, 以realtek的8188etv为 ...

  3. UCOS2_STM32F1移植详细过程(四)

    Ⅰ.概述 上一篇文章是讲述uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和os_cpu.h文件底层端口代码的移植(修改)和说明,接着上一篇文章来讲述关于UCOS移植应用 ...

  4. UCOS2_STM32F1移植详细过程(三)

    Ⅰ.概述 上一篇文章是讲述ST芯片相关的配置和OS裁剪相关的配置,接着上一篇文章来讲述关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和o ...

  5. UCOS2_STM32F1移植详细过程(二)

    Ⅰ.概述 打开上一篇文章新建的工程,是提取的ST标准库里面源代码文件和UCOS工程包源代码文件.下载过的朋友可能会知道,直接编译那个工程会有大片的错误和警告,原因在于那个工程是没有经过修改源代码的工程 ...

  6. I.MX6 AW-NB177NF WIFI 驱动移植问题

    /******************************************************************************** * I.MX6 AW-NB177NF ...

  7. UCOS2_STM32F1移植详细过程(一)

    Ⅰ.概述 该文写针对初学µC/OS的朋友,基于以下平台来一步一步移植µC/OS嵌入式操作系统.UCOS移植相关平台: 系统平台:µC/OS-II  (最新V2.92版) 硬件平台:STM32F1    ...

  8. UCOS2_STM32移植详细过程(汇总)

    Ⅰ.概述 笔者发现一个问题,很多初学者,甚至很多工作一两年的人,他们有一种依赖的思想,就是希望从别处获取的软件代码不做任何修改,直接可以运行或者使用.笔者想说,实践才是检验真理的关键,实践才是掌握知识 ...

  9. EP-N8530S USB WIFI 驱动移植

    /*********************************************************************** * EP-N8530S USB WIFI 驱动移植 * ...

随机推荐

  1. intent属性

    private String mAction;private Uri mData;private String mType;private String mPackage;private Compon ...

  2. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  3. hdu 2046 骨牌铺方格

    #include<stdio.h> int main(void) { long long i,n,narr[55]; narr[1]=1;narr[2]=2;narr[3]=3; for( ...

  4. iOS Xcode 调试技巧 全局断点这样加才有意思

    http://blog.sina.com.cn/s/blog_876a2c9901016ezh.html

  5. nl命令详解

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  6. Linux SSH安全策略限制IP登录方法(转)

    本文介绍了Linux SSH安全策略限制IP登录的两种方法.具体如下: 方法一: 首先需要限制登录的ip(或者如果需要自己本地登录,查看最后登录ip即可) Vim /etc/hosts.allow 输 ...

  7. Struts2标签简介

    Struts2标签简介 Struts2标签的优势 标签库简化了用户对标签的使用 结合OGNL使用,对于集合.对象的访问功能非常强大 提供可扩展的主题.模板支持,极大简化了视图页面的编写 不依赖任何表现 ...

  8. jquery 使用方法<转载>

    jquery 使用方法 jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司 甚至把jQuery作为他们的官 ...

  9. 10 steps to becoming the developer everyone wants

    You thought it was all about programming skills. But you were wrong! Great code is fine, yet command ...

  10. js 判断所有节假日

    // JavaScript Document calendar = new Date(); month = calendar.getMonth(); date = calendar.getDate() ...