S5pc100平台wifi模块驱动移植分析
- 格式:doc
- 大小:148.00 KB
- 文档页数:5
揭开芯面纱主流平板电脑方案深度剖析国内首选瑞芯微RK2818瑞芯微的RK2808大家一定不陌生,在年初时蓝魔出的第一款MID就是在这一芯片上运行的。
现在看来虽然仅仅600MHz的CPU稍显迟缓,与800MHz的iPod touch 3叫嚣有些妄言,但是为今后的蓝魔系列产品以及更多的国内厂家奠定了一个正确的方向。
在暑期结束后,瑞芯微推出了其升级版RK2818,也是目前瑞芯微运行速度最高的芯片,较之前作,其CPU升级到660MHz,内存也由之前的SDRAM升级到DDR2,并在此基础上增添了3D加速功能。
RK2818具备视频硬件加速,视频播放效果更好,在前者不能达到的分辨率支持上,最高可以支持1024x600分辨率。
当然,我们不得不正视的一点是ARM9核心也是有着极其脆弱的地方,内核的袖珍虽然将成本降低,省电固然是好,但是频率的升级始终是其最大的障碍,这就是为什么与touch相比在速度上总是输一大块的原因。
可喜的是瑞芯微RK2818的应用范围也不仅仅局限于MID方案之上,在智能手机、无线电子书方面均有其身影。
现在已经成熟运用在Android 2.1系统上,Android 2.2也是迟早的事。
据悉,及RK2818之后将会出品RK29系列,不知能否会给消费者更大的惊喜。
瑞芯微电子优点:国产芯片中最高配置,广泛应用于Android 2.1系统,增添3D加速功能。
缺点:CPU速度相比国际知名大厂来说较慢。
附芯片相关参数:1、采用ARM+DSP+GPU架构2、Android 2.1 R2(Eclair)操作系统3、MLC (2G~32GB) 24bit ECC(内存校验), DDRII(128MB~512MB)内存4、触屏支持800×480,800×600,1024×600分辨率5、支持 Wi-Fi interal,支持外置3G模块(TD,WCDMA,EVDO)6、USB 2.0接口,并支持 OTG功能7、支持YouTube等在线视频,最高可达720P8、支持HTML5 视频播放9、支持DC和VCR功能代表产品:蓝魔W9W9产品介绍:蓝魔W9机身三围为120mm*195mm*18.5mm,重300g。
s5pv210 uboot-2012-10的移植s5pv210 uboot-2012-10移植(一) 之分析Alex Ling的linaro-2011.10 for mini210好久好久前就买了s5pv210的开发板,一直都是东搞搞西搞搞,一点收获也没有,这次下决心来移植最新的uboot到u-boot-2012.10上,并通过这个博客记录下来以防时间长给忘了,我的开发板是QT210的。
s5pv210的启动分为BL0,BL1,BL2,BL0是出厂的时候就固化在IROM里的,所以我们的uboot就要实现BL1和BL2,BL1在uboot里叫做u-boot-spl.bin,BL2就是我们很熟悉的u-boot.bin了。
在移植之前,我们先看下Alex Ling 的linaro-2011.10 for mini210的UBOOT是怎么实现的。
这里主要还是分析SPL部分,u-boot.bin是如何生成的现在资料很多,也很复杂,我这个菜鸟也是一知半解的,所以就不分析了。
1.顶层的Makefile,从中可以知道,我们要想生成u-boot-spl.bin就必须配置COFNIG_SPL,那么u-boot-spl.bin依赖什么呢,我们继续[plain]view plaincopy1.ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin2.3.all: $(ALL-y)搜索发现,是进入到uboot顶层目录的spl目录下执行Makefile的[plain]view plaincopy1.$(obj)spl/u-boot-spl.bin: depend2. $(MAKE) -C spl all2.打开spl/Makefile分析,一开始就给我们导出CONFIG_SPL_BUILD[plain]view plaincopy1.CONFIG_SPL_BUILD := y2.export CONFIG_SPL_BUILD然后分析目标,因为我们的平台是三星的,所以,会有两个目标,一个是不带头信息的u-boot-spl.bin,一个是$(obj)$(BOARD)-spl.bin。
USB驱动移植教程一.USB驱动框架在Linux系统中,提供了主机侧和设备侧视角的USB驱动框架,这里,仅仅讲解主机侧角度看到的USB驱动框架。
从主机侧的角度而言,需要编写的USB驱动程序包括主机控制器驱动和设备驱动两类。
USB主机控制器驱动程序控制插入其中的USB设备,而USB设备驱动程序控制该设备如何作为设备与主机通信。
在USB主机控制器驱动和USB设备驱动之间还有一层叫USB核心层。
USB核心负责USB驱动管理和协议处理工作,它通过定义一些数据结构、宏和功能函数,向上为USB设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个系统的USB设备信息,完成设备热插拔控制、总线数据传输控制等。
说了那么多,无图无真相啊~~Linux USB主机侧驱动总体框架二.USB驱动移植步骤1.S5PV210主机控制驱动的移植USB主机控制器有3种规范,UHCI(Universal Host Controller Interface),这种规范主要是Intel、Via芯片公司提供支持PC主板的;OHCI(Open Host Controller Interface),这种规范是微软提出来的,主要应用在非PC系统上的嵌入式领域上的USB芯片;EHCI(Enhanced Host Controller Interface),这种后来为提高USB速度而提出的规范,它支持最高速度为480Mbps。
在《S5PV210_UM_REV1.1》手册上搜索OHCI关键词,会发现下面一段话这表明S5PV210这款CPU支持一个USB主机接口,同时支持EHCI和OHCI这两种规范,支持USB1.1和USB2.0规范,支持最高的外设传输速率为480Mbps。
注意了,它并不支持USB3.0规范的USB设备,所以做测试的时候,千万不要拿USB3.0规范的USB设备去测试。
2.1移植ohci-s5p驱动打开内核目录:driversusbhost,发现Linux系统提供了大量的主机控制器驱动,找遍所有平台,都没有找到ohci-s5p.c源码。
中断原理及应用---闵建有过裸机开发经验的工程师都很清楚中断的重要性。
学习一款处理器,异常处理机制可谓是其精髓所在,而硬件中断又是异常处理中的一种很典型并且使用很频繁的情况。
把握这一块内容需要大家明了两个方面的内容。
(1)处理器的异常处理机制(中断是处理器众多异常中的一种)(2)SOC对中断的硬件支持(中断控制器)接下来以三星公司生产的基于ARM 核为CORTEX-A8的SOC,型号为S5PC100, 来阐述下中断的原理及使用。
1.中断的概念。
中断,顾名思义,就是打断一个正在发生的事件。
其中包括三方面的内容:1 是打断当前的事件;2 处理紧急事件 3 回到之前打断的事件继续执行。
举个简单的例子,比如老师正在讲课,你有非常重要的事件需要老师帮你解决,于是你举手打断老师讲的内容去处理你的问题,老师解决了你的问题后又回到被打断前的内容接着往下讲。
由这个简单的例子你可以看出来一个完整的中断流程需要注意几个方面的问题:1 必须有一种途径能打断正在进行的事件(如学生举手);2 打断后必须能顺利的去执行一个更为紧迫的事件(如果多个学生都有问题的话,势必要定位哪个问题是哪个学生提出的,并且还要考虑多个学生同时申请问题的情况)3 怎么顺利返回去(老师回到之前讲课的内容)。
1.1 中断的产生先来解决第一个问题也就是中断怎么发生的,图1 经典ARM核内部框图上图为一款ARM核内部框图,注意看标红的部分。
ARM核会引出两根线,一根为IRQ中断线,一根为FIQ中断线。
由于IRQ 跟FIQ 在原理上相似,我们在这边不花篇幅去讲其区别,仅拿IRQ来描述中断的原理。
看到这里大家应该能明白什么情况下处理器核会接收到中断,注意仅仅是能接受到中断,能不能响应是另一码事。
为什么这么说呢?CPU核可能有的时候做的事情要比中断请求更为紧迫,比如刚加电做初始化的时候,这个时候如果这个管脚产生电平变化,可能ARM核也不会去管,也就是说在ARM内部把中断的功能给禁止掉。
linux下移植之WIFI驱动2010-05-14 22:271.前言硬件平台: imx27+sd8686软件平台: linux内核: 2.6.272.移植思想1, WIFI 模块本身和 cpu 之间的接口;我们的模块和 cpu 之间的接口是 sdio 的,也就是说必须要先保证SDIO 本身是工作的,与SD卡,MMC属于同类型。
主要用到这几个GPIO引脚SD0...SD3,SD2_CMD,SD2_CLK,以及复位引脚PB24.2, WIFI 模块本身的上电时序;模块都有它自己的规律,所以必须要根据 spec 了解它本身的上电过程,严格遵守;3,以太网接口的创建;我们的 WIFI 模块本身是建立在 SDIO 口之上的,而对上都是提供以太网接口的,所以必须要保证这个接口以及创建;4,特殊处理;不同的模块都有它特别的地方,比如我们用的是 8686 和 compo 也就是说它和蓝牙共用天线,所以需要在初始化的时候做特殊的处理,发送特殊的命令,才能工作;3.移植过程1,sdio本身是通过gpio口模拟的,所以需要对gpio口进行配置;static mfp_cfg_t littleton_mmc3_pins[] = {GPIO7_2_MMC3_DAT0,GPIO8_2_MMC3_DAT1,GPIO9_2_MMC3_DAT2,GPIO10_2_MMC3_DAT3,GPIO103_MMC3_CLK,GPIO105_MMC3_CMD,};2,wifi模块本身的初始化;#define MFP_WIFI_V18_ENABLE (GPIO26_GPIO)#define MFP_WLAN_RESETN (GPIO99_GPIO)#define WIFI_WAKEUP_HOST (GPIO104_GPIO) /*error must be changed*/#define WLAN_ENABLE_PIN 26#define WLAN_RESET_PIN 99#define M200_B#ifdef M200_B#define BT_RESET_PIN EXT1_GPIO(1)#define BT_RESET_GPIO (GPIO1_2_GPIO)#else#define BT_RESET_GPIO (GPIO6_2_GPIO)#define BT_RESET_PIN EXT1_GPIO(6)#endifstatic mfp_cfg_t lin2008_wifibt_pins[] = {MFP_WIFI_V18_ENABLE,MFP_WLAN_RESETN,WIFI_WAKEUP_HOST,/*wakeup host*/};static mfp_cfg_t lin2008_wifibt_pins2[] = {MFP_WIFI_V18_ENABLE,};static int wifibt_power_status;int lin2008_poweron_wifibt_board(void){if (!wifibt_power_status) {mxc_mfp_config(ARRAY_AND_SIZE(lin2008_wifibt_pins)) ;gpio_direction_output(WLAN_ENABLE_PIN, 1);gpio_direction_output(WLAN_RESET_PIN, 1);gpio_direction_output(BT_RESET_PIN,1);mdelay(10);gpio_direction_output(BT_RESET_PIN, 0);gpio_direction_output(WLAN_RESET_PIN, 0);// bt need > 5 ms to resetmdelay(5);gpio_direction_output(BT_RESET_PIN, 1);gpio_direction_output(WLAN_RESET_PIN, 1);wifibt_power_status++;return 0;}wifibt_power_status++;return 1;}int lin2008_poweroff_wifibt_board(void){wifibt_power_status--;if (!wifibt_power_status) {mxc_mfp_config(ARRAY_AND_SIZE(lin2008_wifibt_pins2) );gpio_direction_output(WLAN_ENABLE_PIN, 0);return 0;}return 1;}3,以太网接口的创建这里在 android 平台上要做特殊的处理,也就是 firmware 的位置要放好,否则加载 firmware 始终不成功,那么以太网接口就不会被创建了;需要把 helper_sd.bin 放在 /lib/firmware/mrvl 下面(若没有,则创建一个);把 sd8686.bin 放在 /lib/firmware/mrvl 下面(同上);4,特殊的处理对于 8686 模块需要做特殊的处理,在注册完以太网接口以后,需要添加下面这段话 :{#define BCA_CFG_NUM_OF_MODES 4#define BCA_CFG_SINGLE_ANT_WITH_COEX 0#define BCA_CFG_DUAL_ANT_WITH_COEX 1#define BCA_CFG_SINGLE_ANT_FOR_BT_ONLY 2#define BCA_CFG_MRVL_DEFAULT 3#define BCA_CONFIG BCA_CFG_SINGLE_ANT_WITH_COEXstatic u32 BCACfgTbl[BCA_CFG_NUM_OF_MODES][3] = {//0xA5F0, 0xA58C, 0xA5A0{ 0xa027181c, 0x40214, 0xd24d}, //Mode 0: Single ANT with COEX enable{ 0xa027181c, 0x40211, 0xd24d}, //Mode 1: Dual ANT with COEX enable{ 0xa027181c, 0x40222, 0xd21c}, //Mode 2: single ANT for BT only{ 0xa027801d, 0x18000, 0xd21c}, //Mode 3: Marvell default};wlan_offset_value RegBuffer;RegBuffer.offset = (0xA5F0);RegBuffer.value = BCACfgTbl[BCA_CONFIG][0];wlan_prepare_cmd(priv,HostCmd_CMD_MAC_REG_ACCESS,HostCmd_ACT_GEN_SET,HostCmd_OPTION_WAITFORRSP,0,&RegBuffer);RegBuffer.offset =(0xA58C);RegBuffer.value = BCACfgTbl[BCA_CONFIG][1];wlan_prepare_cmd(priv,HostCmd_CMD_MAC_REG_ACCESS,HostCmd_ACT_GEN_SET,HostCmd_OPTION_WAITFORRSP,0,&RegBuffer);RegBuffer.offset = (0xA5A0);RegBuffer.value = BCACfgTbl[BCA_CONFIG][2];wlan_prepare_cmd(priv,HostCmd_CMD_MAC_REG_ACCESS,HostCmd_ACT_GEN_SET,HostCmd_OPTION_WAITFORRSP,0,&RegBuffer);}基本上这样就可以工作了;4.其它问题Sdio 口默认是用的 3.2V 这里需要修改相关的地方强制设成是1.8V ,否则 SDIO 接口将无法工作;Linux平台上需要移植一些上层软件才能验证,比如iwconfig , iwlist 等。
嵌入式系统是物联网产业发展的核(作者:中嵌协会柏斯维)2009年8月7日**总理视察无锡时,提出在无锡加快建立“感知中国”中心的指示。
从此在国内不管是各级地方政府还是企业都很重视,并掀起了一个追逐物联网的行动热潮。
一年过去了,再一次的解读温总理的“感知中国”更具有现实意义和深远的历史意义。
嵌入式与物联网的关系温总理用经典的四个字“感知中国”全面描述和定义了物联网产业的内涵。
从字面上来理解,“感”既是信息采集(传感器);“知”信息处理(运算、处理、控制、通信并通过互联网进行信息传递和控制)。
这些都是嵌入式系统的特征实质。
如果归纳一句话来理解总理“感知中国”的含义,既是通过嵌入式系统智能终端产品网络化的过程实现感知的目的。
简单讲,物联网是物与物、人与物之间的信息传递与控制。
专业上讲就应该是智能终端的网络化。
大家都知道,嵌入式系统无所不在,有嵌入式系统的地方才会有物联网的应用。
所以,我在所有的场合都在传播一个理念,什么是物联网呢?物联网就是基于互联网的嵌入式系统。
从另一个意义也可以说,物联网的产生是嵌入式系统高速发展的必然产物,更多的嵌入式智能终端产品有了联网的需求,催生了物联网这个概念的产生。
记得是在09年10月12日,英特尔公司宣布成立中国研究院并且专攻嵌入式方向。
在全球热炒物联网概念时,英特尔为什么不成立物联网研究院?而专注嵌入式的研究呢。
这是值得深思研究的课题。
那么,在2010英特尔信息技术峰会(IDF)的前一天,英特尔CTO贾斯汀和英特尔研究院方之熙院长一起宣布了英特尔中国研究院全新的研究战略——致力于打造世界一流的嵌入式系统研究院。
方院长讲到:作为英特尔研究院全球5大节点之一,英特尔中国研究院将承担嵌入式系统的前瞻性研究任务,放眼全球嵌入式增长机遇,融合国人智慧做世界级的研究,并将国际水准的研究成果直接贡献于中国的发展。
中国手机、互联网、有线电视用户人数均居全球第一,也已成为名副其实的世界第一汽车市场。
驱动编程1 模块的概述 (2)2 source insight 加载内核源码方法 (2)3 模块makefile的编写 (3)4 模块makefile编写方法 (4)5 在X86上运行模块: (5)6 编写模块 (5)7 模块的加载进内核命令 (5)8 最简单的上层调用+ 调用驱动方法 (6)9 复杂框架上层应用+驱动调用方法 (7)10 复杂框架字符设备创建并注册过程 (7)11 file_operations常用函数 (9)12 同步互斥操作 (10)13 同步互斥函数总结 (10)14 阻塞IO编程流程 (11)15 轮询操作上层select 下层poll (12)16 信号处理 (12)17 中断 (13)18 中断新模型--上半部中断和下半部中断的实现 (14)19 内核定时器编程 (15)20 内核延时函数 (15)21 内核源代码中头文件分配方式 (15)22 linux内核管理和内核的内存管理 (16)23 设备io端口和io内存访问–如何控制led的亮灭 (16)24 * 驱动-设备分离思想编程————内核进阶 (18)25 驱动-设备分离-核心最小架构 (18)26 驱动设备分离思想- 上层架构(基于封装) (20)27 头文件总结 (24)28 设置系统自启动命令u-boot (24)第一天需要理清的东西1)模块的概念,模块与应用的区别2)模块主要的组成头文件、module_init() modoule_exit() module_lisence()3)模块的如何编辑,如何编译,如何加载到内核中运行使用makefile4)模块驱动编写,必须通过上层应用程序调用。
1模块的概述模块是内核的一部分,为了防止内核太大,把它放在文件系统里面。
也可以在编译内核的直接编译进内核。
1,存储位置可以在开始时编译进内核,也可以编译进模块,最后加载2、运行时环境在哪个内核树下编译,就对应这个运行环境3、模块的编译问题:前提条件是需要对应的内核源码树,或者必须有对应的内核版本匹配4、模块编译使用makefile 注意makefile的编写2source insight 加载内核源码方法在windows下创建工程,使用source insight查看内核代码:2.1 先将内核源码拷到对应的文件夹2.2 在source insight 里添加工程,筛选需要添加的文件注意选择按照树来添加,然后按照remove来踢出不需要的文件夹2.3 最后同步3模块makefile的编写模块的编译:1)、模块编译的核心语句:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules-C :进入内核源码树M= : 返回到当前目录,再次执行该目录下的makefileeg: /tnt/abc.c -----> abc.ko1、在/tnt目录下敲make,只有/tnt目录下的Makefile被调用2、目的是要进入到内核源码树中,一进一回,-C来进,M=带着内核源码树中的makefile的功能回来了-------内核源码树中Makefile的目标:obj-y:汇集了所有编译进内核的目标文件obj-m:汇集了所有编译成模块的目标文件3、回来过后,我们只有确定obj-m变量的集合4、make modules告诉内核的makefile,只做编译模块的功能4模块makefile编写方法ifeq ($(KERNELRELEASE),)KERNELDIR := /work/linux-2.6.35-farsightPWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesinstall:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean:rm -rf .tmp_versions *.ko *.o .*.cmd *.mod.c *.order *.symvers.PHONY: modules cleanelseobj-m := ex1.oendif以上是makefile的内容,●注意原来的内核目录树不要进行make clean 或者make distclean●KERNELDIR 表示模块加载在哪个内核的文件夹(又叫内核源码树),●$(MAKE) -C $(KERNELDIR) M=$(PWD) modules 表示进入该内核文件夹,将顶层makefile 中的内容带回,再重新执行一次该makefile 将obj-m := ex1.o 编译,并执行make modules (并只编译ex1.c ,不编译其它模块)●$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 表示执行顶层makefile的modules install 标签下的命令●安装的位置原来默认在/lib 下面,所以需要修改其到我们制作的根文件系统下/work/rootfs/在顶层Makefile位置搜索:MODLIB修改为:●obj-m := ex1.o 你需要编译的.c的文件名****************************此时简单的编译环境已经搭建完毕******************* ****************************执行make ***********************************************执行make install *******************在/work/rootfs/lib/modules/2.6.35/extra即可找到该模块.ko*****************************************************************************搭建好环境,保证虚拟机与板子与计算机网络连通,并设置板子u-boot 从nfs挂载,启动内核,并成功通过nfs 加载rootfs,此时环境完毕,进入/work/rootfs/lib/modules/2.6.35/extra ,找到模块,加载卸装模块操纵5在X86上运行模块:修改Makefile中的内核源码树的目录X86下的内核源码树:/lib/modules/2.6.35-22-generic/build如果没有在控制台上交互,默认是看不到信息的,需要dmesg这个命令去查看6编写模块模块最小组成如下:●注意:module_init module_exit 必须放在末尾●注意:函数的原型返回值●头文件7模块的加载进内核命令insmodrmmodlsmod8最简单的上层调用+ 调用驱动方法8.1 首先在module_init(abc) abc函数中注册设备register_chrdev(注册设备号,上层可见的设备名,操作封装)该函数完成设备注册,在板子上用cat /proc/devices 便可以看见该设备8.2 完成fops 操作的封装●注意格式●必须在函数后面声明该结构体●头文件#include <linux/fs.h>8.3 查看到该字符设备后,创建设备节点,则上层通过设备字符名与该设备号绑定mknod /dev/hf_char c 245 0ls /dev/ 可以查看注册的所有设备节点8.4 此时上层应用的open(”hf_char”,O_RDWR),即可完成该设备的打开,即可以完成上层应用于下层驱动相关fops 的操作。
S5pc100平台wifi模块驱动移植分析一、移植环境:1、主机:Ubuntu 10.10发行版2、目标机:FS_S5PC100平台3、交叉编译工具:arm-none-linux-gnueabi-4、wifi模块:marvell-86865、内核:linux-2.6.35---------------------------------------------------------------------二、在linux下的移植1. 平台代码修改内核驱动支持因为S5PC100平台上SDIO功能已经支持,所以只需要内核驱动支持marvell-8686即可。
由于wifi的接口种类有很多种,比如有usb接口wifi,串口接口wifi,sd卡接口wifi,sdio接口wifi,所以在移植wifi驱动时必须确保usb,串口,sd卡的驱动存在,取决于wifi 接口的类型。
S5pc100开发板上的wifi的接口是sdio接口的,所以在此之前必须移植号sdio 接口的驱动。
$ make menuconfig 修改:[*] Networking support --->[*] Wireless ---><*> cfg80211 - wireless configuration API{*} common routines for IEEE 802.11 driversDevice Drivers --->[*] Network device support --->Wireless LAN ---><*>Marvell 8xxx Libertas WLAN driver support<*> Marvell Libertas 8385/8686/8688 SDIO 802.11b/g cardsGeneric Driver Options --->(sd8686.bin sd8686_helper.bin) External firmware blobs to build into the kernel2. 内核的修改: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,},3. 固件的准备将固件sd8686.bin和sd8686_helper.bin拷贝到linux-2.6.35/firmware下。
编译时会自动编译进内核。
$ cp sd8686.bin linux-2.6.35/firmware/$ cp sd8686_helper.bin linux-2.6.35/firmware/$ make zImage$ sudo cp zImage /tftpboot由于wifi驱动在运行时需要两个工具,wpa_supplicant和wpa_cli,所以必须先制作这两个工具放到文件系统的bin目录下面。
三,文件系统的制作1. wpa_suppicant的移植源码版本选择:wpa_supplicant-0.7.3openssl-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-none-linux-gnueabi-- 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_supplicanta、Makefile修改$ vim Makefile修改#ifndef CCCC=gcc#endif为CC= arm-none-linux-gnueabi--gcc //自己的交叉编译工具链在CFLAGS += -I../srcCFLAGS += -I../src/utils下添加:CFLAGS += -I/home/linux/workdir/wifi/openssl/include//注意这是你自己安装wpa_supplicant 的路径下的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 -lcryptocollect2: ld returned 1 exit statusmake: *** [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/bin2. 文件系统的制作至此,wifi的驱动工作已经完成。
但是想正常的利用wifi来链接网络,还需要配置wifi。
Wifi配置:$ cd 文件系统a. 在根文件中添加/etc/resolv.conf,域名解析。
$ vim /etc/resolv.conf内容为:# Generated by NetworkManagernameserver 192.168.1.1 //你自己的无线路由的DNSnameserver 8.8.8.8 //此行可不写b. 在根文件系统/etc下添加wpa_supplicant配置文件wpa_supplicant.conf$ vim /etc/wpa_supplicant.conf内容为:# WPA-PSK/TKIPctrl_interface=/var/run/wpa_supplicantnetwork={ssid="XXXX" #无线路由ssidkey_mgmt=WPA-PSKproto=WPApairwise=TKIPgroup=TKIPpsk="XXXXXXXX" #无线路由密码}c. 创建目录/var/run/wpa_supplicant$ mkdir /var/run/wpa_supplicant –p四,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模块,就好了。