NanoPC-T2 驱动R8188EUS WiFi芯片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kangear/article/details/80209904

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

这里同样提供了rtl8188eusrtl8192cu的驱动,所有的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 backportscfg80211 - 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;
}

猜你喜欢

转载自blog.csdn.net/kangear/article/details/80209904