百问网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

 

posted @ 2020-04-29 23:55  闹闹爸爸  阅读(762)  评论(0编辑  收藏  举报