• wifi 驱动 进阶11



    1、编译wifi driver ,生成dhd.ko,驱动一般由芯片厂商提供,如果能拿到源代码首先要保证能够 编译通过;

    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拷贝到/system/etc/firmware目录下 或 其他目录。

    最终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 //编译之后 firmware 的最终位置(也就是拷贝的位置)

    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/xxx/BoardConfig.mk

    a:确定所使用的wifi芯片

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

    注意:当然一般用不需要此定义,此定义也主要是用于区分目前所使用的wifi芯片,主要在 hardware/平台名称/wlan/芯片名/Android.mk 文件里使用区分目前所使用的wifi芯片,具体 使用方法 如:c、d

    b:决定所使用的wpa_supplicant的版本及driver的接口

    WPA_SUPPLICANT_VERSION := VER_0_6_X//当前所使用wpa_supplicant的版本保证wpa_supplicnat能够正常编译到系统中“external\wpa_supplicant\Android.mk”开始部分的编译条件)

    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_PATH_STA := /system/wifi/fw.bin

    WIFI_DRIVER_FW_PATH_AP :=/system/wifi/fw_ap.bin

    WIFI_DRIVER_FW_PATH_P2P :=/system/wifi/fw_p2p.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时调用,一般和ko文件的名字相同

    WIFI_DRIVER_MODULE_ARG := "firmware_path=/etc/wifi/fw_bcm40181a2.bin nvram_path=/etc/wifi/nvram.txt" //该宏是用于insmod时传参数

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

    BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_wext //wpa_supplicant 需要依赖的库,位置在 hardware/平台名称/wifi/芯片名称/wpa_supplicant_8_lib

    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

    ifdef WIFI_DRIVER_FW_PATH_STA
    LOCAL_CFLAGS += -DWIFI_DRIVER_FW_PATH_STA=\"$(WIFI_DRIVER_FW_PATH_STA)\"
    endif

     ifdef WIFI_DRIVER_FW_PATH_AP
    LOCAL_CFLAGS += -DWIFI_DRIVER_FW_PATH_AP=\"$(WIFI_DRIVER_FW_PATH_AP)\"
    endif

    ifdef WIFI_DRIVER_FW_PATH_P2P
    LOCAL_CFLAGS += -DWIFI_DRIVER_FW_PATH_P2P=\"$(WIFI_DRIVER_FW_PATH_P2P)\"
    endif

    ifdef WIFI_DRIVER_FW_PATH_PARAM
    LOCAL_CFLAGS += -DWIFI_DRIVER_FW_PATH_PARAM=\"$(WIFI_DRIVER_FW_PATH_PARAM)\"
    endif

    LOCAL_SRC_FILES += wifi/wifi.c

    LOCAL_SHARED_LIBRARIES += libnetutils

    ======================================


    5. 修改init.rc文件

    a:增加wpa_supplicant服务

    # Give system access to wpa_supplicant.conf for backup and restore

    mkdir /data/misc/wifi 0770 wifi wifi

    mkdir /data/misc/wifi/sockets 0770 wifi wifi

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

    chown wifi wifi /data/misc/wifi/wpa_supplicant.conf


    b:配置dhcp服务

    mkdir /data/misc/dhcp 0770 dhcp dhcp

    chown dhcp dhcp /data/misc/dhcp


    service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL
        class main
        group dhcp system
        disabled
        oneshot



    6、修改硬件抽象层

    因在第4步时已增加了宏定义,则此处/hardware/libhardware_legacy/wifi/wifi.c不需修改,如果不能正常insmod则可能需要在此处增加log来确定问题的原因。


    7、增加usb tether softap interface及pppdrpstream

    config_tether_usb_regexs:用于电脑或其它设备通过USB连接手机

    config_tether_wifi_regexs:用于电脑或其它设备wifi 连接该接口的softap

    config_tether_upstream_regexs:设置通过哪种方式上网,该处用pppd连接gprs上网


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

    主要是增加netfilter 的config实现softap的upstream通道.






  • 相关阅读:
    消息队列 ActiveMQ
    Redis
    SQL 怎么用EXISTS替代IN
    SQL优化
    为什么要重写hashCode()和equals()方法
    Redis的介绍和面试可能问到的问题
    建立私有CA和颁发证书
    修复grub2
    Centos 7 进入救援模式
    Centos 服务的常用命令
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11745045.html
Copyright © 2020-2023  润新知