现在的位置: 首页 > 综合 > 正文

基于Android的SDIO-WIFI移植

2013年04月02日 ⁄ 综合 ⁄ 共 7866字 ⁄ 字号 评论关闭

 一、SDIO 设备驱动移植
        很不巧内核已经“被”支持了,我就先不费这事了。
二、配置内核以支持Marvel无线WIFI
在这里我编译成模块的方式:

     Device Drivers  ---> 
            [*] Network device support  ---> 
                    Wireless LAN  --->  
                            <M>   Marvell 8xxx Libertas WLAN driver support 
                            <M>     Marvell Libertas 8385 and 8686 SDIO

802.11b/g cards 
     [*] Networking support  ---> 
                    [*]   Wireless  --->  
                            <*>   Improved wireless configuration API   
                            [*]     cfg80211 regulatory debugging   
                            [*]     nl80211 new netlink interface support    
                            {*}   Common routines for IEEE802.11 drivers 

       配置好后执行:make zImage 然后,make
modules
以生成我们要的驱动模块。把编译好的drivers/net/wireless/libertas/目下的驱动模块文件libertas.ko和libertas_sdio.ko复制到Android文件系统下的/system/lib/modules/目录下。后面发现根文件系统里面也“被”支持了,很郁闷!
三、放置好固件
      创建firmware路劲为/system/etc/firmware目录,把helper_sd.bin,sd8686.bin移动至/system/etc/firmware下面,并更改helper_sd.bin为sd8686_helper.bin
#mkdir /system/etc/firmware
#mv /helper_sd.bin sd8686.bin /system/etc/firmware/
#cd /system/etc/firmware
#mv helper_sd.bin sd8686_helper.bin

使用如下加载方法:
insmod /system/lib/modules/libertas.ko
insmod /system/lib/modules/libertas_sdio.ko

libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
此时:ifconfig -a
查看有没有创建wlan0这个设备节点,若没有驱动好网卡,再次热插拔一下就好

 # err = -123
mmc1: new SDIO card at address 0001
__func__ = if_sdio_prog_helper
libertas_sdio mmc1:0001:1: firmware: requesting sd8686_helper.bin
init: untracked pid 2074 exited
libertas_sdio mmc1:0001:1: firmware: requesting sd8686.bin
init: untracked pid 2077 exited
libertas: 00:0b:6c:89:62:4b, fw 9.70.3p23, cap 0x00000303
……
四、手动连接AP
        首先得在Android上移植好无线工具,和FS2410类似(可参考我有关介绍Android上移植无线工具iwconfig、iwlist等)。
移植好无线工具后便可以测试了:
ifconfig -a      查看是否有wlan0 网络节点。
利用无线工具连接:
ifconfig wlan0 up      
iwlist wlan0 scanning
iwconfig wlan0 essid "FS2410"
ifconfig wlan0 192.168.1.99 netmask 255.255.255.0 up
 
这时可以执行:
ping 192.168.1.1&

64 bytes from 192.168.1.1: seq=0 ttl=64 time=2.247 ms
64 bytes from 192.168.1.1: seq=1 ttl=64 time=1.900 ms
……
(可以kill -9 pid 结束进程)

五、自动连接AP,Android方式
    ……(下一节)

1)项目概述

2)Android SDIO WIFI移植

3)Android WIFI 框架分析

4)SDIO WIFI驱动分析

一、项目概述:

         Android 3G平板电脑功能介绍:该系统为手持移动终端,其底层硬件采用ARM来实现,搭载谷歌的Android操作系统。支持多点触摸屏、通过WIFI实现联网、蓝牙数据传输、摄像头、USB接口、SD卡接口、重力感应系统、实物键盘。在本次项目 主要涉及3G模块、WIFI模块两个部分的开发。
硬件环境      
     WIFI模块:Marvell8686 SDIO WIFI
     开发板:FS_S5PC100
       Android 2.1
软件环境
       Linux 2.6.29 
SDIO WIFI部分:

