硬件:imx6q

操作系统:Android4.4.2

 

本次修改基于厂商提供的RTL8723BU_WiFi_linux_v4.3.16_14189.20150519_BTCOEX2015119-5844包

下载链接:http://download.csdn.net/detail/bhj1119/9761769
<http://download.csdn.net/detail/bhj1119/9761769>

一 修改记录:
1.配置linux内核
(1)Networking support --->Wireless下增加802.11 协议栈的支持
--- Wireless                                                                
                                                        
<M>   cfg80211 - wireless configuration API
[*]     nl80211 testmode command   
[*]     enable developer warnings                                            
                                                        
[*]     cfg80211 regulatory debugging 
[*]     enable powersave by default
[ ]     cfg80211 DebugFS entries
[ ]     use statically compiled regulatory rules database  
[*]     cfg80211 wireless extensions compatibility
  [*]   Wireless extensions sysfs files 
-*-   Common routines for IEEE802.11 drivers
[ ]   lib80211 debugging messages  
[*]   Allow reconnect while already connected 
<M>   Generic IEEE 802.11 Networking Stack (mac80211)  
[ ]   PID controller based rate control algorithm  
[*]   Minstrel
[*]     Minstrel 802.11n support  
     Default rate control algorithm (Minstrel)  --->  
[*]   Enable mac80211 mesh networking (pre-802.11s) support 
  [*]   Enable LED triggers  
[ ]   Export mac80211 internals in DebugFS
[ ]   Select mac80211 debugging features  ---> 
(2) 配置Device Drivers  --->USB support  ---><*>   USB Wireless Device
Management support 支持WIFI


2.将RTL8723BU_WiFi_linux_v4.3.16_14189.20150519_BTCOEX2015119-5844/driver下的压缩包拷贝到ANDROID_SDK/kernel_imx/drivers/net/wireless下,解压,修改其Makefile,编译wifi驱动模块,修改内容如下:
CONFIG_PLATFORM_IMX6Q = y


