3.1 wifi网卡RT3070在S3C2440的移植和使用

学习目标:熟悉RT3070在S3C2440的移植和使用,以及其中的相关工具的安装和使用;

一、配置内核选择WIFI驱动

1. 将usb wifi插到电脑,在ubuntu使用命令:# lsusb 查看wifi的PID:0x148f, VID:0x3070

2. 搭建环境

(使用的是arm-linux-gcc 4.3.2,内核为:linux 3.4.2)

1) 内核源码打补丁

 在终端执行以下命令:
 # tar xjf linux-3.4.2.tar.bz2
 # cd linux-3.4.2
 # patch -p1 < ../linux-3.4.2_camera_jz2440.patch
 # cp config_ok .config

2) 配置内核
    进入内核目录,根据网卡的VID/PID确定使用哪一个源码,搜索usb-wifi的 0x3070:
    # cd /work/system/linux-3.4.2/drivers/net/wireless
    # grep "0x3070" * -nR

回复--> rt2x00/rt2800usb.c:1077: { USB_DEVICE(0x148f, 0x3070) },
进入到对应目录/drivers/net/wireless/rt2x00的Makefile:obj-$(CONFIG_RT2800USB)     += rt2800usb.o, 可知需要配置项:CONFIG_RT2800USB
查看对应的Kconfig文件: 
 1    config RT2800USB
 2         tristate "Ralink rt27xx/rt28xx/rt30xx (USB) support"
 3         depends on USB
 4         select RT2800_LIB
 5         select RT2X00_LIB_USB
 6         select RT2X00_LIB_FIRMWARE
 7         select RT2X00_LIB_CRYPTO
 8         select CRC_CCITT
 9         ---help---
10           This adds support for rt27xx/rt28xx/rt30xx wireless chipset family.
11           Supported chips: RT2770, RT2870 & RT3070, RT3071 & RT3072
12           When compiled as a module, this driver will be called "rt2800usb.ko".

因此,可知CONFIG_RT2800USB在make menuconfig配置界面的字符提示为:"Ralink rt27xx/rt28xx/rt30xx (USB) support" ,执行make menuconfig,搜索 /RT2800USB

根据目录进行配置成模块,然后对依赖项搜索,配置:
  │ Symbol: RT2X00 [=m]                                                                                      
  │ Type  : tristate                                                                                                      
  │ Prompt: Ralink driver support                                                                              
  │   Defined at drivers/net/wireless/rt2x00/Kconfig:1                                             
  │   Depends on: NETDEVICES [=y] && WLAN [=y] && MAC80211 [=y]                                             
  │   Location:                                                                                                  
  │     -> Device Drivers                                                                                     
  │       -> Network device support (NETDEVICES [=y])                                                        
  │         -> Wireless LAN (WLAN [=y]) 

以此类推,对其依赖项进行配置。
还有一项:  Library routines  ---> 
          {*} CRC-CCITT functions

即:

3)编译内核:

  # make uImage
4) 编译模块:
    # make modules
5) 拷贝这生成的四个文.ko文件到nfs文件系统目录:
   # ls *.ko
   # cp *.ko /work/nfs_root/fs_mini_mdev_new/lib/

二、 kernel和驱动在开发板运行

1. 将uImage烧写到开发板中,插上wifi执行lsusb查看设备是否存在。
  uboot命令行(默认方式烧写):
  set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.8:/work/nfs_root/fs_mini_mdev_new ip=192.168.1.17
  set bootcmd 'nfs 32000000 192.168.7.124:/work/nfs_root/uImage; bootm 32000000'
  save
  boot

2. mount命令挂在文件目录,并加载编译的驱动模块:
     insmod rt2x00lib.ko   ...4个
     注意:——> rt2870.bin固件需要拷贝到开发板 /lib/firmmware目录下

3.  启动网卡:ifconfig wlan0 up,并使用# ifconfig -a 命令查看网卡状态。

4. 为wlan0配置ip:
     # ifconfig wlan0 192.168.73.6
     注意:这里配置IP要根据后面的热点(或者使用DHCP工具自动配置)进行配置, eth0和wifi不在一个网段;

三、wifi模块的配置和使用

3.1 概念: 认证/加密
    无线加密的多种方法,包括:WEP WPA TKIP EAP,他们之间的区别:
        http://wenku.baidu.com/link?url=DlLntlD490hAeIIbE-CO4QfAzgUC-gOTA7FCwS_XanOJMFzkyhQrFIB38ULKCcQIVFyDqqSWNWyq5kVtYAoJKjjf9pmZLu17-hVQ922WeaG
     例如:手机上WIFI热点有4种常用的"认证/加密":1) OPEN;  2)WEP;3) WPA(TKIP);4)WPA2(AES)

     无线网络的配置需要安装以下工具:iw, wpa_supplicant,dhcp