项目负责人:本人
项目目标:实现WIFI上网功能、并对WIFI休眠进行改善。
项目开发流程:
硬件分析:对Marvell8686 SDIO WIFI模块硬件工作特性了解和分析
工作原理分析:对Marvel8686 SDIO WIFI工作原理进行分析
Android WIFI框架分析:对Android WIFI系统框架分析
进行源码分析、编写、修改及编译
调试、并完善
时间安排:
2011-9-29至2011-10-7:硬件分析、了解驱动框架
2011-10-8至2011-10-16:Android SDIO WIFI移植及工作原理分析
2011-10-17至2011-10-23:Android WIFI框架分析
2011-10-24至2011-10-30:进行源码分析
2011-10-31至2011-11-5:准备答辩就业

二、Android SDIO WIFI移植:

0、Android中WIFI基本架构 
1、WIFI在Android中如何工作
2、配置内核支持SDIO WIFI-make menuconfig
3、配置wpa_supplicant的驱动-BoardConfig.mk
4、使能wpa_supplicant调试信息-common.*
5、修改wpa_supplicant.conf
6、配置路径和权限-init.rc
7、运行wpa_supplicant和dhcpcd-init.rc
8、设置驱动以模块方式加载-libertas_sdio.ko
9、提供固件供驱动模块-sd8686.bin sd8686_helper.bin
10、配置dhcpcd.conf                                                  

WIFI在Android中如何工作

Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,代码位于   external/wpa_supplicant。wpa_supplicant是通过socket与 hardware/libhardware_legacy/wifi/wifi.c通信。UI通过android.net.wifi package
   (frameworks/base/wifi/java/android/net/wifi/)发送命令给wifi.c。   相应的JNI实现位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp。
   更高一级的网络管理位于frameworks/base/core/java/android/net。
配置内核支持SDIO WIF

make menuconfig

[*] Networking support  --->  
         [*]   Wireless  --->  
                 --- Wireless                                                
                <*>   Improved wireless configuration API                   
                 [*]     cfg80211 regulatory debugging                        
                 [*]     nl80211 new netlink interface support                                                                              
                 -*-   Common routines for IEEE802.11 drivers    
Device Drivers  --->   
         [*] Network device support  --->  
                Wireless LAN  --->   
               <*>   Marvell 8xxx Libertas WLAN driver support  
               <M>     Marvell Libertas 8385 and 8686 SDIO 802.11b/g cards

配置wpa_supplicant的驱动

1)修改vendor/farsight/fs100/BoardConfig.mk:
   把BOARD_WPA_SUPPLICANT_DRIVER :=true
   改为    BOARD_WPA_SUPPLICANT_DRIVER := WEXT
   目的是:把driver_wext.c作为wpa_supplicant的驱动。wpa_supplicant通过它去与内核的wifi驱动打交道。
2)修改external/wpa_supplicant/Android.mk 
    把WPA_BUILD_SUPPLICANT :=false 
    改为    WPA_BUILD_SUPPLICANT := true 
   默认使用驱动driver_wext.c。
   如果使用定制的wpa_supplicant驱动(例如 madwifi),可以设置:
   BOARD_WPA_SUPPLICANT_DRIVER := MADWIFI

使能wpa_supplicant调试信息

wpa_supplicant默认信息显示的等级为SG_INFO,为了输出更多信息,可修改:
修改external/wpa_supplicant/common.c
    把int wpa_debug_level = MSG_INFO;
    改为:int wpa_debug_level = MSG_DEBUG; 
修改external/wpa_supplicant/common.h 
    把宏定义#define wpa_printf(level, ...)中的if ((level) >= MSG_INFO) 
    改为if ((level) >= MSG_DEBUG)

修改wpa_supplicant.conf

修改wpa_supplicant.conf:
   把external/wpa_supplicant/wpa_supplicant.conf拷贝到out/target/product/fs100/system/etc/wifi/目录下,
   并把:ctrl_interface=DIR=/data/misc/wifi/wpa_supplicant GROUP=wifi
   改为:
   ctrl_interface=wlan0 
配置路径和权限

