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 |
配置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 框架分析:
待续……