-
基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植
-
来源:博客、论坛 作者:lr_ting 日期:2012-07-05 点击次数
92
一、移植环境: 1、 主机:Ubuntu 10.10发行版 2、 目标机:FS_S5PC100平台 3、 交叉编译工具:arm-cortex_a8-linux-gnueabi 4、wifi模块:marvell-8686 5、内核:linux-2.6.35
--------------------------------------------------------------------- 二、在linux下的移植 1. 平台代码修改
$ vim driver/mmc/host/sdhci.c
屏蔽以下代码 629行:
//printK (KERN_WARING
"
%s: too large timeout requested!\n
", mmc_hostname(host_>mmc));
2. 内核驱动支持 因为S5PC100平台上SDIO功能已经支持,所以只需要内核驱动支持marvell-8686即可。
$ make menuconfig
修改:
[*] Networking support --->
[*] Wireless --->
<*> cfg80211 -
wireless configuration API {*} common routines
for IEEE
802.11
drivers Device Drivers --->
[*] Network device support --->
Wireless LAN --->
<*>
Marvell 8xxx Libertas WLAN driver support <*> Marvell Libertas
8385/
8686/
8688 SDIO
802.11b/
g cards Generic Driver Options --->
(sd8686.bin sd8686_helper.bin) External firmware blobs to build into the kernel (firmware) Firmware blobs root directory
3. 内核的修改 wifi的移植依赖于网卡驱动的移植和nand-flash平台的支持,可以参考linux-2.6.35内核移植—网卡驱动的添加和linux-2.6.35内核移植——Nand flash 驱动的添加,文件arch/arm/mach-s5pc100/mach-smdkc100.c下有内核的分区, 把第2个分区改成8M。因为生成的文件系统太大,大于4M。 修改如下(红色字体部分):
static
struct mtd_partition s5pc100_nand_part[] =
{ [
0] =
{ .name =
"
bootloader
"
, .size =
SZ_1M, .offset =
0
, }, [
1] =
{ .name =
"
kernel
"
, .size = SZ_1M *
4
, .offset =
MTDPART_OFS_APPEND, }, [
2] =
{ .name =
"
rootfs
"
, .size =
SZ_8M, .offset =
MTDPART_OFS_APPEND, }, [
3] =
{ .name =
"
usrfs
"
, .offset =
MTDPART_OFS_APPEND, .size =
MTDPART_SIZ_FULL, }, };
4. 固件准备 将固件sd8686.bin和sd8686_helper.bin拷贝到linux-2.6.35/firmware下。编译时会自动编译进内核。
此处两个文件sd8686.bin和sd8686_helper.bin,我本来想上传的,可是发现这里好像不能上传附件,所以就放到csdn上了,大家可以下载使用。
$ cp sd8686.bin linux-2.6.35/firmware/ $ cp sd8686_helper.bin linux-2.6.35/firmware/ $ make zImage $ sudo cp zImage /tftpboot
--------------------------------------------------------------------- 三、文件系统的制作
1. wpa_suppicant的移植
源码版本选择: wpa_supplicant-0.7.3 openssl-0.9.8e
[ openssl移植 ]:
a、补丁安装
openssl源码编译需要打wpa_supplicant提供的补丁,我们选择的openssl版本为openssl-0.9.8e所以我们需要
wpa_supplicant-0.7.3/patches/openssl-0.9.8e-tls-extensions.patch拷贝到
openssl源码下。
$ cp wpa_supplicant-0.7.3/patches/openssl-0.9.8e-tls-extensions.patch openssl-0.9.8e/
$ cd openssl-
0.9
.8e $ patch -p1 < openssl-
0.9.8e-tls-extensions.patch
注意:-p1,这里是数字“1”.
b、配置编译安装
$ ./Configure linux-elf-arm -DL_ENDIAN linux:
'
arm-cortex_a8-linux-gnueabi-gcc
' shared --prefix=/home/linux/workdir/wifi/openssl
打开openssl-0.9.8e中Makefile
$ vim Makefile
修改如下:
- CC=
cc + CC= arm-cortex_a8-linux-gnueabi-
gcc - AR=
ar $(ARFLAGS) r + AR= arm-cortex_a8-linux-gnueabi-
ar $(ARFLAGS) r - RANLIB= /usr/bin/
ranlib + RANLIB= arm-cortex_a8-linux-gnueabi-ranlib
编译:
$ make $ make install
[ wpa_supplicant移植 ]:
在/wpa_supplicant-0.7.3/wpa_supplicant目录下
$ cd wpa_supplicant-
0.7.
3/wpa_supplicant
a、Makefile修改
$ vim Makefile
修改 #ifndef CC CC=
gcc
#endif
为
CC=arm-cortex_a8-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/
b、编译
$ cp deconfig .config $ make
此处可能出题以下问题: /usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libssl.so when searching for -lssl /usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libssl.a when searching for -lssl /usr/bin/ld: cannot find -lssl /usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libcrypto.so when searching for -lcrypto /usr/bin/ld: skipping incompatible /usr/local/ssl/lib/libcrypto.a when searching for -lcrypto /usr/bin/ld: cannot find -lcrypto collect2: ld returned 1 exit status make: *** [wpa_supplicant] Error 1 解决方法如下:
方法1:可能你在修改wpa_supplicant-0.7.3/wpa_supplicant下Makefile的时候,将CC=gcc直接改为CC=arm-cortex_a8-linux-gnueabi-gcc,而没有按上面方式去掉#ifndef CC和#endif这两行。
方法2:需要先编译安装openssl库,确保两个编译都使用统一工具arm-cortex_a8-linux-gnueabi-gcc,这样只要把openssl和wpa_supplicant两个用同一个编译工具编译即可。
方法3:如果已经安装了openssl库,还出现如上问题,建议更新源,卸载后再装,如果有文件信赖关系不对,运行命令:sudo apt-get -f install.
注:方法1,亲测可行。方法2和3是我在移植的时候出现上面问题,在网上搜到的结果,好像不管用,在此帖出,以供参考。
最后,编译
$ make
后将生产的wpa_supplicant和wpa_cli拷贝到根文件系统的bin目录下
$ cp wpa_supplicant /source/rootfs/
bin $ cp wpa_cli /source/rootfs/bin
2. 文件系统的制作
此处可参考 llinux文件系统的移植-根文件系统制作和linux文件系统的移植-制作JFFS2文件系统
$ cd /source/rootfs/
a. 在根文件中添加/etc/resolv.conf,域名解析。
$ vim /etc/resolv.conf
内容为:
# Generated by NetworkManager nameserver
192.168.
1.1
//
你自己的无线路由的DNS
nameserver
8.8.
8.8
//
此行可不写
b. 在根文件系统/etc下添加wpa_supplicant配置文件wpa_supplicant.conf
$ vim /etc/wpa_supplicant.conf 内容为:
# WPA-PSK/
TKIP ctrl_interface=/
var/run/
wpa_supplicant network=
{ ssid=
"
XXXX
"
#无线路由ssid key_mgmt=WPA-
PSK proto=
WPA pairwise=
TKIP group=
TKIP psk=
"
XXXXXXXX
"
#无线路由密码 }
c. 创建目录/var/run/wpa_supplicant
$ mkdir /
var/run/wpa_supplicant -p
由于2.6.35的内核不支持yaffs文件系统,而cramfs是只读文件系统,所以选择了jffs文件系统,命令如下:
$ mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e
0x20000 --pad=
0x600000 -
n $ sudo cp rootfs.jffs2 /tftpboot
考虑到最终生成的文件系统比较大(5M多),所以--pad用的600000 --------------------------------------------------------------------- 四、测试 1. 移植u-boot
关闭开发板电源,将拨码开关SW1调至0001(usb启动模式)后打开电源
a) 加载运行USB Installer_DDR2.bin USB Port → Transmit → Transmit,选中image目录下的USB Installer_DDR2.bin