A)配置init.rc文件修改out/target/product/fs100/root/init.rc, 让wifi用户拥有相关的权限, 在 #give system access to wpa_supplicant.conf for backup and restore后面增加:
     #add by caoyi 2011-10-19
 
     mkdir /data/misc/wifi/sockets 0777 wifi wifi

  chown wifi wifi /data/misc/wifi 
     chown wifi wifi /data/misc/wifi/wpa_supplicant.conf
  #for dhcp
     mkdir /data/misc/dhcp 0777 dhcp dhcp 
     chmod 0770 /data/misc/dhcp
     #end add
B)注释原有环境变量#export PATH 
改为:
 export PATH /sbin:/system/sbin:/system/bin:/system/xbin
    #above modified by caoyi 2011-10-19
      修改控制台
注释掉原console
   #modfied by caoyi 2011-10-19
   #service console /system/busybox/bin/ash    改为:service console /system/bin/bash

运行wpa_supplicant和dhcpcd

配置init.rc文件修改out/target/product/fs100/root/init.rc, 在末尾添加:
   #add by caoyi 2011-10-19
for wifi Android private socket
   service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c        /system/etc/wifi/wpa_supplicant.conf
           socket wpa_wlan0 dgram 660 wifi wifi 
           group system wifi inet 
           disabled 
           oneshot
   #for dhcp
   service dhcpcd /system/bin/dhcpcd wlan0
           group system dhcp 
          disabled 
          oneshot
   #end add。
设置驱动以模块方式加载

拷贝内核生成的drivers/net/wireless/libertas/libertas_sdio驱动模块到out/target/product/fs100/system/lib/modules/目录下。
然后修改hardware/libhardware_legacy/wifi/wifi.c
    1)修改#define WIFI_DRIVER_MODULE_PATH         "/system/lib/modules/libertas_sdio.ko"
       #define WIFI_DRIVER_MODULE_NAME        "libertas_sdio"  
    #define WIFI_TEST_INTERFACE  "wlan0"
添加休眠唤醒代码:
/*add by caoyi 2011-10-19*/
int module_wakeup_status()
   { 
         return 1;
   }
   int wait_time()
  {
     sleep(1); 
        return ;
   }
/*end add*/ 
提供固件firmware

Android不使用标准的hotplug binary,WIFI需要的firmware要复制到/etc/firmware。   或者复制到WIFI驱动指定的位置,然后WIFI驱动会自动加载。
   在此把wifi模块提供的sd8686.bin sd8686_helper.bin放到out/target/product/fs100/system/etc/firmware目录下。

配置dhcpcd.conf

修改源码目录下external/dhcpcd下的Android.mk文件
    取消注释
     26  include $(CLEAR_VARS)
     27 LOCAL_MODULE := dhcpcd.conf
     28 LOCAL_MODULE_TAGS := user
     29 LOCAL_MODULE_CLASS := ETC
     30 LOCAL_MODULE_PATH := $(etc_dir)
     31 LOCAL_SRC_FILES := android.conf
     32 include $(BUILD_PREBUILT)   
 然后重新编译mm,将编译产生的dhcpcd.conf放置到文件系统的目录system/etc/dhcpcd/dhcpcd.conf
最后确定dhcpcd.conf内容有:
     interface wlan0
     option subnet_mask, routers, domain_name_servers   
     option ntp_servers     这几行,否则修改之。
其它修改

修改WifiStateTracker.java
将frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java 里的mInterfaceName = SystemProperties.get("wifi.interface", "eth0");
       改为:
     mInterfaceName = SystemProperties.get("wifi.interface", "wlan0");

编译镜像文件后烧写到开发板上就可以使用WiFi模块连接外网。

经验技巧

移植过程中,我们只是针对文件系统中某几个文件修改,所以没必要重新对整个文件系统编译。而这个时候就可以针对性的编译某个目录,使生成对应的库文件*.so,然后替换之前的库文件。例如:
   我们经常要修改wifi.c。我们可以这样:
. ./build/envsetup.sh
tapas 
 mmm hardware/libhardware_legacy/ 
然后将生成的libhardware_legacy.so拷贝到文件系统fs100_root中lib目录。
 $cp out/target/product/fs100/system/lib/libhardware_legacy.so      fs100_root/system/lib/
三、Android WIFI 框架分析:

待续…… 

抱歉!评论已关闭.