• 百问网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
  • 相关阅读:
    jdk1.8 操作List<Map> 多个map 具有相同的key 进行分组合并重组数据
    js获取字符中连续的值
    Java线程ABA问题
    Oracle递归查询语句
    Oracle学习笔记表连接(十六)
    Docker For Mac没有docker0网桥
    awk 和 sed (Stream Editor)
    WARNING: firstResult/maxResults specified with collection fetch; applying in memory!
    iptables编写规则
    InnoDB Next-Key Lock
  • 原文地址:https://www.cnblogs.com/wanglouxiaozi/p/12806016.html
Copyright © 2020-2023  润新知