基于Android的SDIO-WIFI移植(2)

来源:互联网 发布:球藻在淘宝哪家 编辑:程序博客网 时间:2024/06/10 09:06
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 框架分析:

待续…… 

Android WIFI框架分析(1)


原创粉丝点击