wifi移植全过程记录

Advertisement

手动加载驱动
####16th,Jul
驱动加载
modprobe libertas
modprobe libertas_sdio
加载第二行时出错拉
# modprobe libertas_sdio
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
model=0xb
sd8686_helper.bin sd8686.bin
init: untracked pid 958 exited
过了一会出现:
libertas: can't load helper firmware
libertas: failed to load helper firmware
libertas_sdio: probe of mmc2:0001:1 failed with error -2
但是用lsmod又能看到
# lsmod
libertas_sdio 8776 0 - Live 0xbf022000
libertas 97416 1 libertas_sdio, Live 0xbf009000
usbserial 30256 0 - Live 0xbf000000

###使用insmod试一下
insmod /lib/modules/2.6.24.7/kernel/drivers/net/wireless/libertas/libertas.ko
insmod /lib/modules/2.6.24.7/kernel/drivers/net/wireless/libertas/libertas_sdio.ko
还是老样子

###发现系统中没有提到的文件fireware文件
从华恒的romfs/lib把fireware拷贝到 /nfs/rootfs/lib下
$$还是不行

###把fireware拷贝到system/etc/下面,终于可以加载了
如下:
# modprobe libertas_sdio
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
model=0xb
sd8686_helper.bin sd8686.bin
init: untracked pid 714 exited
init: untracked pid 717 exited
libertas: eth1: Marvell WLAN 802.11 adapter

$$$建议
Title:Android INIT not loading firmware
android员工答:You need to run the insmod in a separate process launched by init.

#########
理解原理
Android uses a modified wpa_supplicant (external/wpa_supplicant) daemon for wifi support which is controlled through a socket by hardware/libhardware_legacy/wifi/wifi.c (WiFiHW) that gets controlled from Android UI through android.net.wifi package from frameworks/base/wifi/java/android/net/wifi/ and it's corresponding jni implementation in frameworks/base/core/jni/android_net_wifi_Wifi.cpp Higher level network management is done in frameworks/base/core/java/android/net

1.在build/target/board/generic/BoardConfig.mk中增加
BOARD_WPA_SUPPLICANT_DRIVER := WEXT

2.打开调试信息--可选
默认是不打开调试的
2.1 modify external/wpa_supplicant/common.c and set wpa_debug_level = MSG_DEBUG
2.2 modify common.h and change #define wpa_printf from if ((level) >= MSG_INFO) to if ((level) >= MSG_DEBUG)

3.创建system/etc/wifi/wpa_supplicant.conf
有2种socket
一种是android private socket
ctrl_interface=eth1
update_config=1
ap_scan=1 ###取决于wifi驱动,如果不行,则改为0试试
另一种是unix 标准socket,这里先选用第二种
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
update_config=1
ap_scan=1 ###取决于wifi驱动,如果不行,则改为0试试

4在init.rc中增加以下语句

#@qiu
mkdir /system/etc/wifi 0777 wifi wifi
chmod 0777 /system/etc/wifi
chmod 0777 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf

mkdir /data/misc/wifi 0777 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0777 /data/misc/wifi
chmod 0777 /data/misc/wifi/wpa_supplicant.conf
chown wifi wifi /data/misc/wifi
chown wifi wifi /data/misc/wifi/wpa_supplicant.conf

# wpa_supplicant socket (unix socket mode)
mkdir /data/system/wpa_supplicant 0777 wifi wifi
chmod 0777 /data/system/wpa_supplicant
chown wifi wifi /data/system/wpa_supplicant
#[email protected]

##如果是private socket,则是
mkdir /system/etc/wifi 0777 wifi wifi
chmod 0777 /system/etc/wifi
chmod 0777 /system/etc/wifi/wpa_supplicant.conf
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf

#wpa_supplicant control socket for android wifi.c (android private socket)
mkdir /data/misc/wifi 0777 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0777 /data/misc/wifi
chmod 0777 /data/misc/wifi/wpa_supplicant.conf
chown wifi wifi /data/misc/wifi
chown wifi wifi /data/misc/wifi/wpa_supplicant.conf

5.在init.rc中添加wpa_supplicant和dhcpcd启动服务
service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -ieth1 -c /system/etc/wifi/wpa_supplicant.conf
group system wifi inet
disabled
oneshot
##如果是pricvate socket则需要在group上面增加一行:
socket wpa_eth1 dgram 777 wifi wifi

