设为首页 收藏本站
查看: 1223|回复: 0

[经验分享] S3C2440实现wifi、3G上网和迷你无线路由的制作(一)

[复制链接]

尚未签到

发表于 2015-9-30 14:32:56 | 显示全部楼层 |阅读模式
  S3C2440实现wifi、3G上网和迷你无线路由的制作

  fulinux 凌云实验室
  
  本文将通过ARM、linux平台,借助RT2070/RT3070芯片的无线模块(或使用RT2070/RT3070芯片的USB无线上网卡)、3G无线上网卡,实现无线上网、通过ADSL和3G的迷你无线路由器的制作。
  
  
  wifi上网
  首先是利用s3c2440开发板和RT2070/RT3070芯片的无线模块实现无线上网的功能,即让无线模块工作在STA模式,所谓的STA在WLAN中一般为客户端,可以是装有无线网卡的计算机,也可以是有WiFi模块的智能手机。STA可以是移动的,也可以是固定的,是无线局域网的最基本组成单元。
  
  这里假定已经成功移植了linux-3.0内核和可读写的文件系统,例如ubifs、yaffs和jffs2文件系统,这里使用jffs2。下图是已经运行好的系统在secure CRT上的显示的结果:
  ~ >: ls
  apps     data     home     lib      media    proc     stat     usr
  backup   dev      info     linuxrc  mnt      root     sys      var
  bin      etc      init     logs     opt      sbin     tmp
  ~ >:
  
  这里使用一个集成RT2070芯片的USB无线网卡(或其他无线模块,注明一点就是3070和2070的模块是完全兼容的,下面我们只以RT2070模块作介绍),是下面是要用到的实物图:
   DSC0000.jpg

  
  
  (上图中的一些次要部件没有列出来,需要的部分会提到)
  
  先测试USB无线模块是否正常,我把它插在电脑上并且连接在普通无线路由器上,显示如下所示,则说明正常。
   DSC0001.jpg

  之后拔出,因为我的电脑用有线。
  
  
  内核配置
  从Linux-3.0开始,RT2070/3070的STA驱动已经作为正式版本加入了Linux内核源码中了(从Linux-2.6.32开始以实验版本加入Linux内核中)。本篇文章主要介绍如何在内核中编译支持RT2070的STA模式驱动,并连接到我的无线路由器上去。
  
  1, 配置Linux-3.0内核支持RT2070,我们以Build-in的方式将RT2070的驱动集成到内核里去,一下是一些需要的选项,其他配置可以自己试试:
  
  • Networking support  --->
               -*-   Wireless  --->
                    <*>   cfg80211 - wireless configuration API
                    [ ]     nl80211 testmode command
                    [ ]     enable developer warnings
                    [ ]     cfg80211 regulatory debugging
                    
  •      enable powersave by default
                    [ ]     use statically compiled regulatory rules database
                    [ ]     cfg80211 wireless extensions compatibility
                    <*>   Common routines for IEEE802.11 drivers
                    [ ]   lib80211 debugging messages
                    <*>   Generic IEEE 802.11 Networking Stack (mac80211)
                    [ ]   PID controller based rate control algorithm
                    
  •    Minstrel
                    
  •      Minstrel 802.11n support
                          Default rate control algorithm (Minstrel)  --->
                    [ ]   Enable mac80211 mesh networking (pre-802.11s) support
                    [ ]   Select mac80211 debugging features  --->
      
      Device Drivers  --->
             Generic Driver Options  --->
                    (/sbin/hotplug) path to uevent helper
                    [ ] Maintain a devtmpfs filesystem to mount at /dev
                    [ ] Select only drivers that don't need compile-time external firmware
                    [ ] Prevent firmware from being built
                    -*- Userspace firmware loading support
                    
  •    Include in-kernel firmware blobs in kernel binary
                    ()    External firmware blobs to build into the kernel binary
      
  • Network device support  --->
               
  •    Wireless LAN  --->
                   <*>   Ralink driver support  --->
                         --- Ralink driver support
                         < >   Ralink rt2500 (USB) support
                         < >   Ralink rt2501/rt73 (USB) support
                         <*>   Ralink rt27xx/rt28xx/rt30xx (USB) support
                         [ ]    rt2800usb - Include support for rt33xx devices
                         [ ]    rt2800usb - Include support for rt35xx devices (EXPERIMENTAL)
                         [ ]    rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)
                         [ ]    rt2800usb - Include support for unknown (USB) devices
                        
  •    Ralink debug output
      注明:
      a、cfg80211:
      cfg80211 is the Linux 802.11 configuration API. cfg80211 replaces Wireless-Extensions. nl80211 is used to configure a cfg80211 device and is used for kernel <–> userspace communication. Wireless extensions is now in maintenance mode, no new features will be added to it, we'll only fix bugs for it. cfg80211 is now feature-par complete with wireless-extensions, it actually has a lot more features that are simply not available and will never be available through wireless extensions. When implementing a cfg80211 driver wireless extensions support is still provided automatically for you through cfg80211 through CONFIG_CFG80211_WEXT. Distributions no longer needing wireless extensions can remove this and are encouraged to do so. cfg80211 also provides full regulatory support, this is done through wireless-regdb and the usage of CRDA.
      All new Linux wireless drivers should be written targeting either cfg80211 for fullmac devices or mac80211 for softmac devices.
      (摘自:http://wireless.kernel.org/en/developers/Documentation/cfg80211)
      b、Minstrel:
      minstrel is a mac80211 rate control algorithm ported over from MadWifi which supports multiple rate retries and claimed to be one of the best, if not the best, rate control algorithm.
      (摘自:http://wireless.kernel.org/en/developers/Documentation/mac80211/RateControl/minstrel/)
      c、hotplug
      这里是支持热插拔。
      d、Firmware
      固件的目的是初始化,()    External firmware blobs to build into the kernel binary这一选项可以加入固件路径。
      e、
  •    Ralink debug output
      这个选项选了后容易出现下面的警告。
      cfg80211: Calling CRDA to update world regulatory domain
      
      2、插入RT2070无线网卡并加载新内核启动
      ………..
      RAMDISK: gzip image found at block 0
          usb 1-1: new full speed USB device number 2 using at91_ohci
          hub 1-1:1.0: USB hub found
          hub 1-1:1.0: 4 ports detected
          usb 1-1.3: new full speed USB device number 3 using at91_ohci
          phy0 -> rt2x00_set_chip: Info - Chipset detected - rt: 2070, rf: 0006, rev: 0201.
          ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
          EXT2-fs (ram0): warning: mounting unchecked fs, running e2fsck is recommended
          VFS: Mounted root (ext2 filesystem) on device 1:0.
          Freeing init memory: 128K
      
      使用lsusb命令查看:
      ~ >: lsusb
      Bus 001 Device 001: ID 1d6b:0001
      Bus 001 Device 002: ID 05e3:0606
      Bus 001 Device 003: ID 148f:2070
      ~ >:
      如果是热插拔的话会,在插入的那一刻,串口会打印如下信息:
      ~ >: usb 1-1.1: new full speed USB device number 3 using s3c2410-ohci
      usb 1-1.1: New USB device found, idVendor=148f, idProduct=2070
      usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
      usb 1-1.1: Product: 802.11 g WLAN
      usb 1-1.1: Manufacturer: Ralink
      usb 1-1.1: SerialNumber: 1.0
      
      ifconfig是查看网卡的信息。
      ifconfig [Interface]
      Interface是可选项,如果不加此项,则显示系统中所有网卡的信息。如果添加此选项则显示所指定的网卡信息,例如:
      ~ >: ifconfig wlan0
      wlan0     Link encap:Ethernet  HWaddr C8:3A:35:C6:A2:B5  
                inet addr:192.168.5.1  Bcast:192.168.5.255  Mask:255.255.255.0
                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)
      我们可以看到
      第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)
      第二行:网卡的IP地址、子网、掩码
      第三行:MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节
      第四、五行:接收、发送数据包情况统计
      第七行:接收、发送数据字节数统计信息。
      
      ~ >: ifconfig wlan0 up
          phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
          phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
      ifconfig: SIOCSIFFLAGS: No such file or directory
      
      这时我们在使用RT2070的驱动时发现,RT2070的驱动还需要rt2870.bin这个系统固件(firmware)。
      
      1, Linux内核官方站点下载rt2870.bin这个系统固件
       I. PC上下载rt2870.bin这个系统固件:
      [guowenxue@centos6 ~]$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git
         [guowenxue@centos6 ~]$ ls -l linux-firmware/rt2870.bin
         -rw-rw-r-- 1 guowenxue guowenxue 8192 Dec 23 09:37 linux-firmware/rt2870.bin
      
      II. 在AT91SAM9260开发板上将rt2870.bin下载到/lib/firmware路径下,这时能重启网卡:
         /lib >: mkdir -p  /lib/firmware
         /lib >: cd firmware/
         /lib/firmware >: tget rt2870.bin
         rt2870.bin           100% |*******************************|  8192   0:00:00 ETA
         /lib/firmware >: ls
         rt2870.bin
        iwconfig命令来自下面交叉编译的wireless_tools程序
        ~ >: iwconfig wlan0   
      wlan0     IEEE 802.11bg  ESSID:off/any  
                Mode:Managed  Access Point: Not-Associated   Tx-Power=0 dBm   
                Retry  long limit:7   RTS thr:off   Fragment thr:off
                Encryption key:off
                Power Management:on
      
      ~ >: ifconfig wlan0 up
      phy1 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
      phy1 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29.
      phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.
      phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.
      phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
      phy1 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 5, CWmax: 10, Aifs: 7, TXop: 0.
      
      2, 下载/交叉编译wireless_tools的shell脚本,这些工具包括iwconfig, iwlist, iwpriv等:
      [guowenxue@centos6 wireless]$ ls
      openssl  wireless_tools  wpa_supplicant
      [guowenxue@centos6 wireless]$ cd wireless_tools/
      [guowenxue@centos6 wireless_tools]$ ls
      build.sh
      [guowenxue@centos6 wireless_tools]$ cat build.sh
      #!/bin/sh
      #+--------------------------------------------------------------------------------------------
      #|Description:  This shell script used to download tree wireless_tools code and cross compile it.
      #|     Author:  GuoWenxue <guowenxue@gmail.com>
      #|  ChangeLog:
      #|           1, Initialize 1.0.0 on 2011.11.23
      #+--------------------------------------------------------------------------------------------
      PRJ_PATH=`pwd`
      APP_NAME="wireless_tools.29"
      PACK_SUFIX="tar.gz"
      DL_ADDR="http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/$APP_NAME.$PACK_SUFIX"
      INST_PATH=${PRJ_PATH}/../mnt/usr/sbin/
      ARCH=arm926t
      CROSS=
      sup_arch=("" "arm926t" "arm920t" )
      function select_arch()
      {
         echo "Current support ARCH: "
         i=1
         len=${#sup_arch
  • }
         while [ $i -lt $len ]; do
           echo "$i: ${sup_arch[$i]}"
           let i++;
         done
         echo "Please select: "
         index=
         read index
         ARCH=${sup_arch[$index]}
      }
      function decompress_packet()
      (
         echo "+---------------------------------------------+"
         echo "|  Decompress $1 now"  
         echo "+---------------------------------------------+"
          ftype=`file "$1"`
          case "$ftype" in
             "$1: Zip archive"*)
                 unzip "$1" ;;
             "$1: gzip compressed"*)
                 if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
                     tar -xzf $1
                 else
                     gzip -d "$1"
                 fi ;;
             "$1: bzip2 compressed"*)
                 if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
                     tar -xjf $1
                 else
                     bunzip2 "$1"
                 fi ;;
             "$1: POSIX tar archive"*)
                 tar -xf "$1" ;;
             *)
                echo "$1 is unknow compress format";;
          esac
      )
      if [ -z $ARCH ] ; then
        select_arch
      fi
      if [ "arm920t" != $ARCH  -a "arm926t" != $ARCH ] ; then
          echo "+------------------------------------------------------------------+"
          echo "|  ERROR: Unsupport platform $ARCH to cross compile "  
          echo "+------------------------------------------------------------------+"
          exit -1;
      else
          CROSS="/opt/buildroot-2011.11/${ARCH}/usr/bin/arm-linux-"
      fi
      # Download source code packet
      if [ ! -s $APP_NAME.$PACK_SUFIX ] ; then
          echo "+------------------------------------------------------------------+"
          echo "|  Download $APP_NAME.$PACK_SUFIX now "  
          echo "+------------------------------------------------------------------+"
          wget $DL_ADDR
      fi
      # Decompress source code packet
      if [ ! -d $APP_NAME ] ; then
          decompress_packet $APP_NAME.$PACK_SUFIX
      fi
      echo "+------------------------------------------------------------------+"
      echo "|          Build $APP_NAME for $ARCH "
      echo "| Crosstool:  $CROSS"
      echo "+------------------------------------------------------------------+"
      cd $APP_NAME
         FILE=Makefile
         line=`sed -n '/^CC =/=' $FILE`
         sed -n "$line p" $FILE | grep "$CROSS"
         if [ 0 != $? ] ; then
             sed -i -e ${line}s"|.*|CC = ${CROSS}gcc|" $FILE
             line=`sed -n '/^AR =/=' $FILE`
             sed -i -e ${line}s"|.*|AR = ${CROSS}ar|" $FILE
             line=`sed -n '/^RANLIB =/=' $FILE`
             sed -i -e ${line}s"|.*|RANLIB = ${CROSS}ranlib|" $FILE
             line=`sed -n '/BUILD_STATIC =/=' $FILE`
             sed -i -e ${line}s"|.*|BUILD_STATIC = y|" $FILE
         fi
         make clean
         make
      cd -
      [guowenxue@centos6 wireless_tools]$ sh build.sh
      [guowenxue@centos6 wireless_tools]$ ls wireless_tools.29/
      ***  iwlist   ***  iwspy  ***  iwgetid  ***  iwconfig  ***
      ***  ifrename  ***  iwpriv  ***   iwevent  ***
      /****************************转载声明**********************************/
      3, 由于wpa_supplicant依赖openssl库,所以这里我们得先交叉编译openssl,在交叉编译之前,我们得把wpa_supplicant-0.7.3.tar.gz源码中的openssl的补丁给打了,参见下面的编译脚本:
      [guowenxue@centos6 wireless]$ cd openssl/
      [guowenxue@centos6 openssl]$ ls
      build.sh
      [guowenxue@centos6 openssl]$ cat build.sh
      #!/bin/sh
      #+--------------------------------------------------------------------------------------------
      #|Description:  This shell script used to download tree wireless_tools code and cross compile it.
      #|     Author:  GuoWenxue <guowenxue@gmail.com>
      #|  ChangeLog:
      #|           1, Initialize 1.0.0 on 2011.11.23
      #+--------------------------------------------------------------------------------------------
      PRJ_PATH=`pwd`
      APP_NAME="openssl-0.9.8i"
      PACK_SUFIX="tar.gz"
      DL_ADDR="http://www.openssl.org/source/$APP_NAME.$PACK_SUFIX"
      INST_PATH=$PRJ_PATH/install
      #INST_PATH=../install
      ARCH=arm926t
      CROSS=
      sup_arch=("" "arm926t" "arm920t" )
      function select_arch()
      {
         echo "Current support ARCH: "
         i=1
         len=${#sup_arch
  • }
         while [ $i -lt $len ]; do
           echo "$i: ${sup_arch[$i]}"
           let i++;
         done
         echo "Please select: "
         index=
         read index
         ARCH=${sup_arch[$index]}
      }
      function decompress_packet()
      (
         echo "+---------------------------------------------+"
         echo "|  Decompress $1 now"  
         echo "+---------------------------------------------+"
          ftype=`file "$1"`
          case "$ftype" in
             "$1: Zip archive"*)
                 unzip "$1" ;;
             "$1: gzip compressed"*)
                 if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
                     tar -xzf $1
                 else
                     gzip -d "$1"
                 fi ;;
             "$1: bzip2 compressed"*)
                 if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
                     tar -xjf $1
                 else
                     bunzip2 "$1"
                 fi ;;
             "$1: POSIX tar archive"*)
                 tar -xf "$1" ;;
             *)
                echo "$1 is unknow compress format";;
          esac
      )
      if [ -z $ARCH ] ; then
        select_arch
      fi
      if [ "arm920t" != $ARCH  -a "arm926t" != $ARCH ] ; then
          echo "+------------------------------------------------------------------+"
          echo "|  ERROR: Unsupport platform $ARCH to cross compile "  
          echo "+------------------------------------------------------------------+"
          exit -1;
      else
          CROSS="/opt/buildroot-2011.11/${ARCH}/usr/bin/arm-linux-"
      fi
      export CC=${CROSS}gcc
      export CXX=${CROSS}g++
      export AR=${CROSS}ar
      export AS=${CROSS}as
      export LD=${CROSS}ld
      export NM=${CROSS}nm
      export RANLIB=${CROSS}ranlib
      export STRIP=${CROSS}strip
      # Download source code packet
      if [ ! -s $APP_NAME.$PACK_SUFIX ] ; then
          echo "+------------------------------------------------------------------+"
          echo "|  Download $APP_NAME.$PACK_SUFIX now "  
          echo "+------------------------------------------------------------------+"
          wget $DL_ADDR
      fi
      # Decompress source code packet
      if [ ! -d $APP_NAME ] ; then
          decompress_packet $APP_NAME.$PACK_SUFIX
      fi
      if [ ! -d $INST_PATH ] ; then
          mkdir -p $INST_PATH
      else
          echo "$APP_NAME already cross compiled, exit now..."
          exit;
      fi
      echo "+------------------------------------------------------------------+"
      echo "|          Build $APP_NAME for $ARCH "
      echo "| Crosstool:  $CROSS"
      echo "+------------------------------------------------------------------+"
      cd $APP_NAME
         set –x
         #该补丁来自wpa_supplicant源码
         patch -p1 < ../patch/$APP_NAME-tls-extensions.patch
         #Modify the compiler
         FILE=Makefile
         line=`sed -n '/^CC= cc/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|CC = ${CROSS}gcc|" $FILE
         fi
         line=`sed -n '/^AR=ar/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|AR = ${CROSS}ar \$(ARFLAGS) r|" $FILE
         fi
      
         line=`sed -n '/^RANLIB= /=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|RANLIB = ${CROSS}ranlib|" $FILE
         fi
         #Support build shared library
         line=`sed -n '/^OPTIONS= /=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|OPTIONS=enable-shared no-camellia no-capieng no-cms no-gmp no-krb5 no-mdc2 no-montasm no-rc5 no-rfc3779 no-seed no-tlsext no-zlib no-zlib-dynamic|" $FILE
         fi
         line=`sed -n '/^SHLIB_EXT=/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|SHLIB_EXT=.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)|" $FILE
         fi
         line=`sed -n '/^SHLIB_TARGET/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|SHLIB_TARGET=linux-shared|" $FILE
         fi
         line=`sed -n '/^build_all:/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|build_all: build_libs build_apps build_tests build_tools build-shared|" $FILE
         fi
         #Modify install path
         line=`sed -n '/^INSTALLTOP=/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|INSTALLTOP = $INST_PATH|" $FILE
         fi
         line=`sed -n '/^OPENSSLDIR=/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|OPENSSLDIR = $INST_PATH|" $FILE
         fi
      
         make && make install
         #cp -af *.so* $INST_PATH/lib
      cd –
      [guowenxue@centos6 openssl]$ sh build.sh
      [guowenxue@centos6 openssl]$ ls
      build.sh  install  openssl-0.9.8i  openssl-0.9.8i.tar.gz  patch
      [guowenxue@centos6 openssl]$ ls install/
      bin  certs  include  lib  man  misc  openssl.cnf  private
      4, 下载交叉编译wpa_supplicant的脚本
      [guowenxue@centos6 wireless]$ cd wpa_supplicant/
      [guowenxue@centos6 wpa_supplicant]$ ls
      build.sh
      [guowenxue@centos6 openssl]$ cat build.sh
      #!/bin/sh
      #+--------------------------------------------------------------------------------------------
      #|Description:  This shell script used to download tree wireless_tools code and cross compile it.
      #|     Author:  GuoWenxue <guowenxue@gmail.com>
      #|  ChangeLog:
      #|           1, Initialize 1.0.0 on 2011.11.23
      #+--------------------------------------------------------------------------------------------
      PRJ_PATH=`pwd`
      APP_NAME="openssl-0.9.8i"
      PACK_SUFIX="tar.gz"
      DL_ADDR="http://www.openssl.org/source/$APP_NAME.$PACK_SUFIX"
      INST_PATH=$PRJ_PATH/install
      #INST_PATH=../install
      ARCH=arm926t
      CROSS=
      sup_arch=("" "arm926t" "arm920t" )
      function select_arch()
      {
         echo "Current support ARCH: "
         i=1
         len=${#sup_arch
  • }
         while [ $i -lt $len ]; do
           echo "$i: ${sup_arch[$i]}"
           let i++;
         done
         echo "Please select: "
         index=
         read index
         ARCH=${sup_arch[$index]}
      }
      function decompress_packet()
      (
         echo "+---------------------------------------------+"
         echo "|  Decompress $1 now"  
         echo "+---------------------------------------------+"
          ftype=`file "$1"`
          case "$ftype" in
             "$1: Zip archive"*)
                 unzip "$1" ;;
             "$1: gzip compressed"*)
                 if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
                     tar -xzf $1
                 else
                     gzip -d "$1"
                 fi ;;
             "$1: bzip2 compressed"*)
                 if [ 0 != `expr "$1" : ".*.tar.*" ` ] ; then
                     tar -xjf $1
                 else
                     bunzip2 "$1"
                 fi ;;
             "$1: POSIX tar archive"*)
                 tar -xf "$1" ;;
             *)
                echo "$1 is unknow compress format";;
          esac
      )
      if [ -z $ARCH ] ; then
        select_arch
      fi
      if [ "arm920t" != $ARCH  -a "arm926t" != $ARCH ] ; then
          echo "+------------------------------------------------------------------+"
          echo "|  ERROR: Unsupport platform $ARCH to cross compile "  
          echo "+------------------------------------------------------------------+"
          exit -1;
      else
          CROSS="/opt/buildroot-2011.11/${ARCH}/usr/bin/arm-linux-"
      fi
      export CC=${CROSS}gcc
      export CXX=${CROSS}g++
      export AR=${CROSS}ar
      export AS=${CROSS}as
      export LD=${CROSS}ld
      export NM=${CROSS}nm
      export RANLIB=${CROSS}ranlib
      export STRIP=${CROSS}strip
      # Download source code packet
      if [ ! -s $APP_NAME.$PACK_SUFIX ] ; then
          echo "+------------------------------------------------------------------+"
          echo "|  Download $APP_NAME.$PACK_SUFIX now "  
          echo "+------------------------------------------------------------------+"
          wget $DL_ADDR
      fi
      # Decompress source code packet
      if [ ! -d $APP_NAME ] ; then
          decompress_packet $APP_NAME.$PACK_SUFIX
      fi
      if [ ! -d $INST_PATH ] ; then
          mkdir -p $INST_PATH
      else
          echo "$APP_NAME already cross compiled, exit now..."
          exit;
      fi
      echo "+------------------------------------------------------------------+"
      echo "|          Build $APP_NAME for $ARCH "
      echo "| Crosstool:  $CROSS"
      echo "+------------------------------------------------------------------+"
      cd $APP_NAME
         set -x
         patch -p1 < ../patch/$APP_NAME-tls-extensions.patch
         #Modify the compiler
         FILE=Makefile
         line=`sed -n '/^CC= cc/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|CC = ${CROSS}gcc|" $FILE
         fi
         line=`sed -n '/^AR=ar/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|AR = ${CROSS}ar \$(ARFLAGS) r|" $FILE
         fi
      
         line=`sed -n '/^RANLIB= /=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|RANLIB = ${CROSS}ranlib|" $FILE
         fi
         #Support build shared library
         line=`sed -n '/^OPTIONS= /=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|OPTIONS=enable-shared no-camellia no-capieng no-cms no-gmp no-krb5 no-mdc2 no-montasm no-rc5 no-rfc3779 no-seed no-tlsext no-zlib no-zlib-dynamic|" $FILE
         fi
         line=`sed -n '/^SHLIB_EXT=/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|SHLIB_EXT=.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)|" $FILE
         fi
         line=`sed -n '/^SHLIB_TARGET/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|SHLIB_TARGET=linux-shared|" $FILE
         fi
         line=`sed -n '/^build_all:/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|build_all: build_libs build_apps build_tests build_tools build-shared|" $FILE
         fi
         #Modify install path
         line=`sed -n '/^INSTALLTOP=/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|INSTALLTOP = $INST_PATH|" $FILE
         fi
         line=`sed -n '/^OPENSSLDIR=/=' $FILE`
         if [ -n "$line" ] ; then
             sed -i -e ${line}s"|.*|OPENSSLDIR = $INST_PATH|" $FILE
         fi
      
         make && make install
         #cp -af *.so* $INST_PATH/lib
      cd –
      [guowenxue@centos6 wpa_supplicant]$ ls
      build.sh  wpa_supplicant-0.7.3  wpa_supplicant-0.7.3.tar.gz
      [guowenxue@centos6 wpa_supplicant]$ ls wpa_supplicant-0.7.3/wpa_supplicant/
      ***  wpa_supplicant  ***  wpa_cli      ***  wpa_passphrase   
      
      
      
      5, 安装上面交叉编译出来的一些二进制可执行文件到ARM开发板上:
      ~ >: ls /apps/tools/
      iwlist          wpa_passphrase        iwpriv        
      wpa_supplicant   iwconfig      
      
      使用wpa_passphrase创建wpa_supplicant的配置文件,使用加密后的密码,不用明文。当然使用明文密码也可以连接到无线路由器:
      ~ >: wpa_passphrase Router_Kernel password >> wpa_supplicant.conf
      ~ >: cat wpa_supplicant.conf
      network={
              ssid="Router_Kernel"
              #psk="password"
              psk=81a8c46543f339bbcd0381b4d7a13673d4e02f67108d978fb545435a15d95ea5
      }
      修改后的配置文件如下:
      ~ >: cat /apps/etc/wireless/wpa_supplicant.conf
      # WPA-PSK/TKIP
      # wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf
      ctrl_interface=/var/run/wpa_supplicant
      network={
              ssid="Router_Kernel"
              key_mgmt=WPA-PSK
              proto=WPA
              pairwise=TKIP
              group=TKIP
              #psk="password"  这里使用明文密码也可以
              psk=81a8c46543f339bbcd0381b4d7a13673d4e02f67108d978fb545435a15d95ea5
      }
      
      运行wpa_supplicant来连接无线路由器
      ~ >: wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf &
      Trying to associate with d8:5d:4c:18:04:7a (SSID='Router_Kernel' freq=2437 MHz)
      phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 2, CWmax: 3, Aifs: 2, TXop: 47.
      phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 94.
      phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 4, CWmax: 10, Aifs: 3, TXop: 0.
      phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 4, CWmax: 10, Aifs: 7, TXop: 0.
      Associated with d8:5d:4c:18:04:7a
      WPA: Key negotiation completed with d8:5d:4c:18:04:7a [PTK=TKIP GTK=TKIP]
      CTRL-EVENT-CONNECTED - Connection to d8:5d:4c:18:04:7a completed (auth) [id=0 id_str=]
      WPA: Group rekeying completed with d8:5d:4c:18:04:7a [GTK=TKIP]
      
      ~ >: iwconfig
      lo        no wireless extensions.
      eth0      no wireless extensions.
      eth1      no wireless extensions.
      wlan0     IEEE 802.11bg  ESSID:"Router_Kernel"  
                Mode:Managed  Frequency:2.437 GHz  Access Point: D8:5D:4C:18:04:7A   
                Bit Rate=1 Mb/s   Tx-Power=20 dBm   
                Retry  long limit:7   RTS thr:off   Fragment thr:off
                Encryption key:off
                Power Management:on
                Link Quality=69/70  Signal level=-41 dBm  
                Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
                Tx excessive retries:0  Invalid misc:49   Missed beacon:0
      
      ~ >: udhcpc -i wlan0
      udhcpc (v1.19.3) started
      Sending discover...
      Sending select for 192.168.1.100...
      Lease of 192.168.1.100 obtained, lease time 7200
      deleting routers
      route: SIOCDELRT: No such process
      adding dns 4.2.2.2
      adding dns 8.8.8.8
      ~ >: ifconfig wlan0
      wlan0     Link encap:Ethernet  HWaddr 00:E0:4C:D4:04:76  
                inet addr:192.168.1.100  Bcast:255.255.255.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:575 errors:0 dropped:0 overruns:0 frame:0
                TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:26672 (26.0 KiB)  TX bytes:1300 (1.2 KiB)
      
      ~ >: ifconfig eth1 down
      ~ >: ifconfig eth0 down
      ~ >: ifconfig
      lo        Link encap:Local Loopback  
                inet addr:127.0.0.1  Mask:255.0.0.0
                UP LOOPBACK RUNNING  MTU:16436  Metric:1
                RX packets:6 errors:0 dropped:0 overruns:0 frame:0
                TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0
                RX bytes:510 (510.0 B)  TX bytes:510 (510.0 B)
      wlan0     Link encap:Ethernet  HWaddr 00:E0:4C:D4:04:76  
                inet addr:192.168.1.100  Bcast:255.255.255.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:5521 errors:0 dropped:0 overruns:0 frame:0
                TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:244469 (238.7 KiB)  TX bytes:5454 (5.3 KiB)
      
      ~ >: ping 192.168.1.2
      PING 192.168.1.2 (192.168.1.2): 56 data bytes
      64 bytes from 192.168.1.2: seq=0 ttl=64 time=11.123 ms
      64 bytes from 192.168.1.2: seq=1 ttl=64 time=3.467 ms
      ^C
      --- 192.168.1.2 ping statistics ---
      3 packets transmitted, 2 packets received, 33% packet loss
      round-trip min/avg/max = 3.467/7.295/11.123 ms
      
      
      参考:  
      wpa_supplicant的编译,使用参考:
       http://blog.iyunv.com/farsight2009/article/details/5660878
       http://www.iyunv.com/Linux/2011-10/45202.htm
      http://www.cnblogs.com/zhuqing/archive/2011/04/06/2006763.html
       http://blog.chinaunix.net/space.php?uid=22915173&do=blog&id=88182
      
      
      
      
      
      
      

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-121038-1-1.html 上篇帖子: android 笔记 下篇帖子: python版本wifi共享工具
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表