首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

工作笔记分享-rt2870 usb wifi在mx53 android平台上的移栽

2013-07-11 
工作笔记分享---rt2870 usb wifi在mx53 android平台上的移植rt2870 usb wifi在mx53 android平台上的移植US

工作笔记分享---rt2870 usb wifi在mx53 android平台上的移植
rt2870 usb wifi在mx53 android平台上的移植

USB WIFI在linux平台下的移植教程网上很多,但是在android上的移植,完整的教程很少,移植这个驱动整整花了一个星期的时间,以下是这个星期下来详细的移植笔记。

一:编译wifi驱动源码,生成ko文件
由于在linux的根文件系统下存在/etc目录,而android的根目录下,/etc是从/system/etc下链接过来的,因此
需要修改wifi源码,让驱动从/system/etc下寻找配置文件。
寻找/etc/Wireless文件,找到如下文件存在,全修改为/system/etc/Wireless:

root@lqm:/opt/program/tools/RT3070_Linux_STA# grep -r '/mnt/etc' ./
./include/os/rt_drv.h:#define STA_PROFILE_PATH"/etc/Wireless/RT2870STA/RT2870STA.dat"
./include/os/rt_drv.h:#define CARD_INFO_PATH"/etc/Wireless/RT2870STA/RT2870STACard.dat"
./include/os/rt_drv.h:#define EEPROM_BIN_FILE_NAME  "/etc/Wireless/RT2870STA/e2p.bin"
./include/os/rt_linux.h:#define STA_PROFILE_PATH"/etc/Wireless/RT2870STA/RT2870STA.dat"
./include/os/rt_linux.h:#define CARD_INFO_PATH"/etc/Wireless/RT2870STA/RT2870STACard.dat"
./include/os/rt_linux.h:#define EEPROM_BIN_FILE_NAME  "/etc/Wireless/RT2870STA/e2p.bin"
./os/linux/Makefile.6:DAT_PATH = /etc/Wireless/RT$(CHIPSET_DAT)STA
./os/linux/Makefile.6:$(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless)
二进制文件 ./os/linux/rt_profile.o 匹配
./os/linux/Makefile:DAT_PATH = /mnt/etc/Wireless/RT$(CHIPSET_DAT)STA
./os/linux/Makefile:$(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless)
二进制文件 ./os/linux/rt3070sta.o 匹配
二进制文件 ./os/linux/rt3070sta.ko 匹配
./os/linux/Makefile.4:DAT_PATH = /etc/Wireless/RT$(CHIPSET_DAT)STA
./os/linux/Makefile.4:$(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless)
二进制文件 ./common/rtmp_init_inf.o 匹配
./RT2870STACard.dat:00CARDID=/etc/Wireless/RT2870STA/RT2870STA1.dat
./RT2870STACard.dat:01CARDID=/etc/Wireless/RT2870STA/RT2870STA2.dat
./RT2870STACard.dat:02CARDID=/etc/Wireless/RT2870STA/RT2870STA3.dat
./RT2870STACard.dat:00MAC00:0E:2E:C3:D0:48=/etc/Wireless/RT2870STA/RT2870STA1.dat
./RT2870STACard.dat:01MAC00:40:F4:FF:AA:40=/etc/Wireless/RT2870STA/RT2870STA2.dat
./RT2870STACard.dat:02MAC00:0C:43:10:11:5C=/etc/Wireless/RT2870STA/RT2870STA3.dat
./RT2870STACard.dat:00CARDTYPEbgn=/etc/Wireless/RT2870STA/RT2870STA1.dat
./RT2870STACard.dat:01CARDTYPEbgn=/etc/Wireless/RT2870STA/RT2870STA2.dat
./RT2870STACard.dat:02CARDTYPEabgn=/etc/Wireless/RT2870STA/RT2870STA3.dat
root@lqm:/opt/program/tools/RT3070_Linux_STA# 

二:修改init.rc文件
直接修改out/..../root下的init.rc文件:

# mkdir /data/misc/wifi 0770 wifi wifi #lqm changed property.
mkdir /data/misc/wifi 0771 wifi wifi
# chmod 0770 /data/misc/wifi
chmod 0771 /system/etc/wifi                     #lqm changed path


