wifi softap(hotspot) porting

wifi softap(hotspot) porting


聲明:該文件爲本人原創,如轉載修改及使用其中任何內容,請註明出處及原作者。

Author:lanbo(高兆成)

E-mail:[email protected]

如有任何疑問可留言或E-mail


1、編譯wifi driver

修改firmware下載路徑,或確認firmware路徑

A:有些wifi driver下載firmware是在driver中直接到指定位置讀取firmware並通過SDIO(如SDIO接口)下到wifi芯片,這種方式比較簡單,但需要知道firmware的路徑,以便在向根文件系統存放firmware與該路徑一致。如broadcomdriver

   set download dir: dhd/sys/dhd_linux.c fun:dhd_attach

   strcpy(fw_path, "/system/etc/firmware/fw.bin");

   strcpy(nv_path, "/system/etc/firmware/nvram.txt");

    注:download實現的地方:dhd/sys/dhd_linux.cfun:dhd_bus_start

生成dhd.ko

B:也有一些wifi driver在下載firmware前通過request_firmware創建屬性文件和uevent socket,併發送firmware add uevent,在android上層/system/core/init.c中再創建一個socket用於接收kernel的uevent並將firmware寫入屬性文件,driver再將firmware傳給wifi芯片。(相對來講這一種方式比較正式,個人認爲。具體download firmware如何實現在其它文件中會給出)

注該方法download firmware的firmware路徑是固定的“/etc/firmware/”在/system/core/init/devices.c中有定義

 

2、將wifi driver firmware config檔放入根文件系統指定位置

這些編譯時源文件目錄在andorid可放任何處,但最好不要亂放以免打亂上層文件存放結構,目前我存放的路徑爲/hardware/平臺名稱/wlan/broadcom/

/wlan/Broadcom/Android.mk內容

ifeq ($(BOARD_WLAN_DEVICE),bcm4329)

    include $(callall-subdir-makefiles)

endif

 

/wlan/Broadcom/firmware/Android.mk 文件內容,作用是將firmware檔sta.xbv(/wlan/Broadcom/firmware/sta.xbv)放到/system/etc/firmware目錄下的子目錄unifi-sdio-0中去。

最終firmware路徑爲:/system/etc/firmware/module_name/sta.xbv

LOCAL_PATH := $(call my-dir)

local_target_dir := $(TARGET_OUT_ETC)/firmware

 

########################

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sta.xbv

LOCAL_MODULE_TAGS := user

LOCAL_MODULE_CLASS := ETC

LOCAL_MODULE_PATH := $(local_target_dir)/module_name

LOCAL_SRC_FILES := $(LOCAL_MODULE)

include $(BUILD_PREBUILT)

 

########################

源文件目錄結構爲:

/hardware/平臺名稱/wlan/芯片名/Android.mk

/hardware/平臺名稱/wlan/芯片名/firmware/Android.mk

