android wifi ralink rt3070开发记录

来源:互联网 发布:麻瓜 python 编辑:程序博客网 时间:2024/05/17 21:47

一,WIFI的基本架构

    1,开源代码移植部分(的外部目录下)
        wireless_tools,使用wpa_supplicant,wpa_supplicant_6(后两项已经移植过)
        生成库libwpaclient.so和守护进程使用wpa_supplicant及的iwconfig,iwlist等相关的测试程序
    2,硬件/ libhardware_legary / WIFI / wifi.c是无线管理库
        生成libnetutils.so
        同时会和使用wpa_supplicant守护进程通信
    3,JNI部分的框架/基/核心/ JNI / android_net_wifi_Wifi.cpp这个是无线连接,扫描方面的调用
       
        框架/基/核心/ JNI / android_net_NetUtils.cpp这个是管理网络方面的工具,如DHCP,路由,净EN /不能等
    4、JAVA部分
        frameworks/base/services/java/com/android/server/
        frameworks/base/wifi/java/android/net/wifi/   
        框架/基/核心/ JAVA /机器人/净这个是管理网络的工具,调用第三条的第二个JNI
    5,WIFI设置位于包/应用程序/设置/ SRC / COM /的机器人/设置/ WIFI /
       
    6,WIFI驱动模块 
        使用wpa_supplicant通过wireless_ext接口和驱动通信
    7,WIFI硬件模块
        D-LINK DWA-125芯片:雷凌  RT3070
二,无线开发记录
        1,5370驱动编译安装及使用过程
              设置“MODE = STA”在Makefile中选择了Linux的目标,集“TARGET = LINUX”
              集“HAS_WPA_SUPPLICANT = y'和'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT = Y'
              #使用wpa_supplicant Dwext iwlan0-C wpa_supplicant.conf来完成的-D(-C无码系列,需要指定下wpa_supplicant.conf来完成的路径)
              wpa_supplicant.conf来完成的内容:
                    GROUP =轮
                    网络ctrl_interface = DIR = / var /运行/使用wpa_supplicant = { 
                            ssid的“家” 
                            scan_ssid = 1 
                            key_mgmt这WPA-PSK 
                            PSK =“非常秘密口令” 
                   } / /这个地方的大括号中的内容可在设置中点击选择某个AP后自动生成
              #sudo的苏(机器人平台需要自己添加暂未添加脚本compile-,和无码系列,写的有差异)
                   #清洁
                   #
                   #make install的
                   #modprobe的rt5370sta
                   #ifconfig命令WLAN0
                   #iwconfig的WLAN0
                   #的iwlist WLAN0扫描这时候已经可以扫描的Wi-Fi网络了
                   下面是dhcpcd的WLAN0即可。
        2、几个可执行程序:wpa_supplicant,wpa_cli等。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,可以使用wpa_cli来搜索、设置、和连接网络等,这两个可执行程序很重要
           在android中主要是Settings这个属于system的进程调用的libhardware_legecy库中的wifi.c文件和wpa_supplicant通信,同时也调用了wpa_supplicant中提供的libwpa_client.so库,这两个进程间通过socket通信收发数据来得到当前状态,同时也是通过wifi.c来启动和停止init.rc中的wpa_supplicant进程。
           dhcpcd的用来自动获取IP地址。
           IW的iwconfig的 iwpriv的iwspy这几个是测试命令,可用来测试无线当前的情况,以及扫描鸭等。
      3,以上是命令测试过程,下面进行代码的修改部分说明博通(Broadcom BCM7231)
            使用wpa_supplicant和wpa_cli原生的Andr​​oid2.3已经移植,但是没有无线工具工具,需要将工具移植进来,
不过这些工具相对都比较容易移植,不再详述,下载源码位置如下
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html。

     然后从驱动开始修改起
               1)修改5370驱动
                      设备名包括/ rtmp_def.h修改两个宏定义从RA0修改为WLAN0;
                      LINUX_SRC = ... (机器人的核心位置)             

                      ifeq($(PLATFORM),BCM7431)

                      LINUX_SRC = $的{ANDROID_PATH} /内核#修改路径为你的机器人目录

                      ENDIF

                             驱动编译后会生成两个文件:RT5370STA.ko和RT2870STA.dat,后面

                      会看到需要拷贝这两个文件到系统中。

                            ioctl的驱动代码接口在OS / linux / sta_ioctl.c中及STA / sta_cfg.c的中,如果遇到一些错误,一般在这里都能查找到。

                2)把rt5370sta.ko拷贝到..。/ lib目录/模块目录中