#chmod 0660 /data/misc/wifi/wpa_supplicant.conf #lqm changed path
chmod 0660 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf #lqm added.

on boot
# basic network init
    ifup lo
    hostname localhost
    domainname localdomain

    mkdir /data/system 0775 system system
    mkdir /data/system/wpa_supplicant 0771 wifi wifi # lqm added.

# Set DNS
    #setprop net.dns1 192.168.128.2 #lqm changed.
    setprop net.dns1 192.168.1.1
   
# Prepare for wifi
    setprop wifi.interface ra0
    # mkdir /data/misc/wifi/sockets 0770 wifi wifi
    mkdir /data/misc/wifi/sockets 0771 wifi wifi #lqm changed property
    # mkdir /data/misc/dhcp 0770 dhcp dhcp
    # chown dhcp dhcp /data/misc/dhcp
    mkdir /data/misc/dhcp 0771 system system #lqm changed.

# lqm changed.
service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -ira0 -c /system/etc/wifi/wpa_supplicant.conf
     group system wifi inet
     disabled
     oneshot

# lqm changed.
service dhcpcd /system/bin/dhcpcd ra0
     group system dhcp
     disabled
     oneshot

默认init.rc中全使用的wlan0,而rt2860的网络名称为ra0,因此需全替换为ra0。

三:修改hardware/libhardware_legacy/wifi/wifi.c文件。
重新定义WIFI_DRIVER_MODULE_PATH和WIFI_DRIVER_MODULE_NAME宏,定义如下:

#ifndef WIFI_DRIVER_MODULE_PATH
#define WIFI_DRIVER_MODULE_PATH         "/system/lib/modules/rt3070sta.ko"
#endif
#ifndef WIFI_DRIVER_MODULE_NAME
#define WIFI_DRIVER_MODULE_NAME         "rt3070sta"
#endif

wifi.c用于启动时自动加载ko模块,这里暂时使用手动加载的方法,后续更新自动加载功能。

四:在/device/fsl/imx53_loco/BoardConfig.mk文件中增加一行(根据你的无线网卡类型来设置):
BOARD_WPA_SUPPLICANT_DRIVER := WEXT
同时屏掉相关信息,修改后部分代码如下:
#WIFI_DRIVER_MODULE_PATH :=  "/system/lib/modules/ar6000.ko" #lqm changed.
WIFI_DRIVER_MODULE_PATH :=  "/system/lib/modules/rt3070sta.ko"


WIFI_DRIVER_MODULE_ARG      := ""
#WIFI_DRIVER_MODULE_NAME     := "ar6000" #lqm changed.
WIFI_DRIVER_MODULE_NAME     := "rt3070sta"
WIFI_FIRMWARE_LOADER        := ""
#WPA_SUPPLICANT_VERSION      := VER_0_6_ATHEROS #lqm masked.
#BOARD_WLAN_ATHEROS_SDK    := system/wlan/atheros/AR6kSDK.3.0_RC.298 #lqm masked.
#BOARD_WLAN_CHIP    := AR6003 #lqm masked.
BOARD_WPA_SUPPLICANT_DRIVER := WEXT
注意WPA_SUPPLICANT_VERSION一定要屏蔽,否则将使用针对atheros的wpa_supplicant。

五:单独编译wpa_supplicant,将默认的wpa_wupplicant for atheros的文件替换掉:
source build/envsetup.sh
mm external/wpa_supplicant/ PRODUCT-imx53_loco-eng
这时将会在out/..../system/bin下生成新的wpa_supplicant文件。
如果使用默认的wpa_supplicant,执行时将会弹出如下错误:
===>rt_ioctl_giwscan. 4(4) BSS returned, data->length = 663                    
ioctl[SIOCSIWGENIE]: Operation not su===>rt_ioctl_giwscan. 4(4) BSS returned, 3
pported on transport endpoint                                                  
===>rt_ioctl_giwscan. 4(4) BSS returned, data->length = 663                    
ioctl[SIOCSIWGENIE]: Operation not ===>rt_ioctl_giwscan. 4(4) BSS returned, da3
supported on transport endpoint                                                
===>rt_ioctl_giwscan. 4(4) BSS returned, data->length = 663                    
ioctl[SIOCSIWGENIE]: Operation not su===>rt_ioctl_giwscan. 4(4) BSS returned, 3
pported on transport endpoint                                                  


