转载:USB wifi调试笔记
1赞本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记。
1、WIFI打不开现象概述
WiFi打不开是指您在UI的settings下选中WiFi选项,将其置为on(打开),但最终结果是自动变成off(关闭)、正在打开Wi-Fi、正在扫描等一系列不能正常打开WiFi的提示。
2、问题分析流程
WiFi打不开从硬件和软件两方面进行定位,一般是先硬件,然后软件。总体分析流程如图:
3、确认硬件可以识别
8192CU WiFi模块是基于usb接口,在UI将wifi设置为ON状态,通过串口输入lsusb确认设备可以识别。
红色标记Bus 002 Device 003: ID 0bda:8176就是平台上8192CU usb WiFi的vid和pid,能显示这个说明系统可以正常识别8192CU usb WiFi设备,硬件没问题。
4、确认驱动已加载
确认硬件没问题后,接着查看驱动是否加载,lsmod。
当你在UI的settings里将WiFi置于on状态,如果能正常打开,这时在串口输入lsmod,会有以下结果
红色标记8192cu ko,说明8192CU WiFi 驱动已经成功加载上,如果此时没有看到此ko文件,请切换到平台/system/lib/目录下,查看此目录下是否有8192CU的ko。
可以看到平台下有8192cu.ko。如果您平台下有这个文件,请进入5进行进一步分析,如果您的平台没有这个文件,请进入6进行进一步分析。
5、平台/system/lib下有驱动ko文件
首先确保其权限至少为-rw-r--r--(即644),如果权限不对,请按照下面操作修改权限:
chmod644 8192cu.ko
如果这些都是正常的话请先进行手动加载
手动加载操作说明:先切换到平台/system/lib/目录下,然后进行如下操作:
insmod8192cu.ko
如果手动加载成功的话,请进入a进行下一步分析,如果手动加载不成功的话,请进入b进行下一步分析
a. 手动加载可以成功,说明UI加载不成功应该是系统配置文件不对,没有加载到指定路径的驱动。
如果您是Android 4.1请按照如下配置:
确保device\xxx录下BoardConfig.mk文件中有如下配置:
WIFI_DRIVER := rtl8192cu
WIFI_DRIVER_MODULE_PATH := /system/lib/8192cu.ko
WIFI_DRIVER_MODULE_NAME := 8192cu
其中WIFI_DRIVER指定您从UI打开WiFi要加载什么驱动;WIFI_DRIVER_MODULE_PATH说明你要加载驱动的ko文件放在什么地方;WIFI_DRIVER_MODULE_NAME指明驱动模块的名字。
b. 手动加载驱动也不成功,一般有两个原因:
(1) 编译内核时没有将cfg80211协议编进去,对于g18公板这块是默认配置上,如果没有配置上,您在编译内核前,先进入common目录,输入make menuconfig,配上Networkingsupport里面的内容
(2) 编译驱动的内核和您目前平台的跑的内核不是同一份code,这个从手动加载不成功的log可以很明显就看出来的,所以务必使编译驱动的内核和您目前平台跑的内核是同一份code。最安全方法是重新打包升级
对于是这两种原因的哪一个,从加载驱动不成功的log可以很容易看出来魔数不匹配。
6、平台/system/lib下没有驱动ko文件
您需要编译8192CU的ko文件,驱动在common/drivers/net/wireless/rtl8xxx_CU。将其拷贝到/system/lib/目录下并修改其权限,修改权限命令如下:
chmod644 8192cu.ko
注意:在编译8192CU驱动时,保证编译驱动的内核code和系统当前运行的内核code是同一份code,否则ko文件加载不上,会提示编译的驱动和当前系统的内核的版本不匹配的错误信息。
如果这样操作还是出现加载不上,那按照下述步骤打包升级。
(1)先按照6中的a配置好相应文件
(2)将8192CU驱动8192cu.ko编译出来,并将其拷贝到device\xxx下
(3)打包升级。
7、硬件OK、驱动已经加载
在经过如上这些定位和解决之后,从UI的settings加载WiFi驱动应该是没有问题了,正常情况下到此步的时候UI界面可以显示出WiFi扫描到的不同AP,但是也不排除WiFi还是打不开,这时候打不开主要有以下现象,将WiFi至于on,发现一闪而过,又变成off,还有就是界面上显示“正在打开Wi-Fi......”,还有就是显示正在扫描,这时候出现的问题可能在wpa_supplicant这块,请进入8进行进一步分析。
8、wpa_supplicant分析
8.1 wpa_supplicant相关文件和服务的确认
(1) 确认平台/system/bin/下wpa_supplicant存在:
操作步骤说明如下:
130|root@android:/system/bin# ls -l wpa_supplicant
-rwxr-xr-x root shell 686672 2008-08-01 12:00
同时确保文件操作属性至少为-rwxr-xr-x(755)
(2)对于Android 4.1确认device\xxx下init.rc中存在如下service
service p2p_supplicant /system/bin/wpa_supplicant \
-ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf\
-e/data/misc/wifi/entropy.bin-puse_p2p_group_interface=1\
-N -iwlan0-Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf
class main
socket wpa_wlan0 dgram 0660 wifi wifi
disabled
oneshot
service wpa_supplicant /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf\
-e/data/misc/wifi/entropy.bin
class main
socket wpa_wlan0 dgram 0660 wifi wifi
disabled
其中p2p_supplicant是当WiFi作为p2p功能启动的服务,wpa_supplicant是WiFi作为station功能启动的服务。
8.2 将WiFi至于on,发现一闪而过,又变成off
对于这种现象主要存在两种情况:
(1) 平台下缺少wpa_supplicant和p2p_supplicant的配置文件
确认平台/data/misc/wifi/目录下是否存在wpa_supplicant.conf和p2p_supplicant.conf文件,并确认这些文件操作权限,操作说明如下:
130|root@android:/data/misc/wifi# ls -l *supplicant.conf
-rw-rw---- system wifi 219 2013-07-03 03:28p2p_supplicant.conf
-rw-rw---- system wifi 374 1970-01-02 00:35wpa_supplicant.conf
(2) 对WiFi提供的接口进行确认:
这部分主要是您要清楚WiFi作为什么功能,即WiFi是仅仅作为station功能,还是要开启p2p功能,当WiFi作为station功能时候开启的是wpa_supplicant服务,当WiFi作为p2p功能开启的是p2p_supplicantf服务。
当WiFi作为station功能时开启的是wpa_supplicant,这时候一般不会出现接口错误,因为这时候wpa_supplicant服务中只用到wlan0接口,即使上层不定义wlan0底层驱动也会默认产生wlan0接口
当WiFi作为p2p功能时开启的是p2p_supplicant,这时候可能会出现接口错误,因为p2p_supplicant服务会用到p2p0接口,所以您需要提前定义好p2p0。
如果你没有定义p2p0接口,但加载时候有时候会首先启动p2p_supplicant服务,由于p2p_supplicant服务会用到p2p0这个接口,所以出现加载失败。那么怎样才能使系统不首先启动p2p_supplicant服务,而是首先启动wpa_supplicant服务?这是因为您平台/etc/permisssions/目录下有android.hardware.wifi.direct.xml这个文件,只要将这文件删掉或者重命名下,修改后记得要reboot下才能生效,操作说明如下:
130|root@android:/etc/permissions# ls -l
-rw-r--r-- root root 158 2008-08-01 12:00 amlogic.libplayer.xml
-rw-r--r--root root 150 2008-08-01 12:00amlogic.pppoe.xml
-rw-r--r--root root 168 2008-08-01 12:00amlogic.subtitle.xml
-rw-r--r-- root root 975 2008-08-01 12:00 android.hardware.usb.accessory.xml
-rw-r--r-- root root 868 2008-08-01 12:00 android.hardware.usb.host.xml
-rw-r--r-- root root 843 2008-08-01 12:00 android.hardware.wifi.direct.xml
-rw-r--r--root root 829 2008-08-01 12:00 android.hardware.wifi.xml
-rw-r--r--root root 1050 2008-08-01 12:00 android.software.live_wallpAPer.xml
-rw-r--r--root root 880 2008-08-01 12:00android.software.sip.voip.xml
-rw-r--r--root root 828 2008-08-01 12:00com.android.location.provider.xml
-rw-r--r-- root root 828 2008-08-01 12:00com.google.widevine.software.drm.xml
-rw-r--r--root root 10536 2008-08-01 12:00 platform.xml
-rw-r--r--root root 2614 2008-08-01 12:00tablet_core_hardware.xml
怎么判断启动的是p2p_supplicant还是wpa_supplicant?因为您在没有定义p2p0时启动p2p_supplicant服务,从log里面可以很明显看到如下log:
wpa_supplicant( 4316):p2p0: Failed to initialize driver interface
提示:为避免因为接口出现加载失败,按照以下设置就不会出现此类错误:
对于Android 4.1,确保device\xxx目录下Boarconfig.mk中有如下内容:
WIFI_DRIVER_MODULE_ARG := "ifname=wlan0 if2name=p2p0"
9、UI上“正在打开Wi-Fi......”
这个现象一般会有如下几种情况:
(1) 缺少配置文件:按照8的步骤确认
(2) 驱动加载失败,使底层的网络接口都没有产生,以致supplicant对底层的网络接口初始化失败,但是supplicant会尝试重复初始化几次,如果不断初始化一段时间后还是会失败,最终supplicant退出,UI上WiFi变成off。
怎么查看平台下的WiFi模块的接口有没有产生,直接在串口输入netcfg命令,操作如下:
130|root@android:/# netcfg
lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00
eth0 DOWN 0.0.0.0/0 0x00001002 00:56:0b:d9:59:65
sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
ip6tnl0 DOWN 0.0.0.0/0 0x0000008000:00:00:00:00:00
wlan0 UP 192.168.0.138/24 0x00001043 34:08:04:df:9a:63
p2p0 UP 0.0.0.0/0 0x00001003 36:08:04:df:9a:63
这是我在自己机器上操作结果,红色标记的wlan0和p2p0接口就是WiFi模块产生的两个与supplicant进行通信的接口。
(3) 底层WiFi模块确实已经在系统产生了相应接口,但是supplicant对这些接口进行初始化的时候失败,这主要是因为底层驱动提供给supplicant的接口函数有问题,这个一般是底层驱动的问题,请反馈给作者进一步分析。
10、 UI上“正在扫描AP......”
一般出现这种现象应该是supplicant和底层WiFi驱动通信有问题,请反馈给作者分析。