service dhcpcd /system/bin/dhcpcd -f /system/etc/dhcpcd/dhcpcd.conf -d eth1
group system dhcp wifi
disabled
oneshot

5.5增加/system/etc/dhcpcd/dhcpcd.conf文件内容
interface eth1
option subnet_mask, routers, domain_name_servers

6.把wifi驱动编译进内核
首先init.rc中增加
setprop wifi.interface "eth1"
setprop wlan.driver.status "ok"
其次在修改hardware/libhardware_legacy/wifi/wifi.c
新的out/target/product/generic/system/lib/libhardware_legacy.so---v2
在函数wifi_load_driver()的体的开头增加
//@qiu
LOGE("[email protected] driver loaded !");
return 0;
//[email protected]
在函数wifi_unload_driver()体的开头增加
//@qiu
LOGE("[email protected] driver unloaded!");
return 0;
//[email protected]

####17th,Jul
把驱动从M改为*,得zImage-vvv39
开始启动:
加载firmware的时候出错
libertas: can't load helper firmware
libertas: failed to load helper firmware
libertas_sdio: probe of mmc2:0001:1 failed with error -2

看来是无法加载fireware

###尝试修改wifi.c让它自动加载模块
修改
#ifndef WIFI_DRIVER_MODULE_PATH1
#define WIFI_DRIVER_MODULE_PATH1 "/system/lib/modules/libertas.ko"
#endif
#ifndef WIFI_DRIVER_MODULE_PATH2
#define WIFI_DRIVER_MODULE_PATH2 "/system/lib/modules/libertas_sdio.ko"
#endif
#ifndef WIFI_DRIVER_MODULE_NAME1
#define WIFI_DRIVER_MODULE_NAME1 "libertas"
#endif
#ifndef WIFI_DRIVER_MODULE_NAME2
#define WIFI_DRIVER_MODULE_NAME2 "libertas_sdio"
#endif
并在此文件的后面代码中做一定修改,wifi_load_driver()函数中也做相应修改
编译得到libhardware_legacy.so---v3

-启动后在设置中点击wifi
串口显示如下,看来是能加载了
# libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
model=0xb
sd8686_helper.bin sd8686.bin
init: untracked pid 954 exited
init: untracked pid 957 exited
libertas: eth1: Marvell WLAN 802.11 adapter
但是wifi图标下面显示wifi不可用
查看logcat的main:
7899 E/WifiHW ( 708): Cannot access "/data/misc/wifi/wpa_supplicant.conf": Permission denied
7900 E/WifiHW ( 708): Wi-Fi will not be enabled
7901 W/WifiHW ( 708): [email protected] driver unloaded!
7902 E/WifiService( 708): Failed to start supplicant daemon.
7903 D/SettingsWifiEnabler( 791): Received wifi state changed from Enabling to Unknown

于是增加以下语句到init.rc
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
chown wifi wifi /data/misc/wifi
chown wifi wifi /data/misc/wifi/wpa_supplicant.conf
并且cp system/etc/wifi/wpa_supplicant.conf ./data/misc/wifi/

启动,终于能打开wifi,但还是无法打开网页
查看logcat
4564 E/wpa_supplicant( 917): Failed to read or parse configuration '/system/etc/wifi/wpa_supplicant.conf'.
4565 E/WifiHW ( 708): Unable to open connection to supplicant on "/data/system/wpa_supplicant/sta": No such file or directory
4566 D/WifiService( 708): ACTION_BATTERY_CHANGED pluggedType: 1
4899 E/WifiHW ( 708): Supplicant not running, cannot connect
5574 E/WifiHW ( 708): Supplicant not running, cannot connect
5575 V/WifiStateTracker( 708): Supplicant died unexpectedly
5576 D/dalvikvm( 934): DexOpt: load 3102ms, verify 1519ms, opt 24ms
5577 D/installd( 665): DexInv: --- END '/system/app/Browser.apk' (success) ---
5578 D/NetworkStateTracker( 708): setDetailed state, old =IDLE and new state=DISCONNECTED
5579 D/ConnectivityService( 708): ConnectivityChange for WIFI: DISCONNECTED/DISCONNECTED

##在init.rc中把wpa_supplicant.conf权限修改为777,
还是有错误:
5573 E/WifiHW ( 708): Unable to open connection to supplicant on "/data/system/wpa_supplicant/sta": No such file or director

