分享

基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植

 WUCANADA 2013-05-10
基于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.binsd8686_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来搜索、设置、和连接网络。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多