b) 加载运行u-boot-v45.0.bin USB Port ? Transmit ? Transmit,选中FS_S5PC100光盘v4.5\Linux-Android\image目录下的u-boot-v45.0.bin 串口终端下能看到如下内容(如果有倒计时数字,按任意键出现提示符)

c)设置并保存环境变量
# printenv
//
查看环境变量的值并按如下设置
# setenv baudrate
115200
# setenv ethaddr
11:
22:
33:
44:
55:
66# setenv gatewayip
192.168.
1.1
# setenv serverip
192.168.
1.237
//
serverip要和虚拟机的ip相同
# setenv ipaddr
192.168.
1.223
//
ipaddr也可以是192.168.1.x其他值
# setenv netmask
255.255.
255.0 # saveenv
d) 烧写u-boot-v45.0.bin到nand flash起始地址
# tftp
20008000 u-boot-v45.
0
.bin # nand erase
0
40000
; # nand write
20008000
0
40000
2. 移植内核
# tftp
20008000
zImage # nand erase
100000
400000
# nand write
20008000
100000
400000
3. 移植jffs2文件系统
# tftp
20008000
rootfs.jffs2 # nand erase
400000
800000
# nand write
20008000
500000
800000
4. 设置启动参数
# setenv bootdelay
3
# setenv bootcmd nand read
20008000
100000
300000\; bootm
20008000
# setenv bootargs root=/dev/mtdblock2 init=/linuxrc rootfstype=
jffs2 rw console=ttySAC0,
115200
# boot
--------------------------------------------------------------------- 五、 WIFI模块的测试 启动开发板完成如下操作: ● 配置无线网卡ip
# ifconfig wlan0
192.168.
1.200 # ifconfig -a

● 配置默认网关
# route add
default gw
192.168.
1.1
● 启动wpa_supplicant连接无线网络
# wpa_supplicant -B -iwlan0 -c /etc/wpa_supplicant.conf
问题:wifi libertas: problem fetching packet from firmware 解决:网上有好多解决方法,但都不适用我的情况,最后换了一个wifi模块,就好了。大家也可以看看是不是模块的问题。 ● 查看连接状态
# wpa_cli status

ping www.youku.com.cn

完成 !
本文地址: http://www./tech/system/359182.shtml #make 出现错误: ../src/drivers/driver_nl80211.c:25:31: fatal error: netlink/genl/genl.h: No such file or directory compilation terminated. make: *** [../src/drivers/driver_nl80211.o] Error 1 安装libnl-dev 和libpopt-dev后,编译成功。 注:一开始安装了wpa_supplicant-1.0,死活找不到/usr/include内的头文件,报类似上面的错误,最后退回到wpa_supplicant-0.7.3编译通过。 经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工
具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运
行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
|