百问网WIFI模块驱动
把wifi模块接到JZ2440开发板USB口上,运行lsusb,可以看到usb-wifi模块的VID(V是vender的缩写)和PID(P是product的缩写)。
可以看出usb-wifi的VID是0x148f ,PID是0x3070。(如果不知道哪一个USB设备是wifi-usb的话,最简单的方法就是先lsusb看一下有哪些设备,插入usb-wifi后再lsusb看一下多了哪个设备)
我们可以通过该设备的PID来查看linux是否支持该设备。
在浏览器中打开http://linuxwireless.org/en/users/Devices/USB/
搜索“0x3070”可以找到如下项:
开发板环境搭建
1)解压内核
tar -xvf linux-3.4.2.tar.bz2
2 ) 切换目录
cd linux-3.4.2
3 ) 给内核打补丁
patch -p1 < ../linux-3.4.2_camera_jz2440.patch
../linux-3.4.2_camera_jz2440.patch是因为patch和linux-3.4.2放在了同一目录下,如果把patch放在linux-3.4.2目录里可以省略掉 “../”。
-p1中的数字1是根据patch里面的内容而定的,patch的内容如下:
1 diff -urN linux-3.4.2/arch/arm/mach-s3c24xx/common-smdk.c linux-3.4.2_camera_jz2440/arch/arm/mach-s3c24xx/common-smdk.c 2 --- linux-3.4.2/arch/arm/mach-s3c24xx/common-smdk.c 2012-06-09 23:36:33.000000000 +0800 3 +++ linux-3.4.2_camera_jz2440/arch/arm/mach-s3c24xx/common-smdk.c 2013-10-18 10:52:01.888398405 +0800 4 @@ -110,43 +110,23 @@ 5 6 static struct mtd_partition smdk_default_nand_part[] = { 7 [0] = { 8 - .name = "Boot Agent", 9 - .size = SZ_16K, 10 + .name = "bootloader", 11 + .size = SZ_256K, 12 .offset = 0, 13 },
linux-3.4.2_camera_jz2440.patch做的时候是根据diff linux-3.4.2_camera_jz2440目录和linux-3.4.2两个目录,所以打patch的时候要忽略掉第一个‘/’前的路径,也就是-p1, 如果需要忽略前两
个'/'前的路径,则为-p2。
4 )复制配置文件
cp config_ok .config
配置和编译linux-3.4.2内核及模块
在内核源码中使用grep 命令搜索 usb-wifi 设备的PID 0x3070:
到相应目录查看Makefile文件(drivers/net/wireless/rt2x00/Makefile):
从而需要配置项CONFIG_RT2800USB。查看Kconfig文件(drivers/net/wireless/rt2x00/Kconfig):
可知CONFIG_RT2800USB字符提示为“Ralink rt27xx/rt28xx/rt30xx (USB) support”。
使用make menuconfig来配置内核,分别设置如下:
[*] Networking support ---> -*- Wireless ---> <*> cfg80211 - wireless configuration API <*> Generic IEEE 802.11 Networking Stack (mac80211)
Library routines --->
{*} CRC-CCITT functions
Device Drivers ---> [*] Network device support ---> [*] Wireless LAN ---> <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP) [*] Support downloading firmware images with Host AP driver [*] Support for non-volatile firmware download <M> Ralink driver support ---> <M> Ralink rt27xx/rt28xx/rt30xx (USB) support
推荐将Ralink driver support 和 Ralink rt27xx/rt28xx/rt30xx (USB) support配置成M,从而编译成模块。
注意:
<M> Ralink rt27xx/rt28xx/rt30xx (USB) support
推荐将wifi模块的驱动编译成模块,可以避免“冷启动的问题” (开发板启动时已经插入了usb-wifi模块,但是无法正常使用,只能重新热插拔一次才能正常工作)。
接着,使用“make uImage”命令重新编译内核,
make uImage
出现以下错误:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373. /root/linux-3.4.2/kernel/Makefile:129: recipe for target 'kernel/timeconst.h' failed make[1]: *** [kernel/timeconst.h] Error 255 Makefile:945: recipe for target 'kernel' failed make: *** [kernel] Error 2
解决方法:
打开kernel/timeconst.pl文件,第373行,把if (!defined(@val)) 改为if (!@val)即可。
重新make uImage,接着,使用“make modules”命令编译模块,
make modules
查看相应的模块文件,
同时在开发板上新建/lib/modules/3.4.2 和 /lib/firmware目录。
把上述四个模块拷贝到/lib/modules/3.4.2目录下,然后将usb-wifi模块的固件文件 rt2870.bin 复制到/lib/firmware目录
将usb-wifi模块插入到JZ2440开发板的USB Host口,执行lsusb命令检查usb-wifi设备是否存在,存在的话,加载相关模块:
/ # insmod /lib/modules/3.4.2/rt2x00lib.ko / # insmod /lib/modules/3.4.2/rt2x00usb.ko / # insmod /lib/modules/3.4.2/rt2800lib.ko / # insmod /lib/modules/3.4.2/rt2800usb.ko
当加载完rt2800usb.ko模块后,console上会打印如下信息:
usb 1-1: reset full-speed USB device number 3 using s3c2410-ohci usbcore: registered new interface driver rt2800usb
先用ifocnfig命令查看网卡状态
/ # ifconfig -a eth0 Link encap:Ethernet HWaddr 00:60:6E:33:44:55 inet addr:192.168.0.17 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:720 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:77528 (75.7 KiB) TX bytes:0 (0.0 B) Interrupt:51 Base address:0x8000 lo Link encap:Local Loopback LOOPBACK 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) wlan0 Link encap:Ethernet HWaddr 70:F1:1C:42:3C:3A 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)
可以看到有限网卡eth0已经有IP地址,无线网卡wlan0没有IP地址,
这是因为eth0我已经在/etc/init.d/rcS脚本里设置好静态IP了,可以手动使用ifconfig或者自动dhcp给wlan0配置一个IP地址
/ # cat /etc/init.d/rcS #!/bin/sh ifconfig eth0 192.168.0.17 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
ifconfig wlan0 192.168.0.18
然后对有线网卡进行ping测试:
/ # ping -I eth0 -c 8 192.168.0.1 PING 192.168.0.1 (192.168.0.1): 56 data bytes 64 bytes from 192.168.0.1: seq=0 ttl=64 time=4.387 ms 64 bytes from 192.168.0.1: seq=1 ttl=64 time=0.959 ms 64 bytes from 192.168.0.1: seq=2 ttl=64 time=0.856 ms 64 bytes from 192.168.0.1: seq=3 ttl=64 time=0.916 ms 64 bytes from 192.168.0.1: seq=4 ttl=64 time=1.366 ms 64 bytes from 192.168.0.1: seq=5 ttl=64 time=0.904 ms 64 bytes from 192.168.0.1: seq=6 ttl=64 time=0.912 ms 64 bytes from 192.168.0.1: seq=7 ttl=64 time=0.930 ms --- 192.168.0.1 ping statistics --- 8 packets transmitted, 8 packets received, 0% packet loss round-trip min/avg/max = 0.856/1.403/4.387 ms / #
‘-c 8’代表总共发8个包,192.168.0.1为路由器的默认IP,这说明有线网路是畅通的。
使用wpa_cli命令来操作wifi模块
wifi工具wpa_cli常用命令总结:
wpa_cli reassociate //强制wifi设备重新连接 wpa_cli status //查看wifi设备状态 wpa_cli scan //扫描当前wifi网络 wpa_cli scan_results //查看wifi扫描结果 wpa_cli list_network //查看当前可接入的网络 wpa_cli add_network //增加供wifi设备使用的网络,如网络0 wpa_cli remove_network 0 //可以考虑删除网络0 wpa_cli set_network 0 ssid "'Programmers'" //修改当前wifi可接入的网络0的ssid wpa_cli set_network 0 psk "'100asktech'" //设置网络0的passwd wpa_cli enable_network 0 //使能可接入的网络0 wpa_cli disable_network 0 //禁止可接入的网络0 wpa_cli select_network 0 //选择网络0来接入 wpa_cli save_config //保存wifi配置
一旦使用wpa_cli命令将wifi模块与路由器建立连接后,就可以测试无线网卡与路由器的网络是否畅通。
使用iwconfig命令来操作wifi模块的监控模式
ifconfig wlan0 down
iwconfig wlan0 mode Monitor
ifconfig wlan0 up
iwconfig wlan0
本文来自博客园,作者:闹闹爸爸,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/12806016.html