##在init.rc中增加以下几条语句
setprop wifi.interface "eth1"
setprop wlan.driver.status "ok"
setprop wlan.interface "eth1"
结果还是不行logcat显示
E/WifiHW ( 708):Unable to open connection to supplicant on "/data/system/wpa_supplicant/eth1": No such file or directory

##在init.rc中dhcp服务启动是为eth1的增加wifi组权限
又出现新错误
如果开始就enable wifi就会出现以下错误:
E/WifiHW ( 709): Unable to open connection to supplicant on "/data/system/wpa_supplicant/eth1": Connection refused
因为这是开机默认启动wifi,如果不起动,错误则是和上一条相同

###18th,Jul
##尝试在wpa_supplicant.conf设置GROUP=system,还是不行,只好改回去

ls /data/system/wpa_supplicant/eth1 -l
srwxrwx--- 1 1010 1010 0 Jul 18 08:22 /data/system/wpa_supplicant/eth1

# ls /data/system/wpa_supplicant/eth1 -l
srwxrwxrwx 1 1010 1010 0 Jul 18 08:22 /data/system/wpa_supplicant/eth1

###18th,Jul手动调试
# wpa_supplicant -dd -Dwext -ieth1 -c /system/etc/wifi/wpa_supplicant.conf&
# ioctl[SIOCSIWPMKSA]: Invalid argument《《《《输出的错误

# ls /data/system/wpa_supplicant/eth1 -l
srwxrwxrwx 1 1010 1010 0 Jul 18 13:14 /data/system/wpa_supplicant/eth1

#wpa_cli -i eth1 -p /data/system/wpa_supplicant
不知道该如何设置ap
bash# wpa_cli -ieth1 scan //搜索无线网
bash# wpa_cli -ieth1 scan_results //显示搜索结果
bash# wpa_cli -ieth1 add_network
bash# iwconfig eth1 essid "you_wifi_net"
bash# wpa_cli -ieth1 password 0 "password"
bash# wpa_cli -ieth1 enable_network

###19th,Jul
修改vi frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java
把tiwlan0改eth1
暂时未编译

###开始没有选择第二步的debug选项,选上,在external/wpa_supplicant目录下有mm编译
得到
system/bin/wpa_cli---vvv1
system/lib/libwpa_client.so---vvv1
system/bin/wpa_supplicant---vvv1
###试一下android private socket
修改vi system/etc/wifi/wpa_supplicant.conf
vi data/misc/wifi/wpa_supplicant.conf
修改init.rc
在chmod那里把unix socket的那段注释
在启动wpa_supplicant的时候增加
socket wpa_eth1 dgram 660 wifi wifi

结果还是不行

###只好在external/wpa_supplicant/wpa_ctrl.c中添加
LOGW,注意得先加入头文件和LOG_TAG
17 #define LOG_TAG "WifiQiu"
18 #include "cutils/log.h"
mm编译得到
system/bin/wpa_cli---vvv2
system/lib/libwpa_client.so---vvv2
但是竟然没有WifiQiu输出,不知道是不是没有用make而是mm的缘故

###20th,Jul
1.BoardConfig.mk增加了HAVE_CUSTOM_WIFI_DRIVER_2 := true
2.修改wifi/wifi.c中使得检查和卸载驱动的两个函数,用make编译得到
libhardware_legacy.so---v4
system/bin/wpa_cli---vvv2.1
system/bin/wpa_supplicant-v2
system/lib/libwpa_client.so---vvv2.1

###上面的版本还没有来的及测试,有发现问题
1.突然发现external/wpa_supplicant/wpa_ctrl.c中LOG不够全面,
一共有三种情况,漏了一个函数没有加,于是增加LOGW并使之可以区分
2.根据手动strace wpa_cli的提示
access("/data/misc/wifi/wpa_supplicant", F_OK) = -1 ENOENT (No such file or directory)
用grep 搜索到所在文件为external/wpa_supplicant/wpa_cli.c
把它修改为:/data/misc/wifi
用mm分别在external/wpa_supplicant和hardware/libhardware_legacy中编译
得到
system/bin/wpa_cli---vvvvv3
system/lib/libwpa_client.so---vvv3
libhardware_legacy.so---v5

启动之后发现是在对socket进行连接的时候出错了
connect(ctrl->s, (struct sockaddr *) &ctrl->dest,sizeof(ctrl->dest)) 而且不能关闭wifi
只好重新修改wifi.c直接在unload函数中返回0,使得wifi能被关闭
libhardware_legacy.so---v5.1