===>rt_ioctl_giwscan. 4(4) BSS returned, data->length = 663                    
ioctl[SIOCSIWGENIE]: Operation not su===>rt_ioctl_giwscan. 4(4) BSS returned, 3
pported on transport endpoint                                                  
===>rt_ioctl_giwscan. 5(5) BSS returned, data->length = 843                    
ioctl[SIOCSIWGENIE]: Operation not ===>rt_ioctl_giwscan. 5(5) BSS returned, da3
supported on transport endpoint
而且反复执行。

六:新建wpa_supplicant.conf文件,内容如下:
# WPA-PSK/TKIP
ctrl_interface=/system/bin/wpa_supplicant
network={
ssid="armeasy"
scan_ssid=1
key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE
pairwise=TKIP CCMP
group=CCMP TKIP WEP104 WEP40
psk="phosphor"
}
注意,ssid为路由的名称,phosphor为路由的密码,用户请根据自己的路由密码设置。
将wpa_supplicant.conf文件拷贝到/out/..../system/etc/wifi目录

七:将第一步生成的rt3070sta.ko文件拷贝到/out/..../system/lib/modules目录

八:重新编译android源码,将新生成的uramdisk.img烧录到SD卡:
sudo dd if=/tftpboot/uramdisk.img of=/dev/sdb bs=1M seek=6
将新生成的system.img烧录到SD卡:
sudo dd if=/tftpboot/system.img of=/dev/sdb2

九:重启开发板,进入文件系统后,加载驱动
手动加载驱动如下:

/system/lib/modules # insmod rt3070sta.ko 
rt3070sta: module license 'unspecified' taints kernel.
Disabling lock debugging due to kernel taint
rt3070sta: Unknown symbol usb_alloc_urb (err 0)
rt3070sta: Unknown symbol usb_free_urb (err 0)
rt3070sta: Unknown symbol usb_alloc_coherent (err 0)
rt3070sta: Unknown symbol usb_register_driver (err 0)
rt3070sta: Unknown symbol usb_put_dev (err 0)
rt3070sta: Unknown symbol usb_get_dev (err 0)
rt3070sta: Unknown symbol usb_submit_urb (err 0)
rt3070sta: Unknown symbol usb_free_coherent (err 0)
rt3070sta: Unknown symbol usb_control_msg (err 0)
insmod: init_module 'rt3070sta.krt3070sta: Unknown symbol usb_deregister (err 0)
rt3070sta: Unknown symbol usb_kill_urb (err 0)


o' failed (No such file or directory)

这是没有添加GPL授权的原因,需要在驱动源码的文件os/linux/usb_main_dev.c文件的开头加上如下一行代码:
MODULE_LICENSE(“GPL”);
然后重新编译、重新加载,即可得到正确的结果。
正常的加载信息如下:
/ # insmod system/lib/modules/rt3070sta.ko 
rtusb init rt2870 --->


=== pAd = d4a62000, size = 511440 ===

<-- RTMPAllocTxRxRingMemory, Status=0
<-- RTMPAllocAdapterBlock, Status=0
usbcore: registered new interface driver rt2870
/ # 

正常加载后,可以通过下面的命令查询驱动是否正常加载:
cat /proc/net/dev
正常打印如下:
/ # cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  eth0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  usb0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0


  sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
   ra0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
/ # 

[解决办法]
很强大,必须顶!
[解决办法]
  感谢分享这么好的东西.
[解决办法]
lz很有爱,这么好的东西,下载测试一下. 然后跟着做。
[解决办法]
楼主你好,你使用android UI界面测试过wifi么?
我现在用的也是用53qsb+2870.
在linux环境下每次能ping通。
但是在android环境下经常ping不通,wifi很不稳定。
android版本是233.请问是否是android自身的bug?
[解决办法]
很强大

热点排行