RT3070L无线网卡移植
一、修改内核支持USB无线网卡
[*] Networking support --->
[*] Wireless --->
<*> cfg80211 - wireless configuration API
[*] Wireless extensions sysfs files
<*> Generic IEEE 802.11 Networking Stack(mac80211)
Device Drivers --->
[*]Network device support --->
[*] Wireless LAN --->
<*> IEEE 802.11 for Host AP (Prism2/2.5/3 andWEP/TKIP/CCMP)
[*] Support downloading firmware images withHost AP driver
[*] Support for non-volatile firmwaredownload
<*> Ralink driver support --->
<*> Ralink rt27xx/rt28xx/rt30xx (USB) support
二、移植RT3070L的驱动
2.1下载网卡驱动
2.2 解压文件
tar -xjf DPO_RT3070_LinuxSTA_V2.3.0.2_20100412.tar.bz2
由于文件名太长,重命名一下
mv DPO_RT3070_LinuxSTA_V2.3.0.2_20100412 rt3070l
2.3进入rt3070l目录,修改makefile
README_STA_usb 这个文件告诉了移植的方法,可以浏览一下
Platform 选择默认的PC
改变交叉编译路径和linux源码路径
2.4编译驱动程序
2.4.1 make之后出现如下错误
implicit declaration of function ' usb_buffer_free'
implicit declaration of function ' usb_buffer_alloc'
显示usb_buffer_alloc和'usb_buffer_free没有申明,这是由于Relink RT3070驱动支持linux 内核版本太旧的原因。
2.4.2 使用命令查找usb_buffer_free,解决错误
find . -name "*"|xargs grep "usb_buffer_free"
显示如下
./include/os/rt_linux.h:#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)
./include/os/rt_linux.h:#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) rausb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)
./include/os/rt_linux.h:extern void rausb_buffer_free(struct usb_device *dev,
./os/linux/rt_usb_util.c:void rausb_buffer_free(struct usb_device *dev,
./os/linux/rt_usb_util.c: usb_buffer_free(dev, size, addr, dma);
./os/linux/rt_usb_util.c:EXPORT_SYMBOL(rausb_buffer_free);
Vim ./include/os/rt_linux.h
usb_buffer_alloc 和 usb_buffer_free这两个函数已不在使用了,可以用usb_alloc_coherent 和 usb_free_coherent代替
2.4.3再次编译驱动
sudo make 之后会在 os/linux/ 目录下生成rt3070sta.ko驱动文件
下载相应的驱动文件到开发板
把RT2870STA.dat拷贝到/etc/Wireless/RT2870STA目录下
加载rt3070sta.ko驱动
insmod rt3070sta.ko
显示错误如下
/apps >: 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)
rt3070sta: Unknown symbol usb_deregister (err 0)
rt3070sta: Unknown symbol usb_kill_urb (err 0)
insmod: can't insert 'rt3070sta.ko': unknown symbol in module or invalid parameter
这是有内核无法识别的原因,相应的内核没有LICENSE
找到OS/linux/rt_main_dev.c 在第一行加入 MODULE_LICENSE(“GPL”);
再次编译,加载模块,显示如下
~ >: insmod rt3070sta.ko
rtusb init --->
usbcore: registered new interface driver rt2870
表明内核加载成功
2.4.4使能网卡
ifconfig wlan0 up
显示
显示没有固件
找到common/rt2870.bin的固件,放入开发板的lib/firmware/目录下
使文件具有可执行的权限:chmod +x rt2870.bin
使能网卡: ifconfig wlan0 up
三、移植Wireless Tools
3.1下载源文件
wget http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz
3.2解压问件
tar -xzf wireless_tools.29.tar.gz
3.3修改Makefile
5 ## Installation directory. By default, go in /usr/local.
6 ## Distributions should probably use /, but they probably know better...
7 ifndef PREFIX
8 PREFIX = ./ //库安装目录,我选择的是当前目录
9 endif
10
11 ## Compiler to use (modify this for cross compile).
12 CC = arm-linux-gcc //交叉编译器
13 ## Other tools you need to modify for cross compile (static lib only).
14 AR = arm-linux-ar //连接器
15 RANLIB = arm-linux-ranlib
3.4编译文件,移植库和工具
Make之后,将生成的libiw.so.29,移植到开发板的lib目录下
将ifrename,iwconfig, iwlist, iwgetid, iwevent,iwpriv, iwspy,工具移植到开发板的bin目录下
3.5移植工具的使用
参考博客:http://blog.sina.com.cn/s/blog_73739d500100oz2v.html
四、移植openss
4.1修改Makefile
安装目录就指定为默认目录
CC= arm-linux-gcc 修改交叉编译器
4.2 编译和安装
注意安装时切换到root用户,再make,make install
使用sudo 权限是不行的
五、移植wpa_supplicant
5.1 下载文件
Wget http://hostap.epitest.fi/releases/wpa_supplicant-0.7.3.tar.gz
5.2配置和修改
5.2配置修改,编译
进入/wpa_supplicant-0.7.3/wpa_supplicant/目录
#cp defconfig .config
#vi .config
增加这几行
CFLAGS += -I/openss/include/
LIBS += -L/openss/lib/
CC = arm-linux-gcc -L /openss/lib/
#make
5.3 移植文件
将wpa_supplicant 移植到开发板的bin目录下
将 修改的wpa_supplicant.conf文件放入etc目录下
chmod +x bin/wpa_supplicant
chmod +x etc/wpa_supplicant.conf
执行wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant.conf -Dwext命令
显示如下
~ >: wpa_supplicant: symbol '__ctype_tolower': can't resolve symbol
>
> wpa_supplicant: symbol '__ctype_b': can't resolve symbolchmod +x bin/wpa_suppl
icant
这个应该是开发板缺少相应wpa_supplicant需要的动态库文件,
目前我找到的解决方法是静态连接
修改 .config 文件
CFLAGS += -I/openss/include/
LIBS += -L/openss/lib/
CC = arm-linux-gcc -L /openss/lib/ -static //选择静态连接
5.4 执行命令,配置网络
再次编译之后,将 wpa_supplicant,放入开发板的bin目录
修改权限chmod +x wpa_supplicant
再次执行
wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant.conf -Dwext
出现了一个问题:暂时不知道什么原因
~ >: cfg80211: Calling CRDA for country: US
cfg80211: Regulatory domain changed to country: US
cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2700 mBm)
cfg80211: (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 1700 mBm)
cfg80211: (5250000 KHz - 5330000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
cfg80211: (5490000 KHz - 5600000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
cfg80211: (5650000 KHz - 5710000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
cfg80211: (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 3000 mBm)
cfg80211: (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
解决方法:找到内核目录net/wireless/reg.c文件,注释相应的打印信息。
查看状态:
#iwconfig
显示如下
~ >: iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
wlan0 IEEE 802.11bgn ESSID:"16-912A"
Mode:Managed Frequency:2.412 GHz Access Point: 38:83:45:51:4F:AA
Bit Rate=6.5 Mb/s Tx-Power=27 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
Link Quality=63/70 Signal level=-47 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:8 Missed beacon:0
证明连接到了网络
设置ip地址
#ifconfig wlan0 192.168.1.230 netmask 255.255.255.0
ping 192.168.1.1
~ >: ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=0 ttl=64 time=262.313 ms
64 bytes from 192.168.1.1: seq=1 ttl=64 time=45.464 ms
64 bytes from 192.168.1.1: seq=2 ttl=64 time=45.511 ms
64 bytes from 192.168.1.1: seq=3 ttl=64 time=44.479 ms
64 bytes from 192.168.1.1: seq=4 ttl=64 time=44.560 ms
在电脑上ping 开发板
C:\Users\Administrator>ping 192.168.1.230
正在 Ping 192.168.1.230 具有 32 字节的数据:
来自 192.168.1.230 的回复: 字节=32 时间=129ms TTL=64
来自 192.168.1.230 的回复: 字节=32 时间=258ms TTL=64
来自 192.168.1.230 的回复: 字节=32 时间=278ms TTL=64
来自 192.168.1.230 的回复: 字节=32 时间=186ms TTL=64
192.168.1.230 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 129ms,最长 = 278ms,平均 = 212ms
由此说明无线网卡已经移植成功了。
六、动态获取ip地址
6.1在busybox中选中相应选项:
6.2
/home/zhanghaijun/fl2440/3rdparty/busybox-1.20.2/examples/udhcp目录下的simple.script
重命名为dedault.script并拷贝到开发板usr/share/udhcpc/目录下,修改权限。
6.3 执行动态分配ip地址
udhcpc -i wlan0