Linux学习笔记之wifi使用

 

一 Linux主要wifi模块

随着物联网的发展,现在嵌入式系统中接入wifi的应用越来越多。主流的wifi模块通常是USB或SDIO接口的。也有uart或spi接口,但由于其速度比较慢,本文就不讨论这两种接口的了。本文主要讨论USB和SDIO接口的wifi模块的使用。

NUC970平台既有USB接口,也有SDIO,通过这两个接口,都可以连接wifi模块。

USB接口的wifi模块有RTL8188、RT3070等。SDIO接口的wifi模块主要有RTL8189和Cypress(原博通)的BCM43xx系列。BCM43xx系列的wifi模块主要有AP6212(台湾正基)、cm256sm(AzureWave)、ALXC10(Alinket)等。

二 嵌入式linux平台wifi模块使用的主要工作

要在嵌入式平linux平台上使用wifi模块,需要做下面几方面的事情:

Ø 根据不同Wifi模块要求配置相应的内核项

Ø Wifi模块驱动的修改与编译

Ø Wifi使用相关工具的移植

Ø Wifi模块测试

2.1 wifi相关内核配置项

网络相关配置:

clip_image001

Wireless

clip_image002

Sdio接口驱动

clip_image003

Wifi驱动

clip_image005

2.2 wifi驱动的修改与编译

指定交叉编译器

修改接口相关的代码

编译驱动模块

2.3 wifi相关工具的移植

Wireless_tools编译

1.解压源文件

#tar xvf wireless_tools.30.pre9.tar.gz

2.修改Makefile,指定安装目录,修改一下编译器

PREFIX=/work/nuc970/emyard/wifi/install

## Compiler to use (modify this for cross compile).

CC = arm-linux-gcc

## Other tools you need to modify for cross compile (static lib only).

AR = arm-linux-ar

RANLIB = arm-linux-ranlib

3.编译安装

#make

#make install

wpa_supplicant编译

1.编译libnl

#tar xvf libnl-1.1.4.tar.gz

#./configure –host=arm-linux –prefix=/work/nuc970/emyard/wifi/install/nl

#make CC=arm-linux-gcc LD=arm-linux-ld AR=arm-linux-ar

#make install

2.编译openssl

#tar zxvf openssl-0.9.8za.tar.gz

分别解压wpa_supplicant-2.3.tar.gz和openssl-0.9.8za.tar.gz,把wpa_supplicant-2.3里面的patches文件夹下的openssl-0.9.8za-tls-extensions.patch文件拷贝到openssl-0.9.8za目录下,运行:
patch -p1 < openssl-0.9.8za-tls-extensions.patch

进入openssl-0.9.8za目录修改Makefile,修改如下:
CC=arm-linux-gcc
AR=arm-linux-ar$(ARFLAGS) r
RANLIB=arm-linux-ranlib
INSTALLTOP=刚才你建立的安装目录,要使用绝对路径,不然在make install的时候会出错
OPENSSLDIR=刚才你建立的安装目录,要使用绝对路径,不然在make install的时候会出错
然后,执行make&&make install。

3. wpa_supplicant编译

解压源文件

#tar xvf wpa_supplicant-2.3.tar.gz

进入wpa_supplicant目录

#cd wpa_supplicant-2.3/wpa_supplicant

#建立配置文件

#cp defconfig .config

修改.config文件增加一下内容:

CC=arm-linux-gcc

CFLAGS += -I/work/nuc970/emyard/wifi/install/nl/include -I/work/nuc970/emyard/wifi/install/ssl/include

LIBS += -L/work/nuc970/emyard/wifi/install/nl/lib -L/work/nuc970/emyard/wifi/install/ssl/lib

编译

#make

4.安装

将libnl库复制到跟文件系统的lib目录下

将wpa_cli、wpa_passphrase、wpa_supplicant复制到文件系统的usr目录下

三 在nuc970上使用AP6212

设备硬件:nuc972 evb

平台软件:nuc970bsp包,kernel从github下载https://github.com/OpenNuvoton/NUC970_Linux_Kernel

Wifi驱动包:bcmdhd_2016_5_11.tar.gz

3.1 交叉编译wifi驱动

1.将驱动文件解压到drivers/net/wireless目录下。

#cd drivers/net/wireless

#tar xvf <pathtowifidrivesource>/bcmdhd_2016_5_11.tar.gz

