移植无线网卡驱动至开发板(PXA16x)

将无线网卡插入任何可以识别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 629 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 629 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.

猜你喜欢

转载自blog.csdn.net/qq_28219531/article/details/73916736