###21th,Jul使用private的时候再次手动调试
# wpa_supplicant -dd -Dwext -ieth1 -c /system/etc/wifi/wpa_supplicant.conf&
# ioctl[SIOCSIWPMKSA]: Invalid argument
mkdir[ctrl_interface]: Permission denied

[1] + Done(255) wpa_supplicant -dd -Dwext -ieth1 -c /system/etc/wifi/wpa_supplicant.conf
查找mkdir发现是在ctrl_iface_unix.c中
错误是出现在#ifdef ANDROID之外阿,诡异

###用donut中external/wpa_supplicant下的driver_wext.c替换地掉eclair中的
mm重新编译,得到:
wpa_supplicant---vvv3
$$$还是不行

###22th,Jul
把donut的wpa_supplicant文件夹拷贝到eclair下
用mm编译得到
system/bin/wpa_cli---vvvvv4
system/bin/wpa_supplicant---vvv4
system/lib/libwpa_client.so---vvv4
wpa_supplicant---vvv3
终于可以搜索到网络了,泪奔
但是,不能获取到ip地址呵呵

logcat提示:
I/WifiStateTracker( 713): DhcpHandler: DHCP request failed: Timed out waiting for DHCP to finish

###手动启动dhcp提示
eth1: open `/data/misc/dhcp/dhcpcd-eth1.pid': No such file or directory
在init.rc中增加
mkdir /data/misc/dhcp 0777 wifi wifi
chmod 0777 /data/misc/dhcp
chown wifi wifi /data/misc/dhcp
还是不能获得地址
eth1: flock `/data/misc/dhcp/dhcpcd-eth1.pid': Try again
后来把上面的wifi 改为dhcp,还是不能获得IP地址

$$
把dhcpcd杀了,手动启动
# dhcpcd -f /system/etc/dhcpcd/dhcpcd.conf -d eth1
eth1: dhcpcd 4.0.1 starting
eth1: hardware address = 00:1a:6b:a2:38:65
eth1: executing `/system/etc/dhcpcd/dhcpcd-run-hooks', reason PREINIT
eth1: /system/etc/dhcpcd/dhcpcd-run-hooks: Permission denied
eth1: waiting for carrier
eth1: host does not support a monotonic clock - timing can skew
eth1: timed out
eth1: executing `/system/etc/dhcpcd/dhcpcd-run-hooks', reason FAIL
eth1: /system/etc/dhcpcd/dhcpcd-run-hooks: Permission denied

$$把权限都改为777,再次执行
# dhcpcd -f /system/etc/dhcpcd/dhcpcd.conf -d eth1
eth1: dhcpcd 4.0.1 starting
eth1: hardware address = 00:1a:6b:a2:38:65
eth1: executing `/system/etc/dhcpcd/dhcpcd-run-hooks', reason PREINIT
eth1: waiting for carrier
eth1: host does not support a monotonic clock - timing can skew
eth1: timed out
eth1: executing `/system/etc/dhcpcd/dhcpcd-run-hooks', reason FAIL

$$还没有关闭android机呢,重新打开wifi,嘿嘿,能分配到地址了

但是...但是,还是不能上网,估计是由于地址的原因吧

把eth0禁用之后就可以上网了,呵呵

wifi移植告一段落

