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網絡卡的驅動支援,
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程序。