[普通] 查看纯副本
  1. $(CLEAR_VARS)  
  2. LOCAL_MODULE:= rt5370sta.ko下  
  3. LOCAL_MODULE_TAGS:=用户  
  4. LOCAL_MODULE_CLASS:SHARED_LIBRARIES  
  5. LOCAL_MODULE_PATH:=的$(TARGET_OUT_SHARED_LIBRARIES)/模块  
  6. LOCAL_SRC_FILES:= $的{RT5370_PATH} / rt5370sta.ko#PATH  
  7. 包括$(BUILD_PREBUILT)  

               3)查看wifi.c文件阁路径及名字是否正确,若不正确需要修改正确

                4)修改ini​​t.rc文件

                     搭配chmod 0771 /系统/ etc / WIFI WIFI无线上网

                     搭配chmod 0660 /系统/ etc / WIFI / wpa_supplicant.conf来

                     乔恩WIFI WIFI /系统的/ etc / WIFI / wpa_supplicant.conf来

                     MKDIR /数据/ MISC /无线0771 WIFI WIFI

                     MKDIR /数据/ MISC / WIFI WIFI WIFI /插座0771

                    #使用wpa_supplicant插座

                    MKDIR /数据/系统/ 0771系统的系统

                    MKDIR /数据/系统/ WIFI WIFI使用wpa_supplicant 0771

                    MKDIR /数据/ MISC / DHCP 0771系统系统

                    chmod为0777 /系统/ etc / dhcpcd程式/ dhcpcd的经营钩

                    chmod为0777 /数据/ MISC / DHCP /

                    mountyaffs2 MTD @ RO重新安装系统/系统

                    setprop wifi.interface WLAN0

                    使用wpa_supplicant服务/系统/斌/使用wpa_supplicant-DD-Dwext iwlan0 -c/system/etc/wifi/wpa_supplicant.conf

                            #组系统无线INET

                            禁用

                            单稳

                    服务  dhcpcd_wlan0  /系统/ bin / dhcpcd程式的WLAN0的     / /这里的服务需要修改为dhcpcd_wlan0(的Android2.2和2.3有差异,我这里是2.3) ,而不是dhcpcd的!

                            组系统的DHCP

                            禁用

                            单稳

           5)修改外部/使用wpa_supplicant / driver_wext.c

                这是为了避免wpa_supplicant与下层驱动通讯时出现ioctl[SIOCSIWPRIV]错误,因为现在大部分wifi模块对SIOCSIWPRIV命令不处理,而这个命令要用于侦测wifi强度RSSI的,比较简单的方法是在wifi驱动中增加个空函数或者修改调用的返回值为0。由于大多数模块不支持SIOCSIWPRIV,所以目前采用修改调用的返回值的方法。修改:froyo\external\wpa_supplicant\driver_wext.c

               wpa_driver_priv_driver_cmd()函数中:

                   / /如果((RET =的ioctl(传动 - > ioctl_sock,SIOCSIWPRIV,与IWR))<0){

                            / / PERROR的(“的ioctl [SIOCSIWPRIV]”);

                      / /                    }     

/ /如果无码系列,不注释掉,将导致系统不断报错,错误为  IOCTL :: unknownIOCTL CMD = 0x00008b0c,我跟踪了下代码驱动中并没有这个IOCTL,

另外在wpa_supplicant的头文件中也显示未使用,但是在代码中却用了这个ioctl,所以必须把这段代码删除!


           6) 修改的Android打开WIFI流程

               经测试5370 模块在使用ifconfig WLAN0下来时配置

               iwconfig wlan0模式

[JAVA] 查看纯副本
  1. 公共 无效 resetConnections(布尔 disableInterface)  
  2.           (disableInterface)  
  3.       / /如果(LOCAL_LOGD)Log.d(TAG,“禁用接口”);  
  4.       / / NetworkUtils.disableInterface(mInterfaceName);  
  5.           }     / /此处若不修改将导致无线关闭后再次开启,扫描不到AP!  

#netcfg的

罗UP 127.0.0.1 255.0.0.0 0x00000049

eth0的UP 10.20.112.46 255.255.255.0 0x00001043

WLAN0  DOWN  0.0.0.0 0.0.0.0 0x00001002

#iwconfig wlan0模式管理