ifeq ($(CONFIG_PLATFORM_IMX6Q), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
-DCONFIG_PLATFORM_ANDROID -DCONFIG_ANDROID -DCONFIG_CONCURRENT_MODE
ARCH := arm
CROSS_COMPILE := XXX/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
KSRC := XXX/kernel_imx//
MODULE_NAME := 8723bu
endif
如果(1)中选项没有选上,会导致加载wifi模块时报如下错误:
rtl8723bu: no symbol version for cfg80211_ready_on_channel
rtl8723bu: Unknown symbol cfg80211_ready_on_channel (err -22)
rtl8723bu: Unknown symbol odm_SwAntDetectInit (err 0)
rtl8723bu: no symbol version for __ieee80211_get_channel
rtl8723bu: Unknown symbol __ieee80211_get_channel (err -22)
rtl8723bu: no symbol version for cfg80211_roamed
rtl8723bu: Unknown symbol cfg80211_roamed (err -22)
rtl8723bu: no symbol version for wiphy_register
rtl8723bu: Unknown symbol wiphy_register (err -22)
原因就是:编译WiFi模块时会去KSRC所指的路径下找相应的库,若果相关的编译选项没有选上会导致某些库缺失,从而导致编出来的WiFi模块不完整。
上述是由于编译内核时内有勾选80211协议栈导致。

3.用厂商提供的hardware/realtek 替换hardware/realtek

4.用厂商提供的wpa_supplicant_8_kk_4.4_rtw_r12456.20141003替换ANDROID_SDK/extern/wpa_supplicant_8,并修改文件夹的名字为wpa_supplicant_8。
5.hardware/libhardware_legacy/wifi/Android.mk 
修改内容如下:
--- Android.mk  (版本 170)
+++ Android.mk  (工作副本)
@@ -49,15 +49,21 @@
LOCAL_CFLAGS += -DWIFI_DRIVER_FW_PATH_PARAM=\"$(WIFI_DRIVER_FW_PATH_PARAM)\"
endif


-ifeq ($(BOARD_WLAN_DEVICE),UNITE)
-  LOCAL_C_INCLUDES +=
$(LOCAL_PATH)/../../external/wpa_supplicant_ath/wpa_supplicant/src/common
-  LOCAL_SRC_FILES += wifi/wifi_unite.c
-else ifeq ($(BOARD_WLAN_VENDOR), INTEL)
-  LOCAL_SRC_FILES += wifi/wifi_intel.c
-  LOCAL_C_INCLUDES +=
$(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
+#ifeq ($(BOARD_WLAN_DEVICE),UNITE)
+#  LOCAL_C_INCLUDES +=
$(LOCAL_PATH)/../../external/wpa_supplicant_ath/wpa_supplicant/src/common
+#  LOCAL_SRC_FILES += wifi/wifi_unite.c
+#else ifeq ($(BOARD_WLAN_VENDOR), INTEL)
+#  LOCAL_SRC_FILES += wifi/wifi_intel.c
+#  LOCAL_C_INCLUDES +=
$(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
+#else
+#  LOCAL_SRC_FILES += wifi/wifi.c
+#  LOCAL_C_INCLUDES +=
$(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
+#endif
+
+ifeq ($(BOARD_WIFI_VENDOR), realtek)
+LOCAL_SRC_FILES += ../realtek/wlan/libhardware_legacy/wifi/wifi_realtek.c
else
-  LOCAL_SRC_FILES += wifi/wifi.c
-  LOCAL_C_INCLUDES +=
$(LOCAL_PATH)/../../external/wpa_supplicant_8/src/common
+LOCAL_SRC_FILES += wifi/wifi.c
endif


6.修改device/fsl/sabresd_6dq/BoardConfig.mk
修改内容如下:
--- BoardConfig.mk      (版本 170)
+++ BoardConfig.mk      (工作副本)
@@ -26,6 +26,33 @@
TARGET_BOOTLOADER_BOARD_NAME := SABRESD
PRODUCT_MODEL := SABRESD-MX6DQ


+
+BOARD_WIFI_VENDOR := realtek
+ifeq ($(BOARD_WIFI_VENDOR), realtek)
+WPA_SUPPLICANT_VERSION := VER_0_8_X
+BOARD_WPA_SUPPLICANT_DRIVER := NL80211
+CONFIG_DRIVER_WEXT :=y
+BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl
+BOARD_HOSTAPD_DRIVER := NL80211
+BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl
+#BOARD_WLAN_DEVICE := rtl8192cu
+#BOARD_WLAN_DEVICE := rtl8192du
+#BOARD_WLAN_DEVICE := rtl8192ce
+#BOARD_WLAN_DEVICE := rtl8192de
+#BOARD_WLAN_DEVICE := rtl8723as
+#BOARD_WLAN_DEVICE := rtl8723au
+#BOARD_WLAN_DEVICE := rtl8189es
+#BOARD_WLAN_DEVICE := rtl8723bs
+BOARD_WLAN_DEVICE := rtl8723bu
+WIFI_DRIVER_MODULE_NAME := "8723bu"
+WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/8723bu.ko"
+WIFI_DRIVER_MODULE_ARG := "ifname=wlan0 if2name=p2p0"
+WIFI_FIRMWARE_LOADER := ""
+WIFI_DRIVER_FW_PATH_STA := ""
+WIFI_DRIVER_FW_PATH_AP := ""
+WIFI_DRIVER_FW_PATH_P2P := ""
+WIFI_DRIVER_FW_PATH_PARAM := ""
+else
# UNITE is a virtual device support both atheros and realtek wifi(ar6103 and
rtl8723as)
BOARD_WLAN_DEVICE            := UNITE
WPA_SUPPLICANT_VERSION       := VER_0_8_UNITE
@@ -39,6 +66,7 @@
BOARD_WPA_SUPPLICANT_PRIVATE_LIB_QCOM       := lib_driver_cmd_qcwcn
BOARD_HOSTAPD_PRIVATE_LIB_RTL               := lib_driver_cmd_rtl
BOARD_WPA_SUPPLICANT_PRIVATE_LIB_RTL        := lib_driver_cmd_rtl
+endif
#for intel vendor
ifeq ($(BOARD_WLAN_VENDOR),INTEL)
BOARD_HOSTAPD_PRIVATE_LIB                := private_lib_driver_cmd
@@ -118,3 +146,4 @@
fs_use \
untrusted_app.te \
genfs_contexts


上述步骤完成后,到根目录下执行make 编译整个系统。
二 测试
1.安装cfg80211.ko,8723bu.ko依赖此模块,缺省会报如下错误:

8723bu: Unknown symbol cfg80211_ready_on_channel (err 0)
8723bu: Unknown symbol __ieee80211_get_channel (err 0)
8723bu: Unknown symbol cfg80211_roamed (err 0)
8723bu: Unknown symbol wiphy_register (err 0)
8723bu: Unknown symbol cfg80211_disconnected (err 0)
8723bu: Unknown symbol cfg80211_new_sta (err 0)
8723bu: Unknown symbol cfg80211_connect_result (err 0)
8723bu: Unknown symbol cfg80211_inform_bss_frame (err 0)


2.安装8723bu.ko模块,两个模块都安装好之后,执行netcfg,会看到多出wlan0和p2p0设备节点,他们是8723bu驱动创建出来的,放到sys/class/net/下。


lo       UP                                   127.0.0.1/8   0x00000049
00:00:00:00:00:00
can0     DOWN                                   0.0.0.0/0   0x00000080
00:00:00:00:00:00
can1     DOWN                                   0.0.0.0/0   0x00000080
00:00:00:00:00:00
eth0     UP                                     0.0.0.0/0   0x00001043
1e:ed:19:27:1a:b3
wlan0    DOWN                                   0.0.0.0/0   0x00001002
7c:c7:09:30:c5:4d
p2p0     DOWN                                   0.0.0.0/0   0x00001002
7e:c7:09:30:c5:4d




3.执行ifconfig wlan0 up,打开wlan0


4.执行system/bin/wpa_supplicant -Dnl80211 -iwlan0
-c/etc/wifi/wpa_supplicant.conf,启动wpa_supplicant进程。
启动过程报如下错误:
E/wpa_supplicant( 3251): mkdir[ctrl_interface=wlan0]: Permission denied
E/wpa_supplicant( 3251): Failed to initialize control interface 'wlan0'.
E/wpa_supplicant( 3251): You may have another wpa_supplicant process already
running or the file was
E/wpa_supplicant( 3251): left by an unclean termination of wpa_supplicant in
which case you will need
E/wpa_supplicant( 3251): to manually remove this file before starting
wpa_supplicant again.

错误原因:wpa_supplicant进程运行时的配置文件wpa_supplicant.conf文件中的ctrl_interface的路径不对,没有匹配成功,导致进程启动失败。原来ctrl_interface的路径是/var/run/wpa_supplicant,把ctrl_interface改成/data/misc/wifi/wpa_supplicant就可以了。

ctrl_interface在哪里?在工程下的external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant.conf中。
深入分析:
wpa_supplicant_init_iface函数分析

init_iface初始化的第一个工作是解析运行时配置文件。其中,wpa_s->confname的值为“/data/misc/wifi/wpa_supplicant.conf”,解析函数是wpa_config_read。
wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);  
    if (wpa_s->ctrl_iface == NULL) {  
        wpa_printf(MSG_ERROR,  
                   "Failed to initialize control interface '%s'.\n"  
                   "You may have another wpa_supplicant process "  
                   "already running or the file was\n"  
                   "left by an unclean termination of wpa_supplicant "  
                   "in which case you will need\n"  
                   "to manually remove this file before starting "  
                   "wpa_supplicant again.\n",  
                   wpa_s->conf->ctrl_interface);  
          return -1;  
    }  

如果是linux系统,可能没有wpa_supplicant工具,可参考wpa_supplicant-2.6交叉编译
<http://blog.csdn.net/bhj1119/article/details/53514881>  ,移植此工具。
5.执行system/bin/wpa_cli -p/data/misc/wifi/wpa_supplicant,配置并连接wifi热点。
Could not connect to wpa_supplicant: wlan0 - re-trying

wpa_cli v2.0-devel-4.4.2_rtw_r12456.20141003
Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi> and contributors


This software may be distributed under the terms of the BSD license.
See README for more details.


Selected interface 'wlan0'


Interactive mode


1)> scan
OK
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=2 BSSID=00:00:00:00:00:00 SSID=
2)> scan_results
bssid / frequency / signal level / flags / ssid
78:eb:14:bd:f6:9e       2412    -58     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]  
   B1412
