基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植
一、移植环境:
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是只读文件系统,所以选择了jffs2文件系统,命令如下:
$ 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 400000\; 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不通的。
ping www.youku.com.cn
完成 !
基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植的更多相关文章
- 关于AM335X移植SDIO WIFI的简易教程(转)
最近应一个朋友邀请,帮他移植了SDIO WIFI到3.2版本内核.因为之前已经成功移植了3.14内核,所以整个过程花了一个下午就完成了.话不多说,先交待一下平台: CPU:TI AM3352 600M ...
- 一、基本的bash shell命令(基于Ubuntu实现)
一.基本的bash shell命令(基于Ubuntu实现) /etc/passwd文件包含了所有系统用户账户列表以及每个用户的基本配置信息. man命令 在想要查找的工具的名称前输入man命令,就可以 ...
- [转帖]查看ubuntu 各系统的内核版本
查看ubuntu 各系统的内核版本 https://www.cnblogs.com/ranxf/p/6923311.html /etc/issue /proc/version 1.查看ubuntu版本 ...
- 基于 Ubuntu 21.04 BPF 开发环境全攻略
本文地址:https://www.ebpf.top/post/ubuntu_2104_bpf_env 1. 系统安装 1.1 Vagrant Vagrant 是一款用于构建及配置虚拟开发环境的软件,基 ...
- 基于Ubuntu虚拟机安装edx-platform
基于Ubuntu虚拟机安装edx-platform 一. 前提准备 1. 虚拟机中安装Ubuntu12.04,然后再使用Vagrant方式搭建开发环境,请确保这个虚拟机可以使用2GB的内存,否则容 ...
- 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
原文网址:http://blog.csdn.net/gobitan/article/details/24367439 基于Ubuntu 14.04 LTS编译Android4.4.2源代码 ...
- 基于Ubuntu 14.04构建mysql5.6 Docker镜像
我们的目的是创建一个基于Ubuntu 14.04 的MySQL的 Docker Image,并且在新创建出来的容器里自动启动MySQL服务接受外部连接 步骤: 1. 首先创建一个目录并在目录下创建一个 ...
- MySQL 忘记root密码解决方法,基于Ubuntu 14.10
忘记MySQL root密码解决方法,基于Ubuntu 14.10 忘了mysql密码,从网上找到的解决方案记录在这里. 编辑mysql的配置文件/etc/mysql/my.cnf,在[mysqld] ...
- 做自己的docker镜像(基于ubuntu:16.04)
基于ubuntu:16.04 apt-get update -y apt-get install sudo -y 换源 sudo apt-get install vim sudo vim /etc/a ...
随机推荐
- ETL
1.ETL的定义 ETL分别是“Extract”.“ Transform” .“Load”三个单词的首字母缩写也就是“抽取”.“转换”.“装载”,但我们日常往往简称其为数据抽取. ETL是BI/DW ...
- POJ1154
LETTERS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8119 Accepted: 3661 Descripti ...
- 理解insert all/insert first的使用
在常用的SQL写法中我们会经常遇到把一个表的数据插入另外一张表的情况,这是一个insert into 表名 select .... from 表名 就可以解决了.但是如果是把一张表的数据同时插入两 ...
- html只允许输入的数据校验,只允许输入字母汉字数字等
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- BizTalk开发系列(二十一) Mapping 扩展开发
BizTalk Map编辑器提供了常用的功能块,比如数据库,字符串,数字计算等功能.可在设计Map时直接使用这些功能块进行扩展.除此之外对于进行复杂的Map处 理,Map 编辑器提供了扩展XSLT,扩 ...
- SVN 远程无法联通
远程花生壳搭建之后,配置在服务器iis上的其他的网站都能访问,局域网都可以,就是SVN远程连接不通. 没有搞过这样的问题,一下就不知道怎么办了.网上也没有人搞过,然后想到以前公司的一个大神搞过,然后请 ...
- 关闭SSMS的事务自动提交,改为手动提交
SQLServer 2005-2008-2012使用Oracle时,默认是手动提交.而SQLServer2005中,默认是自动提交,但是SQLServer支持配置. 方法: 用SSMS连接到SQL S ...
- IOS第18天(9,核心动画-动画组)
****动画组 // 核心动画都是假象,不能改变layer的真实属性的值// 展示的位置和实际的位置不同.实际位置永远在最开始位置 #import "HMViewController.h&q ...
- 微信H5页面分享
#jssdk.php <?php class JSSDK { private $appId; private $appSecret; public function __construct($a ...
- TF-IDF 文本相似度分析
前阵子做了一些IT opreation analysis的research,从产线上取了一些J2EE server运行状态的数据(CPU,Menory...),打算通过训练JVM的数据来建立分类模型, ...