本文以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 加載不成功應該是系統配置文件不對 ,沒有加載到指定路徑的驅動。
本文以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可以很容易看出來魔數不匹配。
確保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)打包升級。
在經過如上這些定位和解決之后,從 UI 的 settings 加載 WiFi 驅動應該是沒有問題了,正常情況下到此步的時候 UI 界面可以顯示出 WiFi 掃描到的不同 AP ,但是也不排除 WiFi 還是打不開,這時候打不開主要有以下現象,將 WiFi 至於 on ,發現一閃而過,又變成 off ,還有就是界面上顯示“正在打開 Wi-Fi......” ,還有就是顯示正在掃描,這時候出現的問題可能在 wpa_supplicant
這塊,請進入8進行進一步分析。
您需要編譯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)打包升級。
在經過如上這些定位和解決之后,從 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驅動通信有問題,請反饋給作者分析。