无线请求“设定模式”(8B06)的误差为:

SET失败的设备WLAN0网络已关闭。

#iwconfig的WLAN0的绰号“RobinYeung”

无线请求“设置昵称”(8B1C)的错误为:

SET失败的设备WLAN0网络已关闭。

     

        上面的java代码的调用函数为:

[CPP] 查看纯副本
  1. 静态 的JNIEnv * env设置,J Object中clazz,jstring IFNAME:jint android_net_utils_disableInterface()  
  2. {  
  3.     整数 的结果;  
  4.   
  5.     常量 字符 * nameStr的=的env-> GetStringUTFChars(IFNAME,NULL);  
  6.     导致= :: ifc_disable(nameStr的);  
  7.     ENV-> ReleaseStringUTFChars(上次,nameStr的);  
  8.     回报 (jint)的结果;  
  9. }  


此JNI函数又调用了ifc_disable函数,如下:
[CPP] 查看纯副本
  1. 诠释 ifc_disable(常量 字符 * IFNAME)  
  2. {  
  3.     整数 的结果;  
  4.   
  5.     ifc_init();   / /调用套接字函数,得到FD  
  6.     ifc_down(上次);   / /通过IOCTL设定到内核  
  7.     ifc_set_addr(IFNAME,0);  
  8.     ifc_close();  / /关闭FD  
  9.     返回 结果;  
  10. }  
ifc_down函数
[CPP] 查看纯副本
  1. 诠释 ifc_down(常量 字符 *名)  
  2. {  
  3.     返回 ifc_set_flags(姓名,0,IFF_UP);  
  4. }  
  5.   
  6. 静态的 诠释 ifc_set_flags(常量 字符 *名,无符号集,未签名的CLR)  
  7. {  
  8.     结构 ifreq的IFR;  
  9.     ifc_init_ifr(姓名,IFR);  
  10.   
  11.     (ifc_ctl_sock,SIOCGIFFLAGS,IFR的ioctl()<0)   -1;  
  12.     ifr.ifr_flags =(ifr.ifr_flags和(CLR))|设置;  
  13.     返回 的ioctl(ifc_ctl_sock,SIOCSIFFLAGS,与IFR);  
  14. }  

下降时的标志和FFFFFFFE,然后通过IOCTL设定到内核中。

             7)  创建wpa_supplicant.conf来完成的文件

                     在你的board配置目录下MIPSAndroid_Phase2.1/bcm_mipsgingerbread20111129/AppLibs/opensource/android/src/mips-gingerbread/vendor/broadcom/bcm_platform/prebuilt创建一个wpa_supplicant.conf文件,输入如下内容:

                        ctrl_interface = DIR = /数据/系统/使用wpa_supplicant GROUP =无线上网

                        update_config = 1

                        ap_scan = 1

              8)修改board配置目录下的AndroidBoard.mk

               或AndroidBoard.mk下增加如下代码:

                      $(CLEAR_VARS)

                      LOCAL_MODULE:= wpa_supplicant.conf来

                      LOCAL_MODULE_TAGS:=用户

                      LOCAL_MODULE_CLASS:= ETC

                      LOCAL_MODULE_PATH:=的$(TARGET_OUT_ETC)/ WIFI

                      LOCAL_SRC_FILES:= $(LOCAL_MODULE)

                      包括$(BUILD_PREBUILT)

              9)少了一个步骤,就是拷贝RT2870STA.dat到等下

                      包括$(CLEAR_VARS)
                      LOCAL_MODULE:= RT2870STA.dat下

                      LOCAL_MODULE_CLASS:= ETC

                      LOCAL_MODULE_PATH:=的$(TARGET_OUT_ETC)/ Wireless/RT2870STA

                      LOCAL_SRC_FILES:= $(LOCAL_MODULE)

                      包括$(BUILD_PREBUILT)

              10)干净然后

                 根据您的脚本构建Android或全部


 三,开发遇到的问题汇总
    1、如果发现wifi当前是开着的,而却发现关机再重启却没自动开启的话,很有可能是飞行模式揉的货!修改数据库即可正常,如下:
[SQL] 查看纯副本
  1. sqlite3的/数据/数据​​/ com.android.providers.settings /数据库/ settings.db  
  2. 删除  名称 =  '' ;  
  3. 。退出  

     2,无线网络信号强度问题
        源码位置2.2和2.3不同,2.2在frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java
