设为首页 收藏本站
查看: 991|回复: 0

[经验分享] wifi softap(hotspot) porting

[复制链接]

尚未签到

发表于 2015-10-1 09:15:17 | 显示全部楼层 |阅读模式


分类: kernel android2011-09-26 12:51 3469人阅读 评论(5) 收藏 举报
moduleinterfacepathdownload平台include
  wifi softap(hotspot) porting
  
  声明:该文件为本人原创,如转载修改及使用其中任何内容,请注明出处及原作者。
  
  Author:lanbo(高兆成)
  E-mail:lanbo_g@126.com
  如有任何疑问可留言或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  -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf &/*验证时config路径可能在/system/etc/或其他目录*/

  #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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-121163-1-1.html 上篇帖子: 【IOS】获取wifi名称 (即SSID) 下篇帖子: android 2.3 wifi (一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表