bc:67:1c:41:29:4d       2437    -65    
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       systec-cisco
e0:05:c5:23:fc:52       2452    -71    
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]
30:fc:68:0b:c9:f6       2437    -71     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]  
   gsdq
ec:26:ca:53:ea:f1       2462    -72    
[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] TP-LINK_EAF1
00:1f:f3:bf:d0:6f       2462    -73     [WPA2-PSK-CCMP][ESS]    tcs apple
d4:ee:07:29:9b:4a       2442    -73     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]  
   Cherry&Filippo
24:69:68:16:a9:1e       2462    -74     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]  
   \xe6\xb2\x83\xe7\x95\x89
fc:d7:33:8d:0a:36       2412    -74     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]  
   dangyuanweixin
b0:c0:90:3a:24:a3       2422    -74     [WPA2-PSK-CCMP][ESS]  
 360\xe8\xa1\x8c\xe8\xbd\xa6\xe8\xae\xb0\xe5\xbd\x95\xe4\xbb\xaa-A3
c8:3a:35:1f:5f:88       2422    -80     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]  
   wangzihao
c8:3a:35:06:a9:b0       2452    -82     [WPA-PSK-CCMP][ESS]     Tenda_06A9B0
00:3a:99:9b:9b:40       2417    -45     [WEP][ESS]      systec-AP
00:0c:43:30:50:a0       2437    -51     [ESS]   Wii-Link_3050A0
08:10:78:e1:27:a5       2412    -74     [ESS]   NETCORE_27A5
3)> add_network
0
4)> set_network 0 ssid "systec-cisco"
OK
5)> set_network 0 psk "XXX"
OK
6)> select_network 0
OK
<3>CTRL-EVENT-STATE-CHANGE id=0 state=3 BSSID=00:00:00:00:00:00
SSID=systec-cisco
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>Trying to associate with bc:67:1c:41:29:4d (SSID='systec-cisco' freq=2437
MHz)
<3>CTRL-EVENT-STATE-CHANGE id=0 state=5 BSSID=00:00:00:00:00:00
SSID=systec-cisco
<3>CTRL-EVENT-STATE-CHANGE id=0 state=6 BSSID=00:00:00:00:00:00
SSID=systec-cisco
<3>Associated with bc:67:1c:41:29:4d
<3>CTRL-EVENT-STATE-CHANGE id=0 state=7 BSSID=bc:67:1c:41:29:4d
SSID=systec-cisco
<3>CTRL-EVENT-STATE-CHANGE id=0 state=8 BSSID=bc:67:1c:41:29:4d
SSID=systec-cisco
<3>WPA: Key negotiation completed with bc:67:1c:41:29:4d [PTK=CCMP GTK=TKIP]
<3>CTRL-EVENT-CONNECTED - Connection to bc:67:1c:41:29:4d completed (auth)
[id=0 id_str=]
<3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=bc:67:1c:41:29:4d
SSID=systec-cisco
7)enable_network 0
OK