2.修改drivers/net/wireless下的Kconfig文件,添加下面一项:

source “drivers/net/wireless/b43legacy/Kconfig”

+source “drivers/net/wireless/bcmdhd/Kconfig”

source “drivers/net/wireless/brcm80211/Kconfig”

3.修改drivers/net/wireless下的Makefile文件,添加下面一项:

#add for AP6212

obj-$(CONFIG_BCMDHD) += bcmdhd/

4.配置wifi相关项

内容同上节

5.配置驱动相关项

clip_image006

6.编译驱动模块

#make moudles

编译出驱动模块bcmdhd.ko

3.2 安装驱动模块

1.将驱动文件复制到文件系统

#cp bcmdhd.ko <pathtorootfs>/rootfs/usr

2.复制固件到rootfs的system/etc/firmware

#mkdir <pathtorootfs>/rootfs/system/etc/firmware/

#cp fw_bcm43438a1.bin <pathtorootfs>/rootfs/system/etc/firmware/

#cp nvram.txt <pathtorootfs>/rootfs/system/etc/firmware/

3. 根据要连接的wifi建wpa_supplicant.conf

例如,我要连接的wifi的ssid是MF20_IPCAM,密码是:MF201234567890

ctrl_interface=/var/run/wpa_supplicant

ctrl_interface_group=0

update_config=1

ap_scan=1

network={

ssid=”MF20_IPCAM”

key_mgmt=WPA-PSK

proto=WPA2

pairwise=CCMP

psk=”MF201234567890″

}

3.3 测试wifi模块

1.插入wifi模块

2.加载驱动模块

#cd usr

#insmod bcmdhd.ko

3.打开wlan0设备

#ifconfig wlan0 up

4.连接到ssid

./wpa_supplicant -B -d -i wlan0 -c wpa_supplicant.conf

5.获取ip地址

#udhcpc -i wlan0

6. 用ping命令测试网络是否连通

#ping 192.168.1.1

四 在nuc970上使用ALXC10

该模块的编译及使用与ap6212类似,请参照上节。

五 在nuc970上使用CM256SM

设备硬件:nuc972 evb

平台软件:nuc970bsp包,kernel从github下载https://github.com/OpenNuvoton/NUC970_Linux_Kernel

Wifi驱动包:dhd-linux-1.363.125.7.tar

固件文件:bcm43455-7.45.100.9.bin、bcm_170607_nvram.txt

5.1 交叉编译wifi驱动

1.解压缩驱动文件

#tar xvf dhd-linux-1.363.125.7.tar

2. 修改驱动文件,主要修改下面几个文件:

#src/dhd/linux/Makefile

#src/dhd/sys/dhd_linux_platdev.c

3.编译驱动文件

#make dhd-cdc-sdmmc-android-nuc970-cfg80211-gpl

编译出驱动文件cywdhd.ko

5.2安装驱动文件

1.复制驱动文件cywdhd.ko到文件系统

#mkdir <pathtorootfs>/rootfs/usr/cm256sm

#cp bcmdhd.ko <pathtorootfs>/rootfs/usr/cm256sm

2.复制固件文件到文件系统

#cp bcm43455-7.45.100.9.bin <pathtorootfs>/rootfs/usr/cm256sm/bcm43455.bin

#cp bcm_170607_nvram.txt <pathtorootfs>/rootfs/usr/cm256sm/nvram.txt

3. 根据要连接的wifi建wpa_supplicant.conf

例如,我要连接的wifi的ssid是MF20_IPCAM,密码是:MF201234567890

ctrl_interface=/var/run/wpa_supplicant

ctrl_interface_group=0

update_config=1

ap_scan=1

network={

ssid=”MF20_IPCAM”

key_mgmt=WPA-PSK

proto=WPA2

pairwise=CCMP

psk=”MF201234567890″

}

5.3 测试wifi模块

1.插入wifi模块

2.加载驱动模块

#cd usr/cm256sm

#insmod cywdhd.ko firmware_path=/usr/cm256sm/bcm43455.bin nvram_path=/usr/cm256sm/nvram.txt

3.打开wlan0设备

#ifconfig wlan0 up

4.连接到ssid

./wpa_supplicant -B -d -i wlan0 -c wpa_supplicant.conf

5.获取ip地址

#udhcpc -i wlan0

6. 用ping命令测试网络是否连通

#ping 192.168.1.1