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

學習目標:熟悉RT3070在S3C2440的移植和使用,以及其中的相關工具的安裝和使用;linux

1、配置內核選擇WIFI驅動shell

1. 將usb wifi插到電腦,在ubuntu使用命令:# lsusb 查看wifi的PID:0x148f, VID:0x3070ubuntu

2. 搭建環境bash

(使用的是arm-linux-gcc 4.3.2,內核爲:linux 3.4.2)網絡

1) 內核源碼打補丁less

 在終端執行如下命令:
 # 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 .configdom

2) 配置內核
    進入內核目錄,根據網卡的VID/PID肯定使用哪個源碼,搜索usb-wifi的 0x3070:
    # cd /work/system/linux-3.4.2/drivers/net/wireless
    # grep "0x3070" * -nRsocket

回覆--> 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/

2、 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不在一個網段;

3、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

相關文章
相關標籤/搜索