Similar Posts:

  • zedboard-----------tesseract移植全过程记录

    关于这部分部分之前就记录过的,不过之前记录的还是挺乱的,今天在在这个帖子上好好整理一下下了. 首先是这个软件是需要leptonica的支持,这个东西其实也就是另外的一个软件一样,它实现了很多图像处理方面的功能,类似于 OPENCV吧.这个在PC上的安装很简单,.confiugre.make ,make install就搞定了,默认的安装应该是在.usr/local/下面的吧.当然我需要的交叉编译,产生能够在Zynq上面能够使用的库啊,头文件什么的.自然要用到交叉编译工具arm-xilinx-li

  • Wifi移植文档--内核配置选项

    原文地址:http://www.open-open.com/lib/view/open1328193165703.html 不久前移植过ranlink公司的wifi无线网卡,发现网上的一些文档不完整或者对一些碰到的问题没有说明,在此详细说明一,本人将其移植到android系统上碰到了不少的问题,修改了驱动及框架代码,费了两周多的时间才完全搞好. 一. Android平台Wifi的基本代码路径 1. Wpa_supplicant源码部分 external/wpa_supplicant_6/ 生成库

  • Android WIFI 移植

    Android WIFI 移植http://blog.163.com/kj_kang/blog/static/1399501352010113094550280/ 技术 2010-12-30 22:51:30 阅读142 评论0 字号:大中小 订阅 在 Android 2.2上移植了2个wifi模块,vt6656和rt2070,总结一下要点. 首先,将wifi linux驱动编译成模块,并将驱动(vntwusb.ko或rt3070sta.ko放到/system/lib/modules/中.然后,

  • android系统移植emmc记录(总)

    历时一个月,终于成功把android系统移植到emmc上启动. 开发板:s5pv210 系统:android 2.34 目的:使用emmc代替 nand flash 烧写命令:fastboot sdfuse 分区命令: fdisk vfat格式命令:fatformat Ext3格式命令:ext3format -------------------------------------------------------------------------------- 1:android系统移植e

  • s5pc100 board android2.1环境下的RT3070 usb wifi移植

    S5PC100-board android 2.1 RT3070 usb wifi 移植 硬件环境:s5pc100开发板,rt3070usbwifi模块 软件环境: unbuntu8.10: linux-2.6.29内核 utc100_android_2.1源码: rt3070模块驱动: 1.首先我们将需要的上述四个工作文件拷贝到工作目录下 2.接着我们查看一下linux-2.6.29-sansung 打开这个内核源码工作目录 查看一下里面的参数有没有设置正确 make menuconfig (

  • 测试库同步正式库全过程记录

    测试库同步正式库全过程记录 1.备份并导出正式库数据 2.关闭测试机上所有以'jhe'开头的服务 3.关闭接口同步程序 4.删除测试库 5.新建同名测试库,配置服务名 6.新建表空间和用户 CREATE TABLESPACE TSP_REPORT DATAFILE 'd:ORACLEPRODUCT10.2.0ORADATAREPORT.DBF' size 20M reuse autoextend on next 5M maxsize unlimited LOGGING PERMANENT EXT

  • android4.0.3 wifi 移植记录

    一. Android平台Wifi的基本代码路径 1. Wpa_supplicant源码部分 external/wpa_supplicant/ 生成库libwpa_client.so和守护进程wpa_supplicant 2. Wifi的HAL层代码 位于hardware/libhardware_legary/wifi/ 3. Wifi的JNI部分 位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp 4. JAVA部分 位于frameworks

  • 关于Android下WIFI移植的一些指导文章

    Android移植之WIFI S3c6410 平台 Android系统的Wi-Fi调试记录 被雷到了, 到底有没有人在Linux下成功驱动起来那个WIFI模块了? 移植wifi无无线网卡到mini2440上全过程 Wireless tools for Linux 的一些资料收集 wifi iwconfig WIFI 相关添加流程 wpa_supplicant(含wpa_cli)无线网络配置 [转]Android WIFI(含wpa_supplicant修正) 移植 wpa_supplicant

  • [资料分享]迅为iTOP4412开发板-SDIO WiFi移植文档

    本文转自迅为:http://www.topeetboard.com 概述 近期需要把WiFi无线网络功能移植到iTOP-4412 开发平台,查阅了相关资料,经过一段时间的研究.调试,终于成功的将WiFi功能移植到了开发板上面,这里笔者记录移植过程及注意事项,方便以后工作需要. iTOP-4412开发板的WiFi模块与板卡之间的连接采用SDIO接口,WiFi硬件模块使用的是MTK的MT6620芯片,MTK提供了Android4.0及Android4.4的driver, Porting Guid,有

  • 和菜鸟一起学android4.0.3源码之USB wifi移植心得

    一天又过去了,台风也走了有些时候了.想了想,自己还是冲动了一把,不该发那个邮件的,既然发了,也不后悔了.知道了所有也未必不是一件好事.恩,剩下的就好好做自己要做的事情吧.对于usb wifi,老早就在调试了,只是碰到了很多问题,加上其他的事情也迎面而来,从而导致很多的困难,也就搁置着了.上上周,工作计划一周内要搞定,郁闷着了,这个涉及到的太多太多了,不好移植啊.只能加班了,天天看代码了.在移植完bluetooth后,马上开始wifi的移植.终于,功夫不负有心人,前天晚上解决了可恶的权限问题导致不

Tags: