---------------------------------------------------------------------------------------------------------------------------------
交叉編譯器:arm-linux-gcc-4.5.4
linux內核版本:linux-3.0
開發板:飛凌2440
作者:guanlei<[email protected]>
---------------------------------------------------------------------------------------------------------------------------------
一 :內核配置
參考的朋友注意:本文章是在2440開發板已經成果移植linux-3.0內核,usb驅動移植,DM9000網卡驅動和讀寫的文件系統,這裏使用的是jffs2.
從linux-3.0開始,RT3070的STA驅動已經作爲正式版本加入了Linux內核源碼中,本篇文章主要介紹如何在內核中編譯支持RT3070的STA模式驅動,並連接到我的無線路由器上去。
下面的在配置linux3.0內核支持rt3070,在內核中的menuconfig選中重要的一些配置。
[*] 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
二:插入RT2070無線網卡並加載新內核啓動
>: usb 1-1.4: new full speed USB device number 5 using s3c2410-ohci
usb 1-1.4: New USB device found, idVendor=13d3, idProduct=3273
usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.4: Product: 802.11 n WLAN
usb 1-1.4: Manufacturer: Ralink
usb 1-1.4: SerialNumber: 1.0
phy1 -> rt2x00_set_chip: Info - Chipset detected - rt: 3070, rf: 0005, rev: 0201.
>: ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr E0:B9:A5:41:9B:4D
UP 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地址)
第三,四行:接收、發送數據包情況統計
最後一行:接收、發送數據字節數統計信息
注意:這時伱敲ifconfig wlan0 up會出現錯誤
>: 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
按照上的錯誤信息我們可以知道缺少了 rt2870.bin,因爲RT3070的驅動還需要rt2870.bin這個系統固件(firmware)。
解決辦法:Linux內核官方站點下載rt2870.bin這個系統固件
git clone git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git
把那個系統固件下載到我們的開發板,
>:
tftp -gr rt2870.bin 192.168.1.110
rt2870.bin 100% |*******************************| 8192 0:00:00 ETA
把他放在/lib/firmware中這時再敲ifconfig wlan0 up
>:ifconfig wlan0 up
phy2 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
phy2 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29.
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.
phy2 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.
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: 5, CWmax: 10, Aifs: 7, TXop: 0.
三:無線網絡配置工具Wireless
tools和Wpa_supplicant以及Openssl移植
---------------------------------------------------------------------------------------------------------------------------------------------------------------
目前可以使用wireless-tools或wpa_supplicant工具來配置無線網絡。但要注意對無線網絡的配置是全局性的,而非針對具體的接口。wpa_supplicant是一個較好的選擇,但缺點是它不支持所有的驅動。另外,wpa_supplicant目前只能連接到那些你已經配置好ESSID的無線網絡。而wireless-tools支持幾乎所有的無線網卡和驅動,但它不能連接到那些只支持WPA的AP。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
(1)wireless_tools.29.tar.gz: 下載地址如下http://www.linuxfromscratch.org/blfs/view/svn/basicnet/wireless_tools.html
#tar zxvf wireless_tools.29.tar.gz
#cd wireless_tools.29
(2)修改makefile(紅色是修改的地方)
11 ## Compiler to use (modify this for cross compile).
12 CC =/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
13 ## Other tools you need to modify for cross compile (static lib only).
14 AR = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar
15 RANLIB =/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib
(3)#make
[guanlei@centos6 wireless_tools.29]$ ls
19-udev-ifrename.rules iftab.5 iwgetid.8 iwmulticall.c Makefile wireless.15.h
CHANGELOG.h INSTALL iwgetid.c iwpriv PCMCIA.txt wireless.16.h
COPYING iwconfig iwgetid.d iwpriv.8 README wireless.17.h
cs iwconfig.8 iwgetid.o iwpriv.c README.fr wireless.18.h
DISTRIBUTIONS.txt iwconfig.c iwlib.c iwpriv.d sample_enc.c wireless.19.h
fr iwconfig.d iwlib.d iwpriv.o sample_pm.c wireless.20.h
HOTPLUG.txt iwconfig.o iwlib.h iwspy sample_priv_addr.c wireless.21.h
ifrename iwevent iwlib.so iwspy.8 udev.import_devpath.diff wireless.22.h
ifrename.8 iwevent.8 iwlist iwspy.c wireless.10.h wireless.7
ifrename.c iwevent.c iwlist.8 iwspy.d wireless.11.h wireless.h
ifrename.d iwevent.d iwlist.c iwspy.o wireless.12.h
ifrename.o iwevent.o iwlist.d libiw.so.29 wireless.13.h
IFRENAME-VS-XXX.txt iwgetid iwlist.o macaddr.c wireless.14.h
會生成: iwlist、iwconfig、iwpriv,libiw.so.29 把工具和庫拷貝到你製作文件系統的/lib
,/bin目錄下並修改權限chmod a+x iw* libiw.so.29
2.Openssl工具和wpa_supplicant工具驅動移植
=========================================================================
以wpa_supplicant對我們來說除了配置無線網絡的需求之外,它更主要是用來支持WEP,WPA/WPA2和WAPI無線協議和加密認證的。而要加密就要使用到相關的加密算法,常用的密鑰等,由於wpa_supplicant依賴openssl庫,所以這裏我們得先交叉編譯openssl
=============================================================================
下載openssl源代碼:http://download.csdn.net/detail/u010944778/8918317
[guanlei@centos6 openssl-0.9.8i]$
mkdir install //編譯的文件放在這個文件中
29 INSTALLTOP=/home/guanlei/fl2440/3rdparty/rt3070/openssl-0.9.8i/install //指定ssl的安裝目錄
32 OPENSSLDIR=/home/guanlei/fl2440/3rdparty/rt3070/openssl-0.9.8i/install
62 CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
69 AR= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar
$(ARFLAGS) r
70 RANLIB= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib
完成上面的步驟之後。下面就要編譯了:
#sudo make
#sudo make install (這裏一定要用root權限,否者會出錯,顯示權限不夠)
#ls install/lib/
engines libcrypto.a libssl.a pkgconfig
拷貝libcrypto.a libssl.a到開發板的/lib下
3 下載wpa_supplicant源碼
http://w1.fi/releases/
#tar -xzf wpa-supplicant-0.7.3.tar.gz
[guanlei@centos6 wpa_supplicant-0.7.3]$ ls
COPYING patches README src wpa_supplicant
[guanlei@centos6 wpa_supplicant-0.7.3]$ cd wpa_supplicant/
[guanlei@centos6 wpa_supplicant-0.7.3] cp defconfig .config
[guanlei@centos6 wpa_supplicant-0.7.3]vim .config
修改如下:
27 #CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
28 CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
-L/home/guanlei/fl2440/3rdparty/rt3070/openssl-0.9.8i/install/lib
29 #CFLAGS += -Os
30 CFLAGS += -I/home/guanlei/fl2440/3rdparty/rt3070/openssl-0.9.8i/install/include
31 #CPPFLAGS += -I../src/include -I../../src/router/openssl/include
32 #LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
33 LIBS += -L/home/guanlei/fl2440/3rdparty/rt3070/openssl-0.9.8i/install/lib
修改之後下邊就是編譯
#make
[guanlei@centos6 wpa_supplicant]$ ls
ap.c config.o events.c preauth_test.c wpa_gui-qt4
ap.h config_ssid.h events.d README
wpa_passphrase
bgscan.c config_winreg.c events.o README-Windows.txt wpa_passphrase.c
bgscan.h ctrl_iface.c examples README-WPS wpa_passphrase.d
bgscan_simple.c ctrl_iface.d ibss_rsn.c scan.c wpa_passphrase.o
blacklist.c ctrl_iface.h ibss_rsn.h scan.d wpa_priv.c
blacklist.d ctrl_iface_named_pipe.c main.c scan.h wpas_glue.c
blacklist.h ctrl_iface.o main.d scan.o wpas_glue.d
blacklist.o ctrl_iface_udp.c main_none.c sme.c wpas_glue.h
bss.c ctrl_iface_unix.c main.o sme.h wpas_glue.o
bss.d ctrl_iface_unix.d main_symbian.cpp symbian
wpa_supplicant
bss.h ctrl_iface_unix.o main_winmain.c tests wpa_supplicant.c
bss.o dbus main_winsvc.c todo.txt wpa_supplicant.conf
ChangeLog defconfig Makefile vs2005 wpa_supplicant.d
config.c doc mlme.c win_example.reg wpa_supplicant_i.h
config.d driver_i.h mlme.h win_if_list.c wpa_supplicant.nsi
config_file.c eapol_test.c nmake.mak
wpa_cli wpa_supplicant.o
config_file.d eap_register.c notify.c wpa_cli.c wps_supplicant.c
config_file.o eap_register.d notify.d wpa_cli.d wps_supplicant.h
config.h eap_register.o notify.h wpa_cli.o xcode
config_none.c eap_testing.txt notify.o wpa_gui
[guanlei@centos6 wpa_supplicant]$
安裝上面交叉編譯出來的一些二進制可執行文件到ARM開發板上邊的(上邊的綠色文件就是要用的)
下面都是在開發板上完成的
我要用上的wpa_passphrase 工具來生成 wpa_supplicant.conf配置文件
wpa_passphrase ssid psk>>wpa_supplicant.conf (ssid就是你wifi的名字 psk就是密碼)
>: wpa_passphrase dashen xiguashaung >> wpa_supplicant.conf (我把密碼都暴露出去了!!)
修改後的配置文件如下: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="dashen"
key_mgmt=WPA-PSK //
加密模式 這裏一定要和的你要連的歪壞保持一致
proto=WPA
pairwise=TKIP CCMP
#group=TKIP CCMP //我把這裏註釋掉了,我的會莫名的出錯。。。現在還不清楚原因
psk="xiguashuang" //這裏我是使用的明文,你也可以使用加密之後的
#psk=f7c429c4e6d7e83ab648c83409ccffc53b331b58bfb69b5f6a35fa10c45cf8bf
}
雞凍人心的時候到了!!開始連接了
wpa_supplicant來連接無線路由器
>: wpa_supplicant -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf
Trying to associate with c8:e7:d8:08:b4:5a (SSID='dashen' freq=2462 MHz)
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 4, CWmax: 10, Aifs: 3, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 4, CWmax: 10, Aifs: 7, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 94.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 2, CWmax: 3, Aifs: 2, TXop: 47.
Associated with c8:e7:d8:08:b4:5a
WPA: Key negotiation completed with c8:e7:d8:08:b4:5a [PTK=CCMP GTK=CCMP]
CTRL-EVENT-CONNECTED - Connection to c8:e7:d8:08:b4:5a completed (auth) [id=0 id_str=]
(ps 上面的過程有點慢 請慢慢等待)
>: iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
wlan0 IEEE 802.11bgn ESSID:"dashen"
Mode:Managed Frequency:2.462 GHz Access Point: C8:E7:D8:08:B4:5A
Bit Rate=54 Mb/s Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
Link Quality=51/70 Signal level=-59 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:15 Invalid misc:25 Missed beacon:0
配置一下無線網卡IP和子網掩碼:
>:ifconfig wlan0 192.168.1.244
broatcast 192.168.1.1 netmask 255.255.255.0 up
這時你還可以測試一下 ping一下自己的主機 我的ip:192.168.1.102
>: ifconfig eth0 down
>: ping 192.168.1.102
PING 192.168.1.102 (192.168.1.102): 56 data bytes
64 bytes from 192.168.1.102: seq=0 ttl=64 time=11.123 ms
64 bytes from 192.168.1.102: seq=1 ttl=64 time=3.467 ms
如果你想上外網,那麼就要給開發板添加DNS域名解析服務!還有添加默認網關!
想ping外網的pay attention !!!
在開發板的/etc/創建一個resolv.conf的文件,因爲在內核啓動的時候內核會在resolv.conf文件中找dns
>: vi resolv.conf
#search localdomain
nameserver 4.2.2.2
nameserver 8.8.8.8
~
使能source resolv.conf
添加網關
>:route add default gw 192.168.1.1
現在就開始ping baidu!!!
>: ping www.baidu.com
PING www.baidu.com (103.235.46.39): 56 data bytes
64 bytes from 103.235.46.39: seq=0 ttl=50 time=303.388 ms
64 bytes from 103.235.46.39: seq=1 ttl=50 time=433.364 ms
64 bytes from 103.235.46.39: seq=2 ttl=50 time=450.342 ms
--- www.baidu.com ping statistics ---
文章並未完結,預知後事如何請看下次詳解