您的位置:首页 > 运维架构 > Linux

基于Linux-2.6.35内核的wifi驱动移植

2013-03-27 14:11 483 查看

一、移植环境

1、 主机:Ubuntu11.10发行版

2、 目标机:FS_S5PC100平台

3、 交叉编译工具:arm-none-linux-gnueabi-4.5.1

4、wifi模块:marvell-8686(马维尔)

5、内核:linux-2.6.35

二、linux下内核环境的配置与修改

1.平台代码的修改

$ cd linux-2.6.35/drivers/mmc/host/

$ vim sdhci.c

屏蔽第629行的以下代码:

printK (KERN_WARING "%s: too largetimeout requested!\n", mmc_hostname(host_>mmc));

2.内核环境的配置

在S5PC100平台上需要内核驱动支持marvell-8686

$ cd linux-2.6.35

$ make menuconfig

[*] Networking support --->

[*] Wireless --->

<*>cfg80211 - wireless configuration API //cfg80211是新的Linux无线配置API,扩展无线设备需要配置

{*}common routines for IEEE 802.11 drivers//wifi需要无线 IEEE
802.11 标准的驱动程序例程

Device Drivers --->局域网

[*]Network device support --->

WirelessLAN --->

<*>Marvell8xxx Libertas WLAN driver support //增加 wifi模块marvell-8686驱动的支持

<*>Marvell Libertas 8385/8686/8688 SDIO 802.11b/g cards

GenericDriver Options --->

(sd8686.binsd8686_helper.bin) External firmware blobs to build into the kernel //将外设固件模块构建到内核中

(firmware)Firmware blobs root directory

3. 内核的修改

linux-2.6.35/arch/arm/mach-s5pc100/mach-smdkc100.c有内核的分区,把第2个分区即【2】改成8M,之所以改此处是因为生成的文件系统太大,大于4M。

如图1:



4. 固件准备

将固件sd8686.bin和sd8686_helper.bin拷贝到linux-2.6.35/firmware下。编译时会自动编译进内核。

$ make zImage

$ sudo cp zImage /tftpboot/

5.交叉工具链的安装
$ cd ~

$ tar xvf arm-none-linux-gnueabi.tar.bz2

$ cd arm-2010.09

如图2:



添加交叉工具链的环境变量

修改文件/etc/bash.bashrc添加如下内容:



重启配置文件



工具链测试



显示



三、openssl的移植(为网络通信提供安全及数据完整性的一种安全协议)

1.源码的选择

openssl-0.9.8e

2.补丁的安装

openssl源码编译需要打wpa_supplicant提供的补丁,我们选择的openssl版本为openssl-0.9.8e所以我们需要wpa_supplicant-0.7.2/patches/openssl-0.9.8e-tls-extensions.patch拷贝到openssl-0.9.8e文件夹源码下,将openssl-0.9.8e文件夹拷贝到linux@ubuntu:~/workdir/目录下

在/home/linux/下

$ mkdir workdir

$ cd workdir

$ mkdir wifi

$ cd wifi

linux@ubuntu:~/workdir/wifi$

linux@ubuntu:
~$ cd ~/workdir/openssl-0.9.8e

$ patch -p1 < openssl-0.9.8e-tls-extensions.patch //红色为数字1

3. 配置编译

进入opssl-0.9.8e目录,如图:



$ ./Configure linux-elf-arm -DL_ENDIAN linux:'arm-none-linux-gnueabi-gcc' shared --prefix=/home/linux/workdir/wifi/openssl //-DL_ENDIAN为定义小端

$ make

$ make install

没有错误的话,我们的openssl就移植成功了。

四、wpa_supplicant 的移植

1. 将wpa_supplicant-0.7.2.tar.gz 解压到$ ~/workdir/wifi目录下

$ cd ~/workdir/wifi/wpa_supplicant-0.7.2/wpa_supplicant
2.修改Makefile

$ vim Makefile

添加下面代码:

CC=arm-none-linux-gnueabi-gcc//自己的交叉编译工具

在CFLAGS+= -I../src

CFLAGS+= -I../src/utils

下添加:

CFLAGS+= -I/home/linux/workdir/wifi/openssl/include

将 LIBS+= -lssl

修改为 LIBS += -lssl-L/home/linux/workdir/wifi/openssl/lib/

将 LIBS_p+= -lcrypto

修改为LIBS_p += -lcrypto -L/home/linux/workdir/wifi/openssl/lib/

保存退出。

3.编译

$ cp defconfig .config

$ make

编译后将产生的wpa_supplicant和wpa_cli拷贝到根文件系统的bin目录下(/source/rootfs/bin)

注:关于 wpa_supplicant

wpa_supplicant本是开源项目源码,被谷歌修改后加入android移动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上的工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_supplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调动驱动来对WiFi芯片操作。 简单的说,wpa_supplicant就是WiFi驱动和用户的中转站外加对协议和加密认证的支持。


五、测试

1.修改配置文件

(1).在根文件中添加/etc/resolv.conf(/source/rootfs/etc/resolv.conf)

内容为:

#Generated by NetworkManager

nameserver192.168.0.1

(2).在根文件系统/etc(/source/rootfs/etc)下添加wpa_supplicant配置文件wpa-psk-tkip.conf

# WPA-PSK/TKIP

ctrl_interface=/var/run/wpa_supplicant

network={

ssid="XXXX" #无线路由用户名

key_mgmt=WPA-PSK

proto=WPA2

pairwise=CCMP

group= CCMP

psk="XXXXXXXX" #无线路由密码

}

(3).创建目录/var/run/wpa_supplicant

$ mkdir /var/run/wpa_supplicant -p

(4).启动开发板,进行测试。

配置无线网卡ip

# ifconfig wlan0 192.168.0.200

配置默认网关

# route add default gw 192.168.0.1

启动wpa_supplicant连接无线网络

# wpa_supplicant -B -iwlan0 -c/etc/wpa-psk-tkip.conf

wifi连接成功后led会亮起。

(5).查看连接状态

# wpa_cli status

(6).外网测试

# ping www.baidu.com

有返回包证明移植成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: