Ubuntu上测试该模块
枚举信息:
usb 1-2.6: USB disconnect, device number 67
usb 1-2.6: new high-speed USB device number 68 using xhci_hcd
usb 1-2.6: New USB device found, idVendor=0bda, idProduct=8179
usb 1-2.6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-2.6: Product: 802.11n NIC
usb 1-2.6: Manufacturer: Realtek
usb 1-2.6: SerialNumber: 009569935644
Chip Version Info: CHIP_8188E_Normal_Chip_TSMC_UNKNOWN_CUT(10)_1T1R_RomVer(0)
r8188eu 1-2.6:1.0 wlx009569935644: renamed from wlan0
查看ifconfig信息:
tony@pc:~$ ifconfig wlx009569935644
wlx009569935644 Link encap:Ethernet HWaddr 00:95:69:93:56:44
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
tony@pc:~$
需要的文件
8188eu.ko # 驱动
/lib/firmware/rtlwifi/rtl8188eufw.bin # 固件
使用iw查看不到该网卡支持的模式,有点奇怪。使用iwconfig也不能够查到。
NanoPC-T2
NanoPC-T2上的WiFi芯片是AP6212
,在BoardConfig.mk
中的配置如下:
# wifi
BOARD_WIFI_VENDOR := ap6212
# Wi-Fi related defines
ifeq ($(BOARD_WIFI_VENDOR),ap6212)
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WLAN_DEVICE := bcmdhd
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
WIFI_DRIVER_MODULE_NAME := "bcmdhd"
WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/bcmdhd.ko"
WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/bcmdhd/parameters/firmware_path"
WIFI_DRIVER_FW_PATH_STA := "/vendor/firmware/fw_bcm43438a0.bin"
WIFI_DRIVER_FW_PATH_AP := "/vendor/firmware/fw_bcm43438a0_apsta.bin"
endif
这里同样提供了rtl8188eus
和rtl8192cu
的驱动,所有的WiFi驱动都是backports方式
的,我至今还没有弄清楚所谓的backports
到底是指什么,只是知道这样和很多其它移植文章是对不上的,我开始准备顺着backports方式
把RTL8188EUS的驱动编译成内核模块,能顺利加载到内核上,也能出现wlan0
,但是由于没有提供对应的wpa命令,始终在Android层没有使用起来这个WiFi。且我在使用hostapd来将其设置成热点时也没有成功:
shell@nanopi2:/ # hostapd2 -d /sdcard/rtl_hostapd_2G.conf
[ 1270.556000] RTL871X: +871x_drv - drv_open, bup=0
om /dev/random
[ 1270.564000] RTL871X: rtl8188e_FirmwareDownload: fw_ver=11 fw_subver=1 sig=0x88e1
le: /sdcard/rtl_hostapd_2G.conf
[ 1270.592000] RTL871X: _FWFreeToGo: Checksum report OK! REG_MCUFWDL:0x00030004
[ 1270.600000] RTL871X: =====> _8051Reset88E(): 8051 reset success .
[ 1270.608000] RTL871X: _FWFreeToGo: Polling FW ready success!! REG_MCUFWDL:0x000300c6
[ 1270.904000] ==> rtl8188e_iol_efuse_patch
[ 1270.980000] RTL871X: ==> _InitAntenna_Selection ....
[ 1270.988000] RTL871X: _InitAntenna_Selection,Cur_ant:(1)Antenna_A
[ 1270.996000] RTL871X: pDM_Odm TxPowerTrackControl = 1
[ 1271.000000] RxIdleAnt=MAIN_ANT
[ 1271.276000] RTL871X: rtl8188eu_hal_init in 712ms
[ 1271.280000] RTL871X: MAC Address = 00:95:69:93:56:44
[ 1271.288000] RTL871X: -871x_drv - drv_open, bup=1
[ 1271.296000] ADDRCONF(NETDEV_UP): wlan0: link is not ready
drv->ifindex=5
l2_sock_recv==l2_sock_xmit=0x0x291618
ioctl[SIOCSIWMODE]: Operation not supported
Could not set interface to mode(3)!
Could not set interface to master mode!
rtl871xdrv driver initialization failed.
rmdir[ctrl_interface]: No such file or directory
1|shell@nanopi2:/ # [ 1273.296000] RTL871X: ==>rtw_ps_processor .fw_state(0)
[ 1273.300000] RTL871X: ==>ips_enter cnts:1
[ 1273.304000] RTL871X: nolinked power save enter
[ 1273.308000] RTL871X: ===> rtw_ips_pwr_down...................
[ 1273.316000] RTL871X: ====> rtw_ips_dev_unload...
[ 1273.344000] RTL871X: usb_read_port_cancel
[ 1273.348000] RTL871X: usb_read_port_complete() RX Warning! bDriverStopped(0) OR bSurpriseRemoved(0) bReadPortCancel(1)
[ 1273.360000] RTL871X: usb_read_port_complete() RX Warning! bDriverStopped(0) OR bSurpriseRemoved(0) bReadPortCancel(1)
[ 1273.368000] RTL871X: usb_read_port_complete() RX Warning! bDriverStopped(0) OR bSurpriseRemoved(0) bReadPortCancel(1)
[ 1273.380000] RTL871X: usb_read_port_complete() RX Warning! bDriverStopped(0) OR bSurpriseRemoved(0) bReadPortCancel(1)
[ 1273.392000] RTL871X: usb_write_port_cancel
[ 1273.396000] RTL871X: ==> rtl8188eu_hal_deinit
[ 1273.400000] RTL871X: bkeepfwalive(0)
[ 1273.412000] RTL871X: <=== rtw_ips_pwr_down..................... in 104ms
看样子这个backpost版本的驱动是不支持master mode
了,这个方案要放弃。
转换成普通方式驱动,一般是cfg80211
+RTL8188EUS.ko的方式。
RTl8188EUS无线网卡驱动编译,支持master模式
编译过这个方案,RTl8188EUS无线网卡驱动编译,支持master模式,因为使用的是3.4版本内核,所以这里使用的是https://git.oschina.net/pengrui2009/RTL8188EUS_OLD.git 。
配置内核
有两个选项是互斥的Support for Linux kernel backports
和cfg80211 - wireless configuration API
,这里要使用前者RTL8188EUS_OLD
驱动才能正常使用,不过这样就会把cfg80211
禁用了,那么板载的WiFi模块需要使用的cfg80211
就没有办法使用了,这里暂时不管。
[*] Networking support --->
-*- Wireless --->
[*] Support for Linux kernel backports
改动如下:
diff --git a/driver/rtl8188EUS_rtl8189ES_linux_v4.1.7_9024.20130916/Makefile b/driver/rtl8188EUS_rtl8189ES_linux_v4.1.7_9024.20130916/Makefile
index aff74bb..e0860ee 100755
--- a/driver/rtl8188EUS_rtl8189ES_linux_v4.1.7_9024.20130916/Makefile
+++ b/driver/rtl8188EUS_rtl8189ES_linux_v4.1.7_9024.20130916/Makefile
@@ -46,7 +46,8 @@ CONFIG_WOWLAN = n
CONFIG_GPIO_WAKEUP = n
CONFIG_ODM_ADAPTIVITY = n
-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_MYIMX6 = y
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_JB_X86 = n
CONFIG_PLATFORM_ARM_S3C2K4 = n
@@ -392,6 +393,14 @@ MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
INSTALL_PREFIX :=
endif
+ifeq ($(CONFIG_PLATFORM_MYIMX6), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+MODULE_NAME := wlan
+ARCH := arm
+KSRC := /home/tony/Work/20_NanoPC-T2/linux-3.4.y
+CROSS_COMPILE := arm-linux-
+endif
+
ifeq ($(CONFIG_PLATFORM_ACTIONS_ATM702X), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ACTIONS_ATM702X
#ARCH := arm
编译的内核模块wlan.ko
。
insmod /sdcard/wlan.ko
busybox ifconfig wlan0 up
# 搜索热点,这时可以搜索到了
iwlist wlan0 scan
# 创建hostapd2需要目录
mount -o remount /
mkdir -p /var/run/
# 运行hostapd,这样就可以热点就创建成功了,可以被搜索到了
hostapd2 -d /sdcard/rtl_hostapd_2G.conf -B
说明:这里的驱动接口是rtl871xdrv
,比较另类,我可能会换驱动,换成支持nl80211
的。
nl80211版本的驱动
之前使用的是专用接口的驱动,在Android
中很多地方不兼容,找到一个共享出来的源码,里面有HISI Android
的配置,就着编译后,支持了nl80211
驱动,很好的用在了Android
中。
下载链接为:http://www.pudn.com/Download/item/id/2898762.html
编译配置Makefile:
ifeq ($(CONFIG_PLATFORM_HISILICON), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_HISILICON
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
# ifeq ($(CONFIG_P2P),y)
EXTRA_CFLAGS += -DCONFIG_P2P -DCONFIG_CONCURRENT_MODE
# endif
ARCH := arm
ifeq ($(CROSS_COMPILE),)
CROSS_COMPILE = arm-linux-
endif
MODULE_NAME := rtl8188eu
ifeq ($(KSRC),)
KSRC := /home/tony/Work/20_NanoPC-T2/linux-3.4.y
endif
endif
BoardConfig.mk中配置如下,这样就可以正常打开WiFi了
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WLAN_DEVICE := rtl8188eu
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
WIFI_DRIVER_MODULE_NAME := "rtl8188eu"
WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/rtl8188eu.ko"
WIFI_DRIVER_MODULE_ARG := "ifname=wlan0 if2name=p2p0"
#WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/bcmdhd/parameters/firmware_path"
#WIFI_DRIVER_FW_PATH_STA := "/vendor/firmware/fw_bcm43438a0.bin"
#WIFI_DRIVER_FW_PATH_AP := "/vendor/firmware/fw_bcm43438a0_apsta.bin"
因为这个不需要固件,hardware/libhardware_legacy/wifi/wifi.c
中,
int wifi_change_fw_path(const char *fwpath)
{
int len;
int fd;
int ret = 0;
return 0; // 这里直接返回成功,不需要写固件
if (!fwpath)
return ret;
fd = TEMP_FAILURE_RETRY(open(WIFI_DRIVER_FW_PATH_PARAM, O_WRONLY));
if (fd < 0) {
ALOGE("Failed to open wlan fw path param (%s)", strerror(errno));
return -1;
}
len = strlen(fwpath) + 1;
if (TEMP_FAILURE_RETRY(write(fd, fwpath, len)) != len) {
ALOGE("Failed to write wlan fw path param (%s)", strerror(errno));
ret = -1;
}
close(fd);
return ret;
}