1. 程式人生 > >wifi移植全過程記錄

wifi移植全過程記錄

手動載入驅動
####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]i 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)) < 0)
而且不能關閉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移植告一段落

相關推薦

wifi移植全過程記錄

手動載入驅動####16th,Jul驅動載入modprobe libertasmodprobe libertas_sdio載入第二行時出錯拉# modprobe libertas_sdiolibertas_sdio: Libertas SDIO driverlibertas_

android之wifi移植全過程

一、1.編譯核心,生成驅動模組      在核心的根目錄下執行make      生成libertas.ko 和libertas_sdio.ko      [*] Networking support  --->            [*]   Wireless  --->           

android之wifi移植全過程(一)

硬體環境                                     WIFI模組:Marvell8686 SDIO WIFI                               開發板:S5PC100                        

tslib 1.4 qt4.8.6移植過程記錄

重新編譯 官網 .com main where 不顯示 接口 刪掉 etc 工作原因需要把原JAVA界面移植成QT界面,觸摸驅動這個坑填了好久,今天終於搞定了,也怪自己經驗不足吧。記錄一下忘了以後還可以看看,設置的環境變量都是機器上的,如果需要使用得改改 下載tslib1.

Openssh arm移植經驗記錄

Openssh arm移植經驗記錄 參考資料: https://blog.csdn.net/yasirliberty/article/details/51274971 https://blog.csdn.net/zhongruixian/article/details/21076405

redhat6.3 64位更新源(使用網易源)全過程記錄

使用 rpm -Uvh --replacepkgs *.rpm --aid 進行安裝:[[email protected] matlab]# rpm -Uvh --replacepkgs *.rpm --aid warning: python-iniparse-0.

libvlc3.0.4在ubuntu16.04x64上的交叉編譯全過程記錄

 週末折騰了好久,經過連續的出現問題,定位問題,解決問題,終於順利編譯通過了vlc的最新版本,中間嘗試了多個版本的編譯,比如vlc3.0.0,想著離2.x版本(2.x版本已經編譯通過,可以參考:ubuntu平臺,VLC/LibVLC交叉編譯,生成win32版本,以及LibVLC增加錄影介面

CentOS6上編譯安裝gcc8.1版本全過程記錄(包括排坑與常見錯誤解決)

之前發現開發機上安裝的gcc版本太舊了,連C++11新特性都不支援,於是決定對其進行升級。本文詳細記錄了在CentOS 6上升級gcc的整個過程,特別是其中遇到的坑和解決辦法。 安裝依賴項 先把依賴項裝好 sudo yum install glibc-de

#嵌入式Linux最小系統移植# yaffs2根檔案系統移植出錯記錄

busybox官網地址: 本次移植採用的busybox版本: busybox-1.26.0.tar.bz2 交叉編譯工具鏈版本: $ arm-linux-gcc -v gcc version 4.4.3 (ctng-1.6.1) 1

usb wifi移植終於搞定了

1.選的wifi晶片是rtl8188cus 2.選的開發包是0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip 3.編譯8192cu.ko 4.編譯iwconfig工具 5.編譯wpa工具 6.移植到板上 1>

關於Realtek RTL8188EU wifi移植要知道的

    目前可以使用wireless-tools 或wpa_supplicant工具來配置無線網路。請記住重要的一點是,對無線網路的配置是全域性性的,而非針對具體的介面。     wpa_supplicant是一個較好的選擇,但缺點是它不支援所有的驅動。請瀏覽wpa_su

HISI3518E WIFI移植(ap模式)

一、修改makefile和os/linux/config.mk 1、選擇模式(不定義WIFI_MODE,預設為空)         ifeq ($(WIFI_MODE),)              RT28xx_MODE = AP 2、PLATFORM平臺選擇(這一步

linux下移植libcurl記錄

移植過程主要參考部落格: https://blog.csdn.net/wuzhiwuweisun/article/details/79129838 也借鑑了部落格:https://blog.csdn.net/zhouzhenhe2008/article/details/53768854

x1000e rtl wifi 移植

前情提要 這次是要換一個 wifi 晶片,就把這個換的過程記錄下來,因為自己也是新手,很多東西都是自己一點點摸出來的,就希望一些東西能對跟我一樣,新入門的人有些幫助,能快速入門。 基本設施 基於 君正 x1000e, halley2 wifi 由原君正的換到 r

RTL8723藍芽wifi移植8723bu系列

8723buwifi 軟體包下載 http://download.csdn.net/detail/qqchangjianfei/9554279 WIFI:            增加路徑 linux/kernel/kernel-3.4.39/drivers/net/wir

RK3399嵌入式開發板QT下wifi 移植方法

RK3399的CPU採用big.LITTLE大小核架構,雙Cortex-A72大核+四Cortex-A53小核結構,對整數、浮點、記憶體等作了大幅優化,在整體效能、功耗及核心面積三個方面都具革命性提升。 RK3399的GPU採用四核ARM新一代高階影象處理器Ma

嵌入式web伺服器boa移植全過程(含圖解過程)

移植平臺:mini2440(arm9 s3c2440)開發板 ,核心2.6.29   一、boa下載和安裝: 1、修改編譯安裝檔案: 1)在www.boa.org下載boa-0.94.13.tar.gz 並解壓 2)在src目錄下執行./configure生成Ma

Windows server2008 搭建ASP介面訪問連線oracle資料庫全過程記錄

真的是太不容易了,以前的時候在window server 2003上面搭建了一套asp+oracle的介面系統,就費了好大的勁兒,其實那會迷迷瞪瞪的也不知道怎麼的就弄好了,也懶得管了。OK,從昨天到今天打算把介面從測試環境部署到公網環境上去的時候就出現了各種各樣的問題,這次

wifi 移植過程

1:關於wifi 匯流排sdio的配置,前面的部落格已經說過2:這一章主要描述wifi移植WL_REG_ON 主要用於上電,休眠的時候,請保持該GPIO上電,否則會丟失wifi內部的狀態,導致wifi喚醒失敗;WL_HOST_WAKE 主要用於wifi裝置有資料的時候,喚醒C

嵌入式linux usb wifi移植[s3c6410平臺 轉載]

http://blog.chinaunix.net/uid-8048969-id-3251135.html 重新編譯關於WIFI方面的modules,然後編譯wifi模組的驅動。把模組設定成開機載入模式。