查看链接状态:
> status
bssid=bc:67:1c:41:29:4d
ssid=systec-cisco
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=TKIP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
p2p_device_address=7c:c7:09:30:c5:4d
address=7c:c7:09:30:c5:4d
<3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=bc:67:1c:41:29:4d
SSID=systec-cisco
<3>CTRL-EVENT-CONNECTED - connection to bc:67:1c:41:29:4d completed (auth)
[id=0 id_str=]



执行dhcpcd wlan0 分配IP,此时再netcfg查看,wlan0de ip 已经变成10.0.0.118
root@sabresd_6dq:/ # netcfg
lo       UP                                   127.0.0.1/8   0x00000049
00:00:00:00:00:00
can0     DOWN                                   0.0.0.0/0   0x00000080
00:00:00:00:00:00
can1     DOWN                                   0.0.0.0/0   0x00000080
00:00:00:00:00:00
eth0     UP                                     0.0.0.0/0   0x00001043
1e:ed:19:27:1a:b3
wlan0    UP                                  10.0.0.118/24  0x00001043
7c:c7:09:30:c5:4d
p2p0     DOWN                                   0.0.0.0/0   0x00001002
7e:c7:09:30:c5:4d

ping 一下看看通不通
root@sabresd_6dq:/ # ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=29.1 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=15.9 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=63 time=16.4 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=63 time=14.3 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=63 time=14.0 ms
^C
--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 14.034/17.991/29.183/5.672 ms

至此wifi模块移植完毕,可以实现扫描,链接,分配IP

延伸阅读:关于SDIO接口WiFi模块的调试经验
<https://blog.csdn.net/bhj1119/article/details/81198718>
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信