學習目標:熟悉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
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_supplicant和wpa_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