2.3在框架/基地/包/ SystemUI / SRC / COM /机器人/ systemui /状态栏/ StatusBarPolicy.java
2.3中单独成为一个apk文件,叫SystemUI.apk,从源码位置也能看出来。更新WiFi状态栏部分代码如下:
[JAVA] 查看纯副本
  1. 否则, 如果 (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)| |  
  2.         action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)| |  
  3.         action.equals(WifiManager.RSSI_CHANGED_ACTION)){  
  4.     updateWifi(意向);}  
[JAVA] 查看纯副本
  1. 私人 最终的 无效 updateWifi(意向意图){  
  2.     最后的 字符串操作= intent.getAction();  
  3.     如果 (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)){  
  4.   
  5.         最后 布尔 启用intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,  
  6.                 WifiManager.WIFI_STATE_UNKNOWN)== WifiManager.WIFI_STATE_ENABLED的;  
  7.   
  8.          (启用)  
  9.             / /如果禁用,隐藏图标。(连接时显示图标)。  
  10.             mService.setIconVisibility(“WIFI” ,  );  
  11.         }  
  12.   
  13.     }  否则, 如果 (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){  
  14.         最后 布尔 启用intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,  
  15.                                                        );  
  16.          (启用)  
  17.             mService.setIconVisibility(“WIFI” ,  );  
  18.         }  
  19.     }  否则, 如果 (action.equals(WifiManager.RSSI_CHANGED_ACTION)){  
  20.         INT  iconId;  
  21.           
  22.         最后  newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI - 200 );  
  23.         诠释 newSignalLevel = WifiManager.calculateSignalLevel(newRssi  
  24.                                                               sWifiSignalImages [ ]的长度);  
  25.          (newSignalLevel!mLastWifiSignalLevel)  
  26.             mLastWifiSignalLevel = newSignalLevel;  
  27.             如果 (mIsWifiConnected的){  
  28.                 iconId = sWifiSignalImages [mInetCondition] [newSignalLevel];  
  29.             }  其他 {  
  30.                 iconId = sWifiTemporarilyNotConnectedImage;  
  31.             }  
  32.             mService.setIcon(“WIFI” ,iconId,  );  
  33.         }  
  34.     }  
  35. } <跨度风格= “字体家庭:宋体,宋体,sans-serif字体,白色空间:正常;背景色:RGB(255,255,255)” > </ SPAN>  
[CPP] 查看纯副本
  1. <前名“代码”  “java”的>     / ** 
  2.      *计算的信号电平。这应该是任何时候使用一个信号 
  3.      *示出。 
  4.      *  
  5.      * @参数RSSI RSSI测量的信号的功率。 
  6.      * @参数numLevels至于多个层面的考虑在计算 
  7.      *水平。 
  8.      * @返回A的信号电平,取值范围为0到numLevels-1中给出 
  9.      *(包括首尾两项)。 
  10.      * /  
  11.     公共 静态 诠释 calculateSignalLevel的( RSSI的,的  诠释 numLevels)  
  12.          (RSSI <= MIN_RSSI的){  
  13.             返回 0;  
  14.         }  否则 ,如果 (RSSI> = MAX_RSSI)的{  
  15.             返回 numLevels - 1;  
  16.         }  其他 {  
  17.             诠释 partitionSize =(MAX_RSSI - MIN_RSSI)/(numLevels - 1);  
  18.             回报率“  (RSSI - MIN_RSSI)/ partitionSize;  
  19.         }  
  20.     }  
  21. </ pre>  
  22. <PRE> </ pre>  
  23. <前名称= “代码”  “HTML” > I / WifiStateTracker(1799):────getRssiApprox ------------ WifiNative。getRssiCommand(): - 20  
  24. 我/ WifiStateTracker的(1799年):----------------------> newRssi:-20  
  25. 我/ WifiStateTracker的(1799):--​​--------------------> newSignalLevel:3  
  26. </ pre>参考  
  27. <跨度风格= “字体大小:18像素,颜色:#330099” >根据日志可发现电平为-20,而根据计算公式算为(-55 - (-100))/ 3 = 15; </ SPAN>  
若RSSI电平= -20,那么结果为(-20 - (-100))/ 15 = 5。
后来发现自己忽略了前面一个,如果语句,-20明显> -55,将不进入计算分支,而直接计算4 - 1 = 3;
所以问题就解决了​​!


        3,USB类型的的Wi-Fi设备插拔导致的资源分类界面死掉的问题解决方案
     首先对于的Wi-Fi调起后将在/ SYS /类/净目录下创建ÆÆ相关的文件,如下所示:
[javascript的 视图普通副本
  1. / SYS / /净#LS  
  2. 罗  
  3. 为eth0  
  4. WLAN0  
  5. / SYS / /净#ls-l的  
  6. lrwxrwxrwx根1969年12月31日16:59 LO - > .. /。。/设备/虚拟/ NET / LO  
  7. lrwxrwxrwx根1969年12月31日16点为eth0 - > .. / ../devices/platform/bcmgenet.0/net/eth0  
  8. lrwxrwxrwx根1969年12月31日16时59 WLAN0 - > .. / ../devices/platform/ehci-brcm.1/usb2/2-1/net/wlan0  
    通过在硬件抽象层添加下面的函数,来确认的Wi-Fi是否连接?如下图:
[CPP] 查看纯副本
  1. 静态 常量和 字符 DRIVER_FILE [] =  “/ sys/class/net/wlan0” ;  
[CPP] 查看纯副本
  1. 诠释 check_device(){  
  2.      devfd = 0;  
  3.     devfd开放(DRIVER_FILE,O_RDONLY);  
  4.     如果 (devfd <0){  
  5.         关闭(devfd);  
  6.         LOGE( “ 无法打开\”%s \“:%S” ,DRIVER_FILE,于strerror(errno的));  
  7.         返回 -1;  
  8.     }  
  9.     关闭(devfd);  
  10.     返回 0;  
  11. }  
    下面通过jni将此函数传递给java层调用,来不断的确认wi-fi是否已经连接!同时我在此处又增加了查看usb总线上设备的product、manu、idProduct、idVendor等来再次确认wi-fi设备已经连接,这个函数不再贴出,要求也很简单,只需要读/sys/class/目录下usb的相关内容即可!

老外写的文档,相当有参考价值!
一,内容
0。了解Android的无线网络是如何工作的。
1。使建筑物的使用wpa_supplicant在你的BoardConfig.mk 
2。(可选)启用调试使用wpa_supplicant。
3。提供一个适当的wpa_supplicant.conf来为您的设备  
4。有正确的路径和权限创建init.rc 
5。确保您使用wpa_supplicant的dhcpcd(可选)从init.rc  
6。提供你的驱动程序作为一个模块的内核和适当的内核支持Android的源代码进行相应的修改。
7。如果你的模块需要提供一个固件
8。你的驱动程序与Android自定义使用wpa_supplicant命令和SIOCSIWPRIV的IOCTL的工作


二,有关详情
0。了解Android的无线网络的工作原理。,
    
Android使用修改后的  使用wpa_supplicant  (外部/使用wpa_supplicant)守护程序支持wifi的控制是通过一个套接字  硬件/ libhardware_legacy / WIFI / wifi.c的的(WiFiHW)会控制Android的UI通过 android.net。  从框架/基地/ WIFI / JAVA /机器人/网络/ WIFI / WIFI包  和它相对应的JNI实施  框架/基/核心/ JNI / android_net_wifi_Wifi.cpp的更高级别的网络管理 框架/基/核心/ JAVA / Android的/净

1。使建筑物的使用wpa_supplicant在你的BoardConfig.mk
    
这是通过简单地增加:  BOARD_WPA_SUPPLICANT_DRIVER:WEXT
你的  BoardConfig.mk。这将设置WPA_BUILD_SUPPLICANT到真正的在外部/使用wpa_supplicant来/ Android.mk使建设  driver_wext.c,, 如果你有一个自定义的使用wpa_supplicant驱动程序(如MadWifi或定制的Android私有命令仿真-见最后一段),你可以与AWEXT或更换WEXT你的驱动程序的名称(madwifi的,PRISM等)。



2。(可选)启用调试使用wpa_supplicant
    默认情况下,使用wpa_supplicant被设置为的MSG_INFO并没有告诉很多。为了让更多的消息:
2.1修改  common.c和和集  wpa_debug_level = MSG_DEBUG
2.2修改  common.h中和改变  的wpa_printf,从if((水平)> = MSG_INFO)的如果((水平)> = MSG_DEBUG)

3。提供一个适当的wpa_supplicant.conf来为您的设备
    提供 的wpa_supplicant.conf是很重要的,因为对Android平台的该文件中指定的控制插座(ctrl_interface =)。这个文件应该被复制,您的  AndroidBoard.mk(TARGET_OUT_ETC)/ WIFI(通常是  /系统/ etc / WIFI / wpa_supplicant.conf来完成的)。此位置将被用于从init.rc使用wpa_supplicant服务。  
    中,可以配置使用wpa_supplicant有两种不同的方式,一种是使用一个“私人”Android的命名空间中的socket创建  socket_local_client_connect()功能在  wpa_ctrl.c ,另一是通过使用标准的Unix套接字。

所需的最小配置选项的wpa_supplicant.conf:
- Android私人插槽的
ctrl_interface 




驱动程序,你可能还需要添加:
        ap_scan = 1,
如果你有AP关联的问题应该改变= 0 ap_scan,让驾驶者的关联,而不是使用wpa_supplicant。
如果你想wpa_supplicant来连接到非WPA或开启无线网络的(默认情况下,它会跳过这几样)地址:
网络= { 
             key_mgmt这= NONE / WPA-PSK
             SSID =名称
             PSK =密码
             优先数
}

4。有从init.rc创建正确的权限和路径
    会导致在使用wpa_supplicant不能够创建/打开控制插座libhardware_legacy / WiFi / wifi.c的的将无法连接。
    由于谷歌改进的使用wpa_supplicant运行  /组的目录结构和文件的所有权应属于无线用户/组(见的 os_program_init() 函数  使用wpa_supplicant / os_unix.c)。
否则这样的错误:
E / WifiHW():无法打开连接“/数据/系统请求者/ wpa_supplicant/wlan0“:没有这样的文件或目录 就会出现。
    的wpa_supplicant.conf应该属于无线用户/用户组,因为使用wpa_supplicant将要修改这个文件。如果您的系统/系统为只读的位置,如/数据/ MISC / WIFI / wpa_supplicant.conf来和修改init.rc使用wpa_supplicant服务与新的位置。
    请确保路径正确地创建init.rc:
         MKDIR /系统的/ etc /无线0770无线WIFI 
         搭配chmod 0770 /系统/等/ WIFI 
         搭配chmod 0660 /系统/ etc / WIFI / wpa_supplicant.conf来完成的
         乔恩WIFI WIFI /系统的/ etc / WIFI / wpa_supplicant.conf来完成
         #使用wpa_supplicant控制插座为Android wifi.c (机器人专用插座)
         MKDIR /数据/ MISC /无线0770无线WIFI 
         MKDIR /数据/ MISC / WIFI /插座0770 WIFI WIFI 
         搭配chmod 0770 /数据/ MISC / WIFI 
         搭配chmod 0660 /数据/ MISC /无线/ wpa_supplicant.conf来
         CHOWN的WIFI WIFI /数据/ MISC / WIFI 
         乔恩WIFI WIFI /数据/ MISC / WIFI / wpa_supplicant.conf来完成的,

如果你使用一个 Unix标准插座 的wpa_supplicant.conf(见上文)加:
        #使用wpa_supplicant插座(Unix套接字模式)
        MKDIR /数据/系统/使用wpa_supplicant 0771 WIFI WIFI 
        chmod 0771 /系统/数据/使用wpa_supplicant 
        乔恩WIFI WIFI /数据/系统/使用wpa_supplicant里

    不要添加这些,如果你使用Android私人插座,因为它会使用wpa_supplicant非功能性的,因为  硬件/ libhardware_legacy / WIFI / wifi.c的的检查的/数据/系统/使用wpa_supplicant 文件夹的存在  ,将传递一个错误的接口名称towpa_ctrl_open()函数。  

5。请确保您的使用wpa_supplicant和dhcpcd在init.rc从
init.rc启动,如应取决于你选择哪条路径:
- Android的私人插座:
使用wpa_supplicant /系统服务/ BIN /使用wpa_supplicant-DD-Dwext iwlan0-C /系统/ etc / WIFI / wpa_supplicant.conf来完成的
        插座wpa_wlan0 dgram 660 WIFI无线
        集群系统无线INET 
        禁用
        单稳  
- Unix标准插座:
使用wpa_supplicant服务/系统/斌/使用wpa_supplicant-DD-Dwext iwlan0-C /系统的/ etc / WIFI /的wpa_supplicant.conf 
        组系统无线INET的

        单稳,
    如果你的无线驱动程序创建一个WiFi接口与其他名称,而不是WLAN0,你将不得不修改上述行。
    您还应该从init.rc dhcpcd程式
WLAN0 
        组系统的DHCP 
        禁用
        单稳

。它提供你的驱动程序作为一个模块或内置的内核和适当的内核支持
    。驱动程序可以在内置模块(默认情况下,Android的方式),或建在内核(如果你想依靠在内核自动探测,以支持多个驱动器,例如USB WIFI),但需要修改源代码(见下文)。

-由于内核模块:
定义:
   1。WIFI_DRIVER_MODULE_PATH:=要加载的模块,路径
,通常看起来应该像/系统/库/模块/ wlan.ko 
   2。WIFI_DRIVER_MODULE_NAME:=的名称的网络接口驱动程序创建,例如WLAN0  
   3。WIFI_DRIVER_MODULE_ARG:任何参数,你想传递给insmod的驱动程序,例如nohwcrypt 
   确保构建Android的正确位置时,您将您的内核模块。
-建于内核:
-第一init.rc的需要进行修改,以通知硬件/ libhardware_legacy / WIFI / wifi.c的的的接口的名称,该驱动程序已加载并使用wpa_supplicant运行的状态设置为:  
setprop wifi.interface的的“WLAN0” 
setprop wlan.driver.status“OK” 
做   添加setprop init.svc.wpa_supplicant“运行”正如我前面提到的,因为它会阻止使用wpa_supplicant由init启动。
-其次硬件/ libhardware_legacy / WIFI / wifi.c需要进行修改,这样的函数的insmod命令()和rmmod()返回0(只需添加返回0;第一线的功能,因为它们不需要驱动程序是建立在内核时),检查/ proc / modules中check_driver_loaded()函数返回前,
    您可能会遇到问题,WifiHW模块不能够使用wpa_supplicant插座连接到甚至用正确permisions。尝试关闭/打开WiFi的GUI。

7。如果你的驱动需要提供一个固件,
    如果你的驱动需要一个固件,你将不得不复制固件文件到/ etc /固件的Android编译。Android不使用标准的热插拔二进制(虽然是一个实现  的android-x86的 系统/代码/工具箱/ hotplug.c的),而不是init进程需要照顾的固件事件,并加载固件文件从/ etc /固件(看到:系统/核心/的初始化/ devices.c中handle_firmware_event的()函数)。
固件文件名 ​​是由驱动程序定义,可能还包含一个文件夹,如:RTL8192SU/rtl8192sfw.bin,整个文件路径应该可以在/ etc /固件

8。与Android定制使用wpa_supplicant命令和SIOCSIWPRIV的ioctl。让您的驱动程序工作
的ioctl通常不实施任何已知的除了​​BCM4329,这是在谷歌的无线驱动程序  
的错误没有实现这个ioctl的样子:
E /使用wpa_supplicant():wpa_driver_priv_driver_cmd失败wpa_driver_priv_driver_cmd和RSSI长度= 4096  
E /使用wpa_supplicant():wpa_driver_priv_driver_cmd失败的  
D /使用wpa_supplicant() :wpa_driver_priv_driver_cmd LINKSPEED LEN = 4096 
E /使用wpa_supplicant():wpa_driver_priv_driver_cmd失败的  
I /使用wpa_supplicant():CTRL-EVENT-DRIVER-STATE忌用

4后,WEXT_NUMBER_SEQUENTIAL_ERRORS错误,机器人将中止使用设备。
禁用错误,检查在外部/使用wpa_supplicant / driver_wext.c的只是RET = 0; inwpa_driver_priv_driver_cmd()功能后的SIOCSIWPRIV的ioctl调用。这将使所有的接入点信号或MAC地址没有出现在Android UI。
    要正确贯彻落实的IOCTL,你需要修改你的内核驱动程序,回复SIOCSIWPRIV的ioctl信号强度(RSSI)和MACADDR命令是最重要的。
    一个更好的方法是添加一个自定义的driver_xxx.c谷歌外部/使用wpa_supplicant来/实施wpa_driver_priv_driver_cmd的()函数,将照顾的RSSI,的MACADDR和他人,通过调用到SIOCGIWSTATS,SIOCGIFHWADDR的ioctl,与其他的功能被称为driver_wext。 Ç
    下面是一个链接到一个修补程序,使用wpa_supplicant,我所做的  迷你box.com picoPC  Android编译。它创建了一个新的的驱动程序awext“模仿”的Android驱动程序使用无线扩展的ioctl命令。
原创粉丝点击