3.2 iw 工具
      旧工具iwconfig, iw是它的替代者, 可用于这2种"认证/加密": OPEN, WEP
  3.2.1 编译和安装
  a. 依赖库libnl安装
     -> tar xzf libnl-3.2.23.tar.gz
     -> cd libnl-3.2.23/
     -> ./configure --host=arm-linux --prefix=$PWD/tmp //配置编译目录为当前目录下的/tmp
      编译出现问题,方法:修改 lib/addr.c 添加宏(宏来自内核源码include/linux/socket.h)
     -> make
     -> make install

   拷贝库文件和头文件到arm-linux-gcc的路径目录下,用于后面的编译iw工具:

   把编译出来的头文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include(注意程序v里报错时,是需要直接拷贝netlink/)
     -> cd tmp/include/libnl3
     -> sudo cp netlink -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include 

    把编译出来的库文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib  
    把编译出来的库文件应该放入NFS文件系统的lib目录:/work/nfs_root/fs_mini_mdev_new/lib

  b.安装iw
    -> tar xjf iw-3.11.tar.bz2
    -> cd iw-3.11/
    修改Makefile:
       CC = "arm-linux-gcc"
       NL3xFOUND := Y
       #LIBS += $(shell $(PKG_CONFIG) --libs $(NLLIBNAME))
       #CFLAGS += $(shell $(PKG_CONFIG) --cflags $(NLLIBNAME))
    在info.c的代码前面添加
       #define htole16(X)  (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff)

  将生成的iw工具拷贝到开发板;

  3.2.2 iw使用:
    iw list  // 列出WIFI网卡的性能
    ifconfig wlan0 up   //  ifconfig wlan0 down
    iw dev wlan0 scan   // 扫描WIFI AP
    iw wlan0 connect vivo  // 连接到WIFI AP:vivo (open)
    iw wlan0 connect vivo keys d:0:baiwenwang123 // 连接到WIFI AP:vivo (WEP) d: default, 0: 第0个密码   

    iw dev wlan0 link查看连接状态
    ifconfig wlan0 192.168.1.55(配置前,可用电脑链接vivo热点,并在终端上查看ip网段
    ping 192.168.1.1
    iw wlan0 disconnect

  3.3. wpa_supplicant安装: 可用于上述4种"认证/加密"
  a. 编译依赖libopenssl
    -> tar xzf openssl-1.0.1d.tar.gz
    -> cd openssl-1.0.1d/
    -> ./config shared no-asm --prefix=$PWD/tmp
    修改Makefile:
       CC= arm-linux-gcc
       AR= arm-linux-ar $(ARFLAGS) r
       RANLIB= arm-linux-ranlib
       NM= arm-linux-nm
       MAKEDEPPROG= arm-linux-gcc

    -> make    

  -> make install     把编译出来的头文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

    把编译出来的库文件应该放入:/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

    把编译出来的库文件应该放入NFS文件系统的lib目录:/work/nfs_root/fs_mini_mdev_new/lib(需要拷贝到开发板的)

  b. 安装wpa_supplicant
    -> tar xzf wpa_supplicant-2.0.tar.gz
    -> cd wpa_supplicant-2.0/wpa_supplicant/
    -> cp defconfig .config
    修改.config加上一行:
        CONFIG_LIBNL32=y
    修改Makefile:
        CC=arm-linux-gcc
    -> make
    -> make DESTDIR=$PWD/tmp install   //安装到当前下目录的tmp目录下

  c.wpa_supplicant使用:
     将编译出的工具wpa_supplicantwpa_cli拷贝到开发板的/bin/目录下,并修改执行权限
    -> mkdir -p /var/run/wpa_supplicant
    4种模式的使用:(需要修改并拷贝/work/netwoktool/wpa_supplicant-2.0/wpa_supplicant/examples下的.conf配置文件,并拷贝到开发板的/etc/目录下)
       ① OPEN
      ifconfig wlan0 up
      wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
      wpa_cli -iwlan0 status  // 查看状态
      ifconfig wlan0 192.168.1.55(和iw的ip配置方法相同)
      ping 192.168.1.1

      配置文件内容为:
       ctrl_interface=/var/run/wpa_supplicant
       network={
               ssid="hello"    //wifi ap的名字
               key_mgmt=NONE   
       }

      ② WEP/WEP
       wpa_supplicant -B -c/etc/wep.conf  -iwlan0
       wpa_cli -iwlan0 status  // 查看状态
       ifconfig wlan0 192.168.1.55
       ping 192.168.1.1

     配置文件:
       ctrl_interface=/var/run/wpa_supplicant
       network={
                ssid="hello"
                key_mgmt=NONE
                wep_key0="12345678"   //密码
                wep_tx_keyidx=0
        }

      ③WPA(TKIP)
       wpa_supplicant -B -c/etc/wpa-psk-tkip.conf  -iwlan0
       wpa_cli -iwlan0 status  // 查看状态
       ifconfig wlan0 192.168.1.55
       ping 192.168.1.1

     配置文件
       ctrl_interface=/var/run/wpa_supplicant  # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
       network={
                 ssid="hello"
                 proto=WPA  # proto: list of accepted protocols, 可取WPA,RSN
                            # If not set, this defaults to: WPA RSN
                 key_mgmt=WPA-PSK # 认证方式
                            # If not set, this defaults to: WPA-PSK WPA-EAP
                 pairwise=TKIP    # If not set, this defaults to: CCMP TKIP
                 group=TKIP       # If not set, this defaults to: CCMP TKIP WEP104 WEP40
                 psk="12345678"
       }

       ④ WPA2(AES)
        wpa_supplicant -B -c/etc/wpa_wpa2.conf  -iwlan0
        wpa_cli -iwlan0 status  // 查看状态
        ifconfig wlan0 192.168.1.55
        ping 192.168.1.1 

       配置文件:
       ctrl_interface=/var/run/wpa_supplicant
       network={
                 ssid="hello"
                 psk="12345678"
       }

注意:   wpa_cli可工作于"命令模式"和"交互模式"

       ⑤ 配置文件里设置多个无线网络
       ctrl_interface=/var/run/wpa_supplicant
       network={
                 ssid="hello"
                 psk="12345678"
       }
       network={
                 ssid="word"
                 psk="12345678"
       }

        ⑥ 访问外网:
       修改/etc/resolv.conf添加DNS:(根据ap的网段配置)
       nameserver 192.168.1.1

       设置网关:
       route add default gw 192.168.1.1

   3.4. dhcp : 使得WIFI网卡动态获取IP
   a. 编译、安装
     -> tar xzf dhcp-4.2.5-P1.tar.gz
     -> cd dhcp-4.2.5-P1
     -> ./configure --host=arm-linux ac_cv_file__dev_random=yes

     -> cd bind   
     修改Makefile:
     -> ./configure BUILD_CC=gcc ac_cv_file__dev_random=yes --host=arm-linux --disable-kqueue

     -> tar xzf bind.tar.gz
     -> cd bind-9.8.4-P2
     修改 lib/export/dns/Makefile.in
         gen: ${srcdir}/gen.c
              ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}
         改为
         gen: ${srcdir}/gen.c
              ${BUILD_CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}

     -> cd ../..
     -> make DESTDIR=$PWD/tmp install

     把文件复制到挂载的文件目录下:
     sudo cp bin/* /work/nfs_root/fs_mini_mdev_new/bin/
     sudo cp sbin/* /work/nfs_root/fs_mini_mdev_new/sbin/
     sudo cp etc/dhclient.conf.example //work/nfs_root/fs_mini_mdev_new/etc/dhclient.conf
     sudo cp etc/dhcpd.conf.example /work/nfs_root/fs_mini_mdev_new/etc/dhcpd.conf

     sudo cp client/scripts/linux /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
     chmod +x /work/nfs_root/fs_mini_mdev_new/etc/dhclient-script
     并修改
       #!/bin/bash
     改为
       #!/bin/sh  //arm平台需要用sh

   b. dhcp的使用:
    # insmod 加载4个.ko模块
    # mkdir -p /var/db
    # ifconfig wlan0 up
    # wpa_supplicant -B -c/etc/wpa2-eap-ccmp.conf -i wlan0

    # cp mnt/fs_mini_mdev_new/dhcp etc/dhclient-script  /sbin/
    # chmod 777 /sbin/dhclient-script
    # dhclient -d wlan0
    # route                  查看网关
    # cat /etc/resolv.conf   查看DNS

   3.5 一接入WIFI网卡,就自动执行wpa_supplicant等
    热拔插配置文件:
      $ vi /etc/mdev.conf
         wlan0 0:0 777 * /sbin/auto_wifi.sh

      $ vi /sbin/auto_wifi.sh
     #!/bin/sh
    if [ $ACTION = "add" ];
    then                                             
       wpa_supplicant -B -c/etc/wpa_wpa2.conf  -iwlan0
       wpa_cli -a/sbin/wpa_action.sh -B
    else                    
       killall wpa_supplicant
       killall wpa_cli
       killall dhclient
   fi

      $ chmod +x /sbin/auto_wifi.sh

     一连接上WIFI AP, 就自动执行dhclient
       创建一脚本wpa_action.sh:   
         $ vi /sbin/wpa_action.sh
     #!/bin/sh
     IFNAME=$1   //wlan0 
          CMD=$2
        if [ "$CMD" = "CONNECTED" ]; then
          echo connect $IFNAME, dhclient for it > /dev/console
          dhclient -d $IFNAME
      fi
      if [ "$CMD" = "DISCONNECTED" ]; then
              echo disconnect $IFNAME, kill dhclient for it > /dev/console
        killall dhclient
     fi

       运行:
         $ chmod +x /sbin/wpa_action.sh
         $ wpa_cli -a/sbin/wpa_action.sh -B 后台

  关闭和打开命令:
    $ wpa_cli -iwlan0 disconnect
    $ wpa_cli -iwlan0 reconnect
  ping外网:
    $ ping baidu.com

四. 使用WIFI网卡的AP功能

 4.1 下载源码

  地址:http://w1.fi/hostapd/
  4.2 编译、安装
      # tar xzf hostapd-2.0.tar.gz
      # cd hostapd-2.0/
      # cd hostapd/
      # cp defconfig .config
     修改.config, 加一行:
   CONFIG_LIBNL32=y
     修改Makefile:
   CC=arm-linux-gcc
      # make
     
# make DESTDIR=$PWD/tmp install

    把tmp/下生成的hostapd  hostapd_cli复制到NFS的bin目录

   4.3  hostapd使用
     a. hostapd的配置文件: WPA/WPA2
     # vi /etc/hostapd/myhostapd.conf
          ctrl_interface=/var/run/hostapd
          #change wlan0 to your wireless device
          interface=wlan0
          driver=nl80211
          ssid=helloworld    //ap名称
          channel=1

          # 认证/加密方式
          macaddr_acl=0
          auth_algs=1
          ignore_broadcast_ssid=0
          wpa=3
          wpa_passphrase=123456   //密码
          wpa_key_mgmt=WPA-PSK
          wpa_pairwise=TKIP
          rsn_pairwise=CCMP

          把配置文件存为/etc/hostapd/myhostapd.conf
          启动 hostapd:
       # hostapd -B /etc/hostapd/myhostapd.conf

     b. 启动 dhcpd
        修改配置文件/etc/dhcpd.conf,添加:
      subnet 192.168.1.0 netmask 255.255.255.0 {                      
            range 192.168.1.10 192.168.1.100;                             
            option domain-name-servers 192.168.1.1;                       
            option routers 192.168.1.1;                                   
          }  

        创建空文件/var/db/dhcpd.leases:
         --> /var/db/dhcpd.leases

         --> ifconfig wlan0 192.168.1.1
         --> dhcpd -cf /etc/dhcpd.conf wlan0

         --> killall hostapd 关闭热点

   4.3.1 OPEN方式的配置文件

     # vi /etc/hostapd/myhostapd.conf
         ctrl_interface=/var/run/hostapd
         #change wlan0 to your wireless device
         interface=wlan0
         driver=nl80211
         ssid=Hello word
         channel=1

          # 认证/加密方式
         macaddr_acl=0
         auth_algs=1
         ignore_broadcast_ssid=0

   4.3.2 WEP方式的配置文件

     # vi /etc/hostapd/myhostapd.conf
          ctrl_interface=/var/run/hostapd
          #change wlan0 to your wireless device
          interface=wlan0
          driver=nl80211
          ssid==Hello word
          channel=1

          # 认证/加密方式
          macaddr_acl=0
          auth_algs=2
          ignore_broadcast_ssid=0
          wep_key0="12345678"
          wep_default_key=0

    4.3.3 修改/etc/mdev.conf自动启动AP模式
        vi /etc/mdev.conf
            wlan0 0:0 777 * /sbin/auto_wifi_ap.sh

         # vi /sbin/auto_wifi_ap.sh
          #!/bin/sh
          if [ $ACTION = "add" ];
             then
             hostapd -B /etc/hostapd/myhostapd.conf
             ifconfig wlan0 192.168.1.1
             dhcpd -cf /etc/dhcpd.conf wlan0
          else
             killall hostapd
             killall dhcpd
          fi

posted @ 2019-01-16 17:42  程序猿爱吃鸡  阅读(1392)  评论(0编辑  收藏  举报