一,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原生的Android2.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目录/模块目录中
- $(CLEAR_VARS)
- LOCAL_MODULE:= rt5370sta.ko下
- LOCAL_MODULE_TAGS:=用户
- LOCAL_MODULE_CLASS:SHARED_LIBRARIES
- LOCAL_MODULE_PATH:=的$(TARGET_OUT_SHARED_LIBRARIES)/模块
- LOCAL_SRC_FILES:= $的{RT5370_PATH} / rt5370sta.ko#PATH
- 包括$(BUILD_PREBUILT)
3)查看wifi.c文件阁路径及名字是否正确,若不正确需要修改正确
4)修改init.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模式
- 公共 无效 resetConnections(布尔 disableInterface)
- (disableInterface)
-
-
- }
#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代码的调用函数为:
- 静态 的JNIEnv * env设置,J Object中clazz,jstring IFNAME:jint android_net_utils_disableInterface()
- {
- 整数 的结果;
-
- 常量 字符 * nameStr的=的env-> GetStringUTFChars(IFNAME,NULL);
- 导致= :: ifc_disable(nameStr的);
- ENV-> ReleaseStringUTFChars(上次,nameStr的);
- 回报 (jint)的结果;
- }
此JNI函数又调用了ifc_disable函数,如下:
- 诠释 ifc_disable(常量 字符 * IFNAME)
- {
- 整数 的结果;
-
- ifc_init();
- ifc_down(上次);
- ifc_set_addr(IFNAME,0);
- ifc_close();
- 返回 结果;
- }
ifc_down函数
- 诠释 ifc_down(常量 字符 *名)
- {
- 返回 ifc_set_flags(姓名,0,IFF_UP);
- }
-
- 静态的 诠释 ifc_set_flags(常量 字符 *名,无符号集,未签名的CLR)
- {
- 结构 ifreq的IFR;
- ifc_init_ifr(姓名,IFR);
-
- (ifc_ctl_sock,SIOCGIFFLAGS,IFR的ioctl()<0) -1;
- ifr.ifr_flags =(ifr.ifr_flags和(CLR))|设置;
- 返回 的ioctl(ifc_ctl_sock,SIOCSIFFLAGS,与IFR);
- }
下降时的标志和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当前是开着的,而却发现关机再重启却没自动开启的话,很有可能是飞行模式揉的货!
修改数据库即可正常
,如下:
- sqlite3的/数据/数据/ com.android.providers.settings /数据库/ settings.db
- 删除 名称 = '' ;
- 。退出
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状态栏部分代码如下:
- 否则, 如果 (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)| |
- action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)| |
- action.equals(WifiManager.RSSI_CHANGED_ACTION)){
- updateWifi(意向);}
- 私人 最终的 无效 updateWifi(意向意图){
- 最后的 字符串操作= intent.getAction();
- 如果 (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)){
-
- 最后 布尔 启用intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
- WifiManager.WIFI_STATE_UNKNOWN)== WifiManager.WIFI_STATE_ENABLED的;
-
- (启用)
-
- mService.setIconVisibility(“WIFI” , 假);
- }
-
- } 否则, 如果 (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){
- 最后 布尔 启用intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,
- 假);
- (启用)
- mService.setIconVisibility(“WIFI” , 假);
- }
- } 否则, 如果 (action.equals(WifiManager.RSSI_CHANGED_ACTION)){
- INT iconId;
-
- 最后 newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI - 200 );
- 诠释 newSignalLevel = WifiManager.calculateSignalLevel(newRssi
- sWifiSignalImages [ 0 ]的长度);
- (newSignalLevel!mLastWifiSignalLevel)
- mLastWifiSignalLevel = newSignalLevel;
- 如果 (mIsWifiConnected的){
- iconId = sWifiSignalImages [mInetCondition] [newSignalLevel];
- } 其他 {
- iconId = sWifiTemporarilyNotConnectedImage;
- }
- mService.setIcon(“WIFI” ,iconId, 0 );
- }
- }
- } <跨度风格= “字体家庭:宋体,宋体,sans-serif字体,白色空间:正常;背景色:RGB(255,255,255)” > </ SPAN>
- <前名“代码” = “java”的>
-
-
-
-
-
-
-
-
-
- 公共 静态 诠释 calculateSignalLevel的( RSSI的,的 诠释 numLevels)
- (RSSI <= MIN_RSSI的){
- 返回 0;
- } 否则 ,如果 (RSSI> = MAX_RSSI)的{
- 返回 numLevels - 1;
- } 其他 {
- 诠释 partitionSize =(MAX_RSSI - MIN_RSSI)/(numLevels - 1);
- 回报率“ (RSSI - MIN_RSSI)/ partitionSize;
- }
- }
- </ pre>
- <PRE> </ pre>
- <前名称= “代码” = “HTML” > I / WifiStateTracker(1799):────getRssiApprox ------------ WifiNative。getRssiCommand(): - 20
- 我/ WifiStateTracker的(1799年):----------------------> newRssi:-20
- 我/ WifiStateTracker的(1799):----------------------> newSignalLevel:3
- </ pre>参考
- <跨度风格= “字体大小: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 /类/净目录下创建ÆÆ相关的文件,如下所示:
- / SYS / 类/净#LS
- 罗
- 为eth0
- WLAN0
- / SYS / 类/净#ls-l的
- lrwxrwxrwx根1969年12月31日16:59 LO - > .. /。。/设备/虚拟/ NET / LO
- lrwxrwxrwx根1969年12月31日16点为eth0 - > .. / ../devices/platform/bcmgenet.0/net/eth0
- lrwxrwxrwx根1969年12月31日16时59 WLAN0 - > .. / ../devices/platform/ehci-brcm.1/usb2/2-1/net/wlan0
通过在硬件抽象层添加下面的函数,来确认的Wi-Fi是否连接?如下图:
- 静态 常量和 字符 DRIVER_FILE [] = “/ sys/class/net/wlan0” ;
- 诠释 check_device(){
- devfd = 0;
- devfd开放(DRIVER_FILE,O_RDONLY);
- 如果 (devfd <0){
- 关闭(devfd);
- LOGE( “ 无法打开\”%s \“:%S” ,DRIVER_FILE,于strerror(errno的));
- 返回 -1;
- }
- 关闭(devfd);
- 返回 0;
- }
下面通过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命令。