1. 程式人生 > >wifi網絡卡移植(RT3070 linux3.4.112)

wifi網絡卡移植(RT3070 linux3.4.112)

1、網絡卡選型

      首先在網上選擇一款usb免驅的wifi網絡卡,跟賣家確認網絡卡的VID,PID。

      在window下確認usb wifi的PID方法:將usb wifi插入電腦,開啟裝置管理器,如下圖

VID: 0x148F PID:0x3070

在linux中確認usb wifi的VID,PID方法:將usb wifi插入電腦,開啟虛擬機器,在右下角找到wifi網絡卡,右鍵連線

在ubuntu中用命令:lsusb檢視usb裝置。

VID: 0x148F PID:0x3070

通過PID檢視linux核心是否有這款wifI網絡卡的驅動支援,

http://wireless.kernel.org/en/users/Devices/USB搜尋

2、驅動移植

2.1、確認linux核心是否有這款usb wifi的驅動(如果沒有,則去http://wireless.kernel.org/en/users/Devices/USB搜尋並下載驅動)

切換到核心原始碼wifi驅動目錄目錄linux3.4.112/drivers/net/wireless,並搜尋0x3070。grep “0x3070” * -nR,結果如下:

檢視相應目錄下的Makefile檔案,drivers/net/wireless/rt2x00/Makefile

需要配置上CONFIG_RT2800USB,檢視該目錄下面的Kconfig檔案

config RT2800USB
        tristate "Ralink rt27xx/rt28xx/rt30xx (USB) support"
        depends on USB
        select RT2800_LIB
        select RT2X00_LIB_USB
        select RT2X00_LIB_FIRMWARE
        select RT2X00_LIB_CRYPTO
        select CRC_CCITT
        ---help---
          This adds support for rt27xx/rt28xx/rt30xx wireless chipset family.
          Supported chips: RT2770, RT2870 & RT3070, RT3071 & RT3072

          When compiled as a module, this driver will be called "rt2800usb.ko"

可知提示符為: "Ralink rt27xx/rt28xx/rt30xx (USB) support",切換到核心根目錄

2.2、切換到核心根目錄下,執行make menuconfig,配置核心,支援這款wifi

[*] 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

注:這裡將wifi驅動編譯為模組,是為了解決wifi網絡卡冷啟動問題(每次開啟啟動核心必須拔掉wifi網絡卡再插上才能工作,可以將模組加入到啟動腳本里,掛載檔案系統後加載模組)

2.3、make uImage -j2 && make modules,同時將編譯好的wifi驅動模組拷貝到nfs檔案系統

命令類似如下:

cp * ~/work/nfs/work/driver/wifi/

同時將wifi網絡卡韌體拷貝到根檔案系統的/lib/firmware,命令:

cp rt2870.bin ~/work/nfs/lib/firmware/

rt2870.bin:https://pan.baidu.com/s/1awcXpl2jfCsc1TY5sYObgw

2.4、將新核心下載到記憶體啟動,插入usb wifi網絡卡,使用lsusb檢視usb裝置

載入wifi驅動模組

#insmod rt2x00lib.ko

#insmod rt2x00usb.ko 

#insmod rt2800lib.ko

#insmod rt2800usb.ko 

出現如下資訊表示網絡卡識別成功

用ifconfig -a檢視網絡卡資訊

#ifconfig -a 

可見網絡卡無ip,還不能上網,需要一直wpa_supplicant,使用 wpa_supplicant提供的命令連線wifi'並上網

3、wpa_supplicant移植

3.1、所需檔案 

libnl-3.2.23.tar.gz :http://www.infradead.org/~tgr/libnl/files/libnl-3.2.23.tar.gz

openssl-1.0.1d.tar.gz:http://mirrors.ibiblio.org/openssl/source/old/1.0.1/openssl-1.0.1d.tar.gz

wpa_supplicant-2.0.tar.gz:http://w1.fi/releases/wpa_supplicant-2.0.tar.gz

3.2、交叉編譯libnl-3.2.23.tar.gz
#tar xzf libnl-3.2.23.tar.gz
#cd libnl-3.2.23/
#./configure --host=arm-linux --prefix=$PWD/tmp
#make
#make install
將編譯出的標頭檔案拷貝到交叉編譯器預設標頭檔案搜尋目錄下
#cd tmp/include/libnl3
#cp netlink /home/mark/work/tool/tool_chain/arm-cortex_a8-linux-gnueabi-4.9/lib/gcc/arm-cortex_a8-linux-gnueabi/4.9.4/include
將編譯出的庫檔案拷貝到交叉編譯器預設庫檔案搜尋目錄下
#cd ../../lib
#cp *so.* /home/mark/work/tool/tool_chain/arm-cortex_a8-linux-gnueabi-4.9/arm-cortex_a8-linux-gnueabi/lib
將編譯出的庫檔案拷貝到根檔案系統的lib目錄下
#cp *so.*  ~/work/nfs/lib/


3.2、交叉編譯openssl-1.0.1d.tar.gz
#tar xzf openssl-1.0.1d.tar.gz
#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
將編譯出的標頭檔案拷貝到交叉編譯器預設標頭檔案搜尋目錄下
#cd tmp/include/
#cp openssl /home/mark/work/tool/tool_chain/arm-cortex_a8-linux-gnueabi-4.9/lib/gcc/arm-cortex_a8-linux-gnueabi/4.9.4/include
將編譯出的庫檔案拷貝到交叉編譯器預設庫檔案搜尋目錄下
#cd ../lib
#cp *so.* /home/mark/work/tool/tool_chain/arm-cortex_a8-linux-gnueabi-4.9/arm-cortex_a8-linux-gnueabi/lib
將編譯出的庫檔案拷貝到根檔案系統的lib目錄下
#cp *so.*  ~/work/nfs/lib/

3.3、交叉編譯wpa_supplicant-2.0.tar.gz
#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 -j2
#make DESTDIR=$PWD/tmp install
#cd /tmp/usr/local/sbin/
將wpa_cli  wpa_passphrase  wpa_supplicant拷貝到根檔案系統的bin目錄
#cp * ~/work/nfs/bin
#find -name "*.conf"
#cp ./wpa_supplicant/examples/plaintext.conf ~/work/nfs/etc/plaintext.conf
 

4、使用wpa_supplicant
#vim ~/work/nfs/etc/plaintext.conf

# Plaintext (no encryption) network

ctrl_interface=/var/run/wpa_supplicant

network={
    ssid="TP-LINK_521"  #網路名
     psk="9876543219"   #密碼
}

#mkdir -p /var/run/wpa_supplicant
#wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
檢視網路狀態
wpa_cli -iwlan0 status

設定ip
#ifconfig wlan0 192.168.1.50
ping路由器
#ping 192.168.1.1

設定DNS和閘道器
修改/etc/resolv.conf新增DNS:
#nameserver 192.168.1.1
設定閘道器:
#route add default gw 192.168.1.1
訪問外網
#ping www.baidu.com

5、移植DHCP(動態獲取ip和自動設定DNS)
dhcp-4.2.5-P1.tar.gz:http://ftp.isc.org/isc/dhcp/4.2.5-P1/dhcp-4.2.5-P1.tar.gz
#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 [email protected] ${srcdir}/gen.c ${LIBS}
改為
gen: ${srcdir}/gen.c
        ${BUILD_CC} ${ALL_CFLAGS} ${LDFLAGS} -o [email protected] ${srcdir}/gen.c ${LIBS}
#cd ../..
#make -j2
#make DESTDIR=$PWD/tmp install
把檔案複製到NFS檔案系統
#cd /tmp/usr/local
# cp bin/* ~/work/nfs/bin/
# cp sbin/* ~/work/nfs/sbin/
# cp etc/dhclient.conf.example ~/work/nfs/etc/dhclient.conf
#cp etc/dhcpd.conf.example ~/work/nfs/etc/dhcpd.conf
6、使用DHCP動態獲取ip
啟動核心掛載根檔案系統
#wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
##wpa_cli -iwlan0 status
#dhclient -d wlan0


提示無法執行指令碼/etc/dhclient-script,沒有這個檔案
到dhcp-4.2.5-P1原始碼目錄下檢視是否有指令碼

#cd dhcp-4.2.5-P1/client/scripts/
#ls

#cp linux ~/work/nfs/etc/dhclient-script
修改dhclient-script
#!/bin/bash該為#!/bin/sh,因為嵌入式的shell為bin/sh
#dhclient -d wlan0
會提示無法建立/var/db/dhclient.leases, 此時需要手動建立目錄/var/db/
#mkdir -p /var/db
動態獲取ip,設定DNS,路由
#dhclient wlan0
#route

#cat /etc/resolv.conf

#ping www.baidu.com

成功訪問外網。

7、開機自動連線wifi
利用hotplug熱拔插機制,編寫mdev.conf配置檔案,當網絡卡載入時自動呼叫操作wifi的命令
#cd ~/work/nfs
#vim etc/mdev.conf
wlan0 0:0 777 * /sbin/auto_wifi.sh
上面這句話的意思:當載入驅動或者插入網絡卡時,觸發熱拔插機制
wlan0 :正則表示式選項,這裡直接填寫wlan0,嵌入式裝置一般只有一個網絡卡
0:0:使用者許可權:使用者組許可權
777:裝置檔案許可權
*:插入裝置和刪除裝置是都執行後面的命令
/sbin/auto_wifi.sh:命令
#vim /sbin/auto_wifi.sh



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


$ACTION:mdev機制裡的環境變數,當insmod 驅動或者插入usb裝置時等於add
上面的指令碼意思是插入裝置或者載入驅動時執行 wpa_supplicant -B -c/etc/plaintext.conf  -iwlan0和wpa_cli -a/sbin/wpa_action.sh -B,解除安裝模組和拔出usb裝置時殺死這三個程序。
wpa_cli -a/sbin/wpa_action.sh -B意思時:當連線上wifi和斷開wifi後呼叫/sbin/wpa_action.sh,類似於回撥函式機制
#vim sbin/wpa_action.sh


#!/bin/sh
IFNAME=$1
CMD=$2
if [ "$CMD" = "CONNECTED" ]; then
   dhclient $IFNAME
fi
if [ "$CMD" = "DISCONNECTED" ]; then
   killall dhclient
fi


IFNAME:網絡卡名,這裡為wlan0
CMD:CONNECTED或者DISCONNECTED
上面的意思是連線上wifi ap時執行dhclient wlan0,動態獲取ip,DNS, 閘道器,斷開wifi連線時,刪除dhclient程序。