主機操作系統:Centos 6.7
交叉編譯器:arm-Linux-gcc-4.5.4
開發板:FL2440
系統內核:linux-3.0
STA模式:筆記本上無線網卡模式,用來連接到無線路由器上上網,就是客戶端模式(筆記本)
所以我們的驅動有兩種,分別支持無來線網卡工作在STA模式和AP模式。因爲linux3.0以上的內核中已經含有了RT3070的通用mac80211驅動框架,所以我首先直接基於此並藉助wpa_suppicant軟件來實現Wifi的STA模式。
一、配置Linux內核支持wireless無線上網
[*] Networking support --->
-*- Wireless --->
<*> cfg80211 - wireless configuration API
[ ] nl80211 testmode command
[ ] enable developer warnings
[ ] cfg80211 regulatory debugging
[*] enable powersave by default
[ ] cfg80211 DebugFS entries
[*] cfg80211 wireless extensions compatibility
[*] Wireless extensions sysfs files
{*} Common routines for IEEE802.11 drivers
[ ] lib80211 debugging messages
<*> Generic IEEE 802.11 Networking Stack (mac80211)
Default rate control algorithm (Minstrel) --->
[ ] Enable mac80211 mesh networking (pre-802.11s) support
[ ] Export mac80211 internals in DebugFS
[ ] 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
[ ] Driver Core verbose debug messages
[ ] Managed device resources verbose debug messages
[*] Network device support --->
[*] Wireless LAN --->
<*> 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
===================================================================
目前可以使用wireless-tools或wpa_supplicant工具來配置無線網絡。但要注意對無線網絡的配置是全局性的,而非針對具體的接口。wpa_supplicant是一個較好的選擇,但缺點是它不支持所有的驅動。另外,wpa_supplicant目前只能連接到那些你已經配置好ESSID的無線網絡。而wireless-tools支持幾乎所有的無線網卡和驅動,但它不能連接到那些只支持WPA的AP。
===================================================================
wireless_tools.29.tar.gz
http://download.csdn.net/detail/u010944778/8916883
1.2解壓
#tar zxvf wireless_tools.29.tar.gz
#cd wireless_tools.29
1.4編譯
[hongfuhao@centos6 wireless_tools.29]$ ls
19-udev-ifrename.rules iwconfig.o iwlist.o sample_pm.c
CHANGELOG.h iwevent iwmulticall.c sample_priv_addr.c
COPYING iwevent.8 iwpriv udev.import_devpath.diff
cs iwevent.c iwpriv.8 wireless.10.h
DISTRIBUTIONS.txt iwevent.d iwpriv.c wireless.11.h
fr iwevent.o iwpriv.d wireless.12.h
HOTPLUG.txt iwgetid iwpriv.o wireless.13.h
ifrename iwgetid.8 iwspy wireless.14.h
ifrename.8 iwgetid.c iwspy.8 wireless.15.h
ifrename.c iwgetid.d iwspy.c wireless.16.h
ifrename.d iwgetid.o iwspy.d wireless.17.h
ifrename.o iwlib.c iwspy.o wireless.18.h
IFRENAME-VS-XXX.txt iwlib.d libiw.so.29 wireless.19.h
iftab.5 iwlib.h macaddr.c wireless.20.h
INSTALL iwlib.so Makefile wireless.21.h
iwconfig iwlist PCMCIA.txt wireless.22.h
iwconfig.8 iwlist.8 README wireless.7
iwconfig.c iwlist.c README.fr wireless.h
iwconfig.d iwlist.d sample_enc.c
1.5拷貝
將生成的命令工具:iwlist、iwconfig、iwpriv,libiw.so.29 等拷貝到目標板上,路徑爲:分別把他們放到開發板的/bin和/lib目錄下,並賦予權限
chmod 777 iw* libiw.so.29
2.Openssl工具移植
===================================================================
現在的wifi網絡肯定都是加密的。而大多都是WPA加密,所以wpa_supplicant對我們來說除了配置無線網絡的需求之外,它更主要是用來支持WEP,WPA/WPA2和WAPI無線協議和加密認證的。而要加密就要使用到相關的加密算法,常用的密鑰等,所以我們要先移植Openssl工具再移植wpa-supplicant。因爲後面編譯wpa_supplicant要依賴openssl中的lib和include
===================================================================
2.1下載openssl驅動源碼
http://download.csdn.net/detail/u010944778/8918317
2 .2解壓後創建指定的安裝目錄
[hongfuhao@centos6 openssl-0.9.8i]$ mkdir install
2.3修改Makefile
2.4編譯
[hongfuhao@centos6 openssl-0.9.8i]$sudo make
[hongfuhao@centos6 openssl-0.9.8i]$sudo make install
並拷貝libcrypto.a ; libssl.a到開發板的/lib下
3.wpa_supplicant驅動移植
3.1下載wpa_supplicant源碼
wpa_supplicant-0.7.3.tar.gz
http://download.csdn.NET/detail/u010944778/8918325
3.2解壓後修改.config配置文件
[hongfuhao@centos6 wpa_supplicant-0.7.3]$ ls
COPYING patches README src wpa_supplicant
[hongfuhao@centos6 wpa_supplicant-0.7.3]$ cd wpa_supplicant/
[hongfuhao@centos6 wpa_supplicant]$ cp defconfig .config
[hongfuhao@centos6 wpa_supplicant]$ vim .config
[hongfuhao@centos6 wpa_supplicant]$ make
然後將wpa_cli,wpa_supplicant,wpa_passphrase拷貝到開發板的/bin目錄下切記wpa_cli,wpa_supplicant,wpa_passphrase都要給777權限!!!!
三.插上RT2070無線網卡並加載新內核啓動
>內核信息打印部分
>: usb 1-1.2: new full speed USB device number 3 using s3c2410-ohci
phy0 -> rt2x00_set_chip: Info - Chipset detected - rt: 3070, rf: 0005, rev: 0201.
>使用lsusb命令查看:
>: lsusb
Bus 001 Device 001: ID 1d6b:0001
Bus 001 Device 002: ID 05e3:0606
Bus 001 Device 003: ID 148f:3070
>如果是熱插拔的話會,在插入的那一刻,串口會打印如下信息:
>: usb 1-1.2: USB disconnect, device number 3
usb 1-1.2: new full speed USB device number 4 using s3c2410-ohci
phy1 -> rt2x00_set_chip: Info - Chipset detected - rt: 3070, rf: 0005, rev: 0201.
>ifconfig查看網卡信息
>: ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 00:A1:B0:40:6E:F7
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地址)
第三行:MULTICAST(支持組播)MTU:1500(最大傳輸單元):1500字節
第四、五行:接收、發送數據包情況統計
第七行:接收、發送數據字節數統計信息
>使能RT3070無線網卡模塊
>: cd lib/
>: mkdir firmware
>: cd firmware/
>: tftp -gr rt2870.bin 192.168.1.2
rt2870.bin 100% |*******************************| 8192 0:00:00 ETA
>: ifconfig wlan0 up
phy1 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
phy1 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36.
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.
>: cd apps/
>: ls
>:mkdir etc
>:cd etc
>:mkdir wireless
>:cd wireless
在開發板上輸入命令:wpa_passphrase ssid psk>>wpa_supplicant.conf (ssid就是你wifi的名字 psk就是密碼)
例如:
>: wpa_passphrase fuhaogege>>wpa_supplicant.conf
修改我的配置文件:
>: vi wpa_supplicant.conf
五.連接你的路由器:
>: wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf &
>:Trying to associate with d4:ee:07:22:6b:5c (SSID='HiWiFi_LingYun' freq=2417 MHz)
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 4, CWmax: 10, Aifs: 7, TXop: 0.
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 0 - CWmin: 2, CWmax: 3, Aifs: 2, TXop: 47.
Associated with d4:ee:07:22:6b:5c
WPA: Key negotiation completed with d4:ee:07:22:6b:5c [PTK=CCMP GTK=CCMP]
CTRL-EVENT-CONNECTED - Connection to d4:ee:07:22:6b:5c completed (auth) [id=0 id_str=]
設置你的無限網卡IP和子網掩碼
>: ifconfig wlan0 192.168.199.234 netmask 255.255.255.0
你可以ping一下你的主機IP(192.168.199.1是我的主機IP)
>: ping 192.168.199.1
PING 192.168.199.1 (192.168.199.1): 56 data bytes
64 bytes from 192.168.199.1: seq=0 ttl=64 time=56.992 ms
64 bytes from 192.168.199.1: seq=2 ttl=64 time=45.916 ms
64 bytes from 192.168.199.1: seq=3 ttl=64 time=47.709 ms
64 bytes from 192.168.199.1: seq=4 ttl=64 time=47.760 ms
64 bytes from 192.168.199.1: seq=5 ttl=64 time=46.920 ms
64 bytes from 192.168.199.1: seq=6 ttl=64 time=47.732 ms
64 bytes from 192.168.199.1: seq=7 ttl=64 time=45.949 ms
64 bytes from 192.168.199.1: seq=8 ttl=64 time=50.674 ms
64 bytes from 192.168.199.1: seq=9 ttl=64 time=50.893 ms
64 bytes from 192.168.199.1: seq=10 ttl=64 time=45.923 ms
64 bytes from 192.168.199.1: seq=11 ttl=64 time=45.972 ms
64 bytes from 192.168.199.1: seq=12 ttl=64 time=45.994 ms
64 bytes from 192.168.199.1: seq=13 ttl=64 time=46.058 ms
64 bytes from 192.168.199.1: seq=14 ttl=64 time=45.983 ms
64 bytes from 192.168.199.1: seq=15 ttl=64 time=46.060 ms
64 bytes from 192.168.199.1: seq=16 ttl=64 time=46.877 ms
Ping自己的主機不好玩,那我們來試試外網的鏈接
在開發板目錄/etc/創建一個resolv.conf的文件,因爲在內核啓動的時候內核會在
resolv.conf文件中找dns
>: vi resolv.conf
#search localdomain
nameserver 4.2.2.2
nameserver 8.8.8.8
添加網關後試試
>: route add default gw 192.168.199.1
>: ping www.baidu.com
PING www.baidu.com (119.75.217.109): 56 data bytes
64 bytes from 119.75.217.109: seq=0 ttl=53 time=25.603 ms
64 bytes from 119.75.217.109: seq=1 ttl=53 time=65.629 ms
64 bytes from 119.75.217.109: seq=2 ttl=53 time=77.645 ms
64 bytes from 119.75.217.109: seq=3 ttl=53 time=66.636 ms
64 bytes from 119.75.217.109: seq=4 ttl=53 time=67.671 ms
遇到的問題:
問題一:
>: 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
通常情況下,load firmware的動作是通過用戶空間的hotplug handler,也就是/proc/sys/kernel/hotplug裏設定的執行檔,來完成。root_qtopia默認會在/etc/init.d/rcS裏將/proc/sys/kernel/hotplug設定爲/sbin/mdev,即busybox的mdev模塊。它在收到來自內核的請求加載rt73.bin這個firmware消息後,會從/lib/firmware目錄下去找rt73.bin,如果能找到就加載。
解決方法:
將下載好的固件RT2870.bin放入/lib文件下新創建的firmware目錄中就可以解決。
問題二:
>: wpa_passphrase CMCC 2b2072b207 >> wpa_supplicant.conf
-sh: wpa_passphrase: Permission denied
解決方法:
>: ll wpa_passphrase
-rw-r--r-- 1 root root 474555 Dec 31 17:06 wpa_passphrase
>: chmod 777 wpa_passphrase
>: ll wpa_passphrase
-rwxrwxrwx 1 root root 474555 Dec 31 17:06 wpa_passphrase