将无线网卡插入任何可以识别USB的机器,此处将360随身WIFI插入虚拟机中。通过以下命令查看VID和PID号。可得出使用的是联发科的MT7601U芯片。
rd@rd-virtual-machine:~/sda3/4310$ lsusb
Bus 001 Device 002: ID 148f:760b Ralink Technology, Corp. MT7601U Wireless Adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
随后进入联发科官网下载其驱动,
https://www.mediatek.com/products/connectivity-and-networking/broadband-wifi
或者
http://download.csdn.net/detail/pchl33/7424755
通过阅读README_STA_usb文件,了解到需要分别修改os/linux/config.mk文件和Makefile文件。
修改如下
25 # i.e. wpa_supplicant -Dralink
26 HAS_WPA_SUPPLICANT=y
27
28
29 # Support Native WpaSupplicant for Network Maganger
30 # i.e. wpa_supplicant -Dwext
31 HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
添加如下
1093 ifeq ($(PLATFORM),pxa16X)
1094 ifneq (,$(findstring 2.4,$(LINUX_SRC)))
1095 # Linux 2.4
1096 CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=arm -DMODULE -DMODVERSIONS -include $(LINUX_ SRC)/include/linux/modversions.h $(WFLAGS)
1097 export CFLAGS
1098 else
1099 # Linux 2.6
1100 EXTRA_CFLAGS := $(WFLAGS)
1101 endif
1102 endif
使其支持NetworkManager or wpa_supplicant wext functions
接着修改makefile文件。
添加如下代码
31 PLATFORM = pxa16X
105 ifeq ($(PLATFORM),pxa16X)
106 LINUX_SRC = /home/rd/sda3/4434te/linux-2.6.28.mt4000
107 CROSS_COMPILE = /buildroot/build_arm/staging_dir/bin/arm-linux-
108 endif
修改完毕后直接make。
如果报如下错误则:
sta_cfg.c:5766:85: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
snprintf(extra, size, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );
^
sta/sta_cfg.c:5766:95: error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]
snprintf(extra, size, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );
按下面修改。
这个是gcc编译时加了-Werror 参数导致的
你去linux内核源码根目录下找makefile文件
搜索makefile中关键词werror
一共有4行,把这四行整行全部注释掉就好了。
查找-Werror 去掉下面4段文本
-Werror-implicit-function-declaration \
,-Werror=implicit-int
,-Werror=strict-prototypes
,-Werror=date-time
再make,
又报错
/home/ssr/文档/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/../../os/linux/rt_linux.c:1121:20: error: incompatible types when assigning to type ‘int’ from type ‘kuid_t’
pOSFSInfo->fsuid = current_fsuid();
^
/home/ssr/文档/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/../../os/linux/rt_linux.c:1122:20: error: incompatible types when assigning to type ‘int’ from type ‘kgid_t’
pOSFSInfo->fsgid = current_fsgid();
于是按照另外的帖子
把rt_linux.c里面报错的那里:
current_fsuid() 跟 current_fsgid()改成:
current_fsuid().val
current_fsgid().val
参考网址
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4164172
如果还有如下错误:
error: ‘struct net_device’ has no member named ‘wireless_handlers’错误
因为内核在编译的时候CONFIG_WIRELESS_EXT这个选项没有选择,选择该选项后重新编译内核镜像或者模块即可修正该错误。
参考:http://www.examw.com/linux/all/203517/
再make,应该没有错误了。
编译完成后,会在os/linux/目录下出现mt7601Usta.ko文件
rd@rd-virtual-machine:~/sda3/mt7601/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913$ ls -alth os/linux/mt7601Usta.ko
-rw-r--r-- 1 root root 12M 6月 29 15:05 os/linux/mt7601Usta.ko
发现太大了,这是使用指定的交叉编译工具如:
arm-none-linux-gnueabi-strip -S os/linux/mt7601Usta.ko就小多le。
rd@rd-virtual-machine:~/sda3/mt7601/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913$ ls -alth os/linux/mt7601Usta.ko
-rw-r--r-- 1 rd rd 954K 6月 29 15:17 os/linux/mt7601Usta.ko
至此编译完成。
将编译好的驱动放置开发板中。
insmod mt7601Usta.ko
出现Unknown symbol skb_push等错误
修改如下:
上面有关于cfg80211报错说明是cfg80211的内核相关配置没有配置上
如下配置: — Networking support
-*- Wireless --->
<*> cfg80211 - wireless configuration API
<*> Generic IEEE 802.11 Networking Stack (mac80211)
上面有关于usb方面的错误应该配置usb驱动
<*> Support for Host-side USB
<*> USB Monitor
<*> USB Wireless Device Management support
注意另一篇文章提到的内核匹配的问题,主要是编译内核时候,内核相应做了改变,这时候驱动也需要重新进行编译。切记!!!
参考:
http://blog.csdn.net/jzzjsy/article/details/12440519
重新编译移植后:
insmod mt7601Usta.ko
[ 14.962494] rtusb init rt2870 --->
[ 14.966209] usbcore: registered new interface driver rt2870
总算没有错误了。但出现没有识别到wlan0的情况。
修改common/rtusb_dev_id.c文件。添加支持此无线网卡的ID。
{USB_DEVICE(0x148f,0x760b)},/* 360 Wifi 2 Gen
参考网址:
https://zhidao.baidu.com/question/1513867760733910940.html
然后:
insmod 模块
# insmod home/mt7601Usta.ko
[ 31.222925] rtusb init rt2870 --->
[ 31.226409] ===>rt2870_probe()!
[ 31.229549] --> RTMPAllocAdapterBlock
[ 31.234475]
[ 31.234482]
[ 31.234489] === pAd = c57de000, size = 845688 ===
[ 31.234499]
[ 31.243671] --> RTMPAllocTxRxRingMemory
[ 31.249336] <-- RTMPAllocTxRxRingMemory, Status=0
[ 31.254994] <-- RTMPAllocAdapterBlock, Status=0
[ 31.259526] NumEndpoints=8
[ 31.262261] BULK IN MaxPacketSize = 512
[ 31.266093] EP address = 0x84
[ 31.269052] BULK IN MaxPacketSize = 512
[ 31.272913] EP address = 0x85
[ 31.275877] BULK OUT MaxPacketSize = 512
[ 31.279799] EP address = 0x 8
[ 31.282963] BULK OUT MaxPacketSize = 512
[ 31.286882] EP address = 0x 4
[ 31.290019] BULK OUT MaxPacketSize = 512
[ 31.293968] EP address = 0x 5
[ 31.297108] BULK OUT MaxPacketSize = 512
[ 31.301062] EP address = 0x 6
[ 31.304203] BULK OUT MaxPacketSize = 512
[ 31.308123] EP address = 0x 7
[ 31.311288] BULK OUT MaxPacketSize = 512
[ 31.315207] EP address = 0x 9
[ 31.318347] RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x8
[ 31.323779] RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x4
[ 31.329178] RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x5
[ 31.334606] RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x6
[ 31.340008] RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x7
[ 31.345439] RTMP_COM_IoctlHandle():pAd->BulkOutEpAddr=0x9
[ 31.350873] STA Driver version-3.0.0.3
[ 31.354993] -->MT7601_Init():
[ 31.358124] Chip specific bbpRegTbSize=0!
[ 31.362170] Chip VCO calibration mode = 0!
[ 31.366491] NVM is EFUSE
[ 31.369019] Efuse Size=0x1d [Range:1e0-1fc]
[ 31.373329] Endpoint(8) is for In-band Command
[ 31.377768] Endpoint(4) is for WMM0 AC0
[ 31.381643] Endpoint(5) is for WMM0 AC1
[ 31.385476] Endpoint(6) is for WMM0 AC2
[ 31.389316] Endpoint(7) is for WMM0 AC3
[ 31.393180] Endpoint(9) is for WMM1 AC0
[ 31.397012] Endpoint(84) is for Data-In
[ 31.400882] Endpoint(85) is for Command Rsp
[ 31.405063] Allocate a net device with private data size=0!
[ 31.410671] The name of the new ra interface is ra0...
[ 31.415813] RtmpOSNetDevAttach()--->
[ 31.419968] <---RtmpOSNetDevAttach(), ret=0
[ 31.424206] <===rt2870_probe()!
[ 31.427564] usbcore: registered new interface driver rt2870
# ifconfig -a
eth0 Link encap:Ethernet HWaddr 66:55:44:33:22:10
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)
Interrupt:22
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 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:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ra0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
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)
识别到了网卡。
接下来:
ifconfig ra0 up
http://blog.csdn.net/u013286409/article/details/49025679
[ 259.973609] <---RTUSBCmdThread
[ 259.976688] Terminate the task(RtmpTimerTask) with pid(356)!
[ 259.982396] <---RtmpTimerQThread
[ 260.015738] !!! rt28xx init fail !!!
[ 260.019313] rt28xx_open return fail!
ifconfig: SIOCSIFFLAGS: Operation not permitted
启动网卡时出现错误。
解决办法将将.dat文件拷贝
sudo mkdir -p 4310_root_release/etc/Wireless/RT2870STA/
sudo cp -p ../mt7601/mt7601_4/RT2870STA.dat 4310_root_release/etc/Wireless/RT2870STA/
继续做如下:
insmod home/mt7601Usta.ko
ifconfig ra0 up
iwlist ra0 scanning 无线AP热点扫描。
接下来移植两个工具wireless工具 和wpa工具参考:
wireless工具 :
https://hewlettpackard.github.io/wireless-tools/Tools.html
libiw.so.29动态库被wireless工具所需要 放进/lib文件夹中
wpa工具:
http://blog.csdn.net/farsight2009/article/details/5660878
http://blog.csdn.net/haomcu/article/details/7267672
移植成功后:
wpa_passphrase Guest abc26585555 >> /etc/wpa_supplicant.conf
wpa_supplicant -B -i ra0 -D wext -c /etc/wpa_supplicant.conf
通过iwpriv ra0 connStatus查看连接状态。
ifconfig ra0 192.168.236.88 netmask 255.255.255.0
route add default gw 192.168.236.1
配置网卡信息完成后。
首先关闭本地网卡,再启动wifi网卡
#ifconfig eth0 down (如果非同一ip段,不需要关闭)
ifconfig ra0 up
如果启动网卡后,会不断出现错误:BIRIdx(1): RXDMALen not multiple of 4.[43507], BulkInBufLen = 416)
修改./MODULE/include/iface/rtmp_usb.h问题就能够解决掉。
#define RXBULKAGGRE_SIZE 12 该为8
注:调试过程中可以调整bug等级输出打印信息。os/linux/rt_linux.c:54:ULONG RTDebugLevel = RT_DEBUG_TRACE;
如果在pc上可以直接修改:
Sovled with the form of /etc/network/interfaces
auto lo
iface lo inet loopback
auto wlan0
iface wlan0 inet manual
wpa-driver nl80211
wpa-roam /etc/wpa_supplicant.conf
iface default inet dhcp
Reboot,go surfing now.