/hardware/平臺名稱/wlan/芯片名/firmware/*.bin

/hardware/平臺名稱/wlan/芯片名/config/Android.mk

/hardware/平臺名稱/wlan/芯片名/config/android_dhcpcd.conf

/hardware/平臺名稱/wlan/芯片名/config/wpa_supplicant.conf

/hardware/平臺名稱/wlan/芯片名/module/Android.mk

/hardware/平臺名稱/wlan/芯片名/module/*.ko

有的公司需要一些tools使用:

/hardware/平臺名稱/wlan/芯片名/tools/ Android.mk

/hardware/平臺名稱/wlan/芯片名/tools/*

目的目錄路徑:

其它config文件及driver模塊用同樣的方式存放

firmware:/system/etc/firmware

module:/system/lib/modules

wap_supplicant.conf:/system/etc/wifi

dhcpcd.conf:/system/etc/dhcpcd

 

wpa_supplicant.conf內容:

update_config=1

ctrl_interface=DIR=/data/system/wpa_supplicantGROUP=1010//網上有寫成GROUP=wifi這應該是指的同一個東西

eapol_version=1

ap_scan=1

fast_reauth=1

 

dhcpcd.conf內容:

interface eth0//該處寫成eth0應該是wifi interface的名字,應該根據wifi driver的名字來定,對於wifi來講用wlan0之類的名字更合理。

#dhcpcd-run-hooks uses these options.

optionsubnet_mask, routers, domain_name_servers

 

3、經過如上兩步就可簡單手動的試試wifi及softap能否正常工作了

insmod /system/wifi/dhd.ko,

不行的話先確認firmware路徑是否正確,再確認sdio卡是否支持,或mmc host driver 是否完成

insmod/system/lib/dhd.ko"firmware_path=/system/etc/sdio-g-cdc-full11n-reclaim-roml-wme-idsup.binnvram_path=/system/etc/nvram.txt"//這是bcm的insmod 如firmware路徑不正確的情況下可直接傳參數,如能正常insmod就有機會了

驗證wifi功能:

#insmod/system/wifi/*.ko

#/system/bin/wpa_supplicant -Dwext –ieth0(wlan0)-c/data/misc/wifi/wpa_supplicant.conf &

#wpa_cli-iwlan0 scan

#wpa_cli -iwlan0 scan_result

#dhcpcd wlan0 &//這個命令我還沒用過

 

驗證softap功能:

如能insmod並能下cmd就應該沒問題了,這時可找一個wifi手機看能否找到該hotspot“AndoridAP”

#insmod/system/wifi/module/*.ko(有可能後面要加參數如firmwarepath及config等)

#iwpriv eth0(wlan0) STOP

#iwpriv eth0(wlan0) WL_FW_RELOADFW_PATH=/system/wifi/fw_ap.bin

#iwpriv eth0(wlan0) START

#iwpriveth0(wlan0) AP_SET_CFG #ASCII_CMD=AP_CFG,SSID="AndoridAP",SEC="open",KEY=0,CHANNEL=1,PREAMBLE=0,MAX_SCB=8,END

#iwprivwl0.1 AP_BSS_START

用iwconfig或netcfg看有沒網絡設備名如eth0 wlan0 wl0.1

BroadCom的wifi網絡設備名爲wlan0或eth0根據drvier定,在下完AP_SET_CFG後會創建hotspot 網絡設備名wl0.1

 

4、增加或修改宏:device/hareware_platform/BoardConfig.mk

A:確定所使用的wifi芯片

增加(如同時支持多個wifi)或修改宏BOARD_WLAN_DEVIC:=bcm4329

當然一般用戶(我指的是不是芯片或EVB開發公司)則不需要此定義,此定義也只是用於區分目前EVB上所使用的wifi芯片。

 

B:決定所使用的wpa_supplicant的版本及driver的接口

WPA_SUPPLICANT_VERSION := VER_0_6_X//此宏不是必須,沒有此宏情況下默認使用VER_0_5_X版本的。

BOARD_WPA_SUPPLICANT_DRIVER := WEXT//決定wap_supplicant的底層接口類型

注:wpa_supplicant好像只支持WEXT的標準接口不支持WEXT的私有接口,因softap根本沒有使用wpa_supplicant,而是使用的是softapcontroller.cpp文件,該文件實現的功能與iwpriv一致(具體原理見後面)。

C:如果此wifi芯片有softap功能如bcm4329則需增加firmware的路徑宏,該路徑與第2第中firmware存放位置一致。因在打開softap時該芯片需要重新download softapfirmware.

ifeq ($(BOARD_WLAN_DEVICE),bcm4329)

WIFI_DRIVER_FW_STA_PATH := /system/wifi/fw.bin

WIFI_DRIVER_FW_AP_PATH :=/system/wifi/fw_ap.bin

endif

 

D:另增加如下幾個宏,以便UI上turn on調用wifi.c文件將這些傳進去

ifeq ($(BOARD_WLAN_DEVICE),bcm4329)

WIFI_DRIVER_MODULE_PATH:=/system/lib/modules/dhd.ko

WIFI_DRIVER_MODULE_NAME:=dhd

#WIFI_DRIVER_MODULE_ARG:=DBG=7 //該宏是用於insmod時傳參數

WIFI_FIRMWARE_LOADER:=/system/bin/fwload //爲downloadfirmware所使用的工具,有可能也包括firmware路徑。

endif

另如hardware/libhardware_legacy/wifi/Android.mk中如沒有如下內容則加上。

ifdef WIFI_DRIVER_MODULE_PATH

LOCAL_CFLAGS +=-DWIFI_DRIVER_MODULE_PATH=\"$(WIFI_DRIVER_MODULE_PATH)\"

endif

ifdef WIFI_DRIVER_MODULE_ARG

LOCAL_CFLAGS +=-DWIFI_DRIVER_MODULE_ARG=\"$(WIFI_DRIVER_MODULE_ARG)\"

endif

ifdef WIFI_DRIVER_MODULE_NAME

LOCAL_CFLAGS +=-DWIFI_DRIVER_MODULE_NAME=\"$(WIFI_DRIVER_MODULE_NAME)\"

endif

ifdef WIFI_FIRMWARE_LOADER

LOCAL_CFLAGS +=-DWIFI_FIRMWARE_LOADER=\"$(WIFI_FIRMWARE_LOADER)\"

endif

 

修改init.rc文件

A:增加wpa_supplicant服務

mkdir /data/misc/wifi 0770 wifi wifi

mkdir /data/misc/wifi/sockets 0770 wifiwifi

mkdir /data/system 0771 system system

mkdir /data/system/wpa_supplicant 0771 wifiwifi

 

chmod 0660/data/misc/wifi/wpa_supplicant.conf

B:配置dhcp服務

mkdir /data/misc/dhcp 0770 dhcp dhcp

chown dhcp dhcp /data/misc/dhcp

 

service dhcpcd /system/bin/dhcpcd -ABKL

   disabled

oneshot

如下dhcpcd 是網上的,應該用上面的二者取一即可

service dhcpcd /system/bin/dhcpcd –f/system/etc/dhcpcd/dhcpcd.conf –d eth0

         groupsystem dhcp

   disabled

   oneshot

 

如下是我們系統中存在的service,但我不確認是否有作用,個人認爲沒有作用。

service enterautosleep /system/bin/iwpriveth0 autodeepsleep 1

   disabled

   oneshot

 

service exitautosleep /system/bin/iwpriveth0 autodeepsleep 0

   disabled

oneshot

 

5、修改硬件抽象層

因在第4步時已增加了宏定義,則此處/hardware/libhardware_legacy/wifi/wifi.c不需修改,如果不能正常insmod則可能需要在此處增加log來確定問題的原因。

 

 

6、在平臺的*.mk文件中加入(/device/infomax/iM9816/generic_iM9816.mk,該文件是編譯Android時device的平臺配置文件)

ADDITIONAL_BUILD_PROPERTIES +=wifi.interface=eth0

如果沒有以上文件則可在init.rc中加入如下內容

setprop wifi.interface “eth0”

另網上看到有人也加入了setpropwlan.driver.status “ok”,本人在看完wifi.c文件後發現該屬性可不必添加。

 

7、增加usb tether softap interface及pppdrpstream

config_tether_usb_regexs:用於電腦或其它設備通過USB連接手機

config_tether_wifi_regexs:用於電腦或其它設備wifi 連接該接口的softap

config_tether_upstream_regexs:設置通過哪種方式上網,該處用pppd連接gprs上網

commit1a1c87d84f37cffafa3a9d91f97c4c7436bcf1a5

project framework/base

diff --git a/core/res/res/values/config.xmlb/core/res/res/values/config.xml

index 088ab44..e587a4f 100644

--- a/core/res/res/values/config.xml

+++ b/core/res/res/values/config.xml

@@ -74,12 +74,14 @@

         USB interfaces.  If the devicedoesn't want to support tething over USB this should

         be empty.  An example would be"usb.*" -->

    <string-array translatable="false"name="config_tether_usb_regexs">

+       <item>"usb.*"</item>

    </string-array>

 

    <!-- List of regexpressions describing the interface (if any) thatrepresent tetherable

         Wifi interfaces.  If the devicedoesn't want to support tethering over Wifi this

         should be empty.  An example wouldbe "softap.*" -->

    <string-array translatable="false"name="config_tether_wifi_regexs">

+       <item>"wl0.1"</item>

    </string-array>

 

    <!-- Dhcp range (min, max) to use for tethering purposes -->

@@ -89,6 +91,7 @@

    <!-- Regex array of allowable upstream ifaces for tethering - forexample if you want

         tethering on a new interface called "foo2" add<item>"foo\\d"</item> to the array -->

    <string-array translatable="false"name="config_tether_upstream_regexs">

+       <item>"ppp\\d"</item>

    </string-array>

 

8、修改kernnel config文件使能softap能夠正常工作

主要是增加netfilter 的config實現softap的upstream通道.

kernel/arch/arm/configs/platform_android_defconfig

+CONFIG_NETFILTER=y

+CONFIG_NETFILTER_ADVANCED=y

+CONFIG_NF_CONNTRACK=y

+CONFIG_NF_CONNTRACK_MARK=y

+CONFIG_NETFILTER_XTABLES=y

+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y

+CONFIG_NETFILTER_XT_MATCH_MAC=y

+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y

+CONFIG_NETFILTER_XT_MATCH_STATE=y

+#IP: Netfilter Configuration

+CONFIG_NF_DEFRAG_IPV4=y

+CONFIG_NF_CONNTRACK_IPV4=y

+CONFIG_NF_CONNTRACK_PROC_COMPAT=y

+CONFIG_IP_NF_IPTABLES=y

+CONFIG_IP_NF_FILTER=y

+CONFIG_IP_NF_TARGET_REJECT=y

+CONFIG_NF_NAT=y

+CONFIG_NF_NAT_NEEDED=y

+CONFIG_IP_NF_TARGET_MASQUERADE=y

+CONFIG_IP_NF_TARGET_REDIRECT=y

+#IPv6: Netfilter Configuration

發佈了17 篇原創文章 · 獲贊 7 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章