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通道.






<think>嗯,用户询问如何在树莓派上启用WiFi驱动,这个问题需要结合树莓派系统的特性来解答。从引用内容来看,用户可能遇到了驱动识别或配置问题,特别是非root权限导致的配置文件修改障碍。 先整理核心解决路径:首先确认硬件兼容性,树莓派Zero W/3/4等型号的内置无线网卡通常免驱,但外接USB网卡(如小米WiFi)需要手动安装驱动。引用[3]提到的小米WiFi驱动安装流程显示需要编译内核模块,这属于较复杂的情况。 对于常见的内置网卡,重点在系统配置层面。引用[2]的案例很有参考价值——用户发现ifconfig能识别wlan0却无法连接,问题根源在于/etc/network/interfaces文件配置错误。这里需要强调两个关键点:1) 必须使用sudo权限修改系统级配置文件;2) 正确写入wpa_supplicant的配置指令,推荐使用raspi-config工具简化流程。 用户可能存在的操作误区包括:直接双击编辑受保护的系统文件(如引用[2]所述),或混淆network-manager服务(Ubuntu桌面版)与Debian系默认的networking服务。需要明确建议通过命令行工具操作。 对于外接网卡驱动安装这种进阶需求,需提醒内核版本匹配问题。引用[3]的make modules_prepare步骤隐含了编译环境配置,普通用户容易遗漏kernel headers安装。考虑分层次回答:先解决主流内置网卡问题,再补充第三方驱动方案。 最后需要故障排查指引:dmesg | grep wifi诊断驱动加载状态,sudo iwlist wlan0 scan验证射频功能是否正常。这些在引用内容中未提及但对实际调试很重要。</think>根据树莓派型号和系统版本的不同,启用WiFi驱动的步骤如下: ### 🛠 一、确认硬件和系统准备 1. **硬件兼容性** - 树莓派 3/4/Zero W 等型号**内置无线网卡**,无需额外驱动 - 外接USB网卡(如小米WiFi)需安装特定驱动(参考引用[3]) 2. **系统要求** - 使用官方系统(Raspberry Pi OS)或兼容系统(如Ubuntu) - 建议通过 `Raspberry Pi Imager` 烧录系统(引用[1]) --- ### 🔧 二、启用WiFi驱动的步骤 #### 📌 方法1:图形界面配置(推荐新手) ```bash sudo raspi-config # 启动配置工具 ``` 1. 选择 `System Options` > `Wireless LAN` 2. 输入SSID(WiFi名称)和密码 3. 重启生效:`sudo reboot` #### 📌 方法2:命令行配置(通用) 1. **修改网络配置文件** ```bash sudo nano /etc/wpa_supplicant/wpa_supplicant.conf ``` 在文件末尾添加: ```conf network={ ssid="你的WiFi名称" psk="你的WiFi密码" } ``` > 💡 注意:需用 `sudo` 权限修改(引用[2]) 2. **重启网络服务** ```bash sudo systemctl restart wpa_supplicant ``` 3. **检查驱动状态** ```bash iwconfig wlan0 # 查看无线网卡状态 ifconfig wlan0 # 检查IP是否分配 ``` --- ### ⚠️ 三、常见问题解决 1. **驱动未加载** ```bash lsmod | grep brcmfmac # 检查内置驱动是否加载 sudo modprobe brcmfmac # 手动加载驱动(内置网卡) ``` 2. **外接USB网卡驱动安装**(如小米WiFi) - 安装编译依赖: ```bash sudo apt install build-essential linux-headers-$(uname -r) ``` - 下载驱动源码并编译(参考引用[3]) - 加载驱动:`sudo insmod mt7601Usta.ko` 3. **配置文件权限问题** - 避免直接双击修改系统文件(引用[2]) - 始终使用 `sudo` 编辑:`sudo nano /etc/network/interfaces` --- ### 🔍 四、验证WiFi连接 ```bash ping -I wlan0 www.baidu.com # 指定网卡测试连通性 iw dev wlan0 link # 查看当前连接状态 ``` > 📌 **关键提示**:树莓派Zero W可通过USB OTG连接电脑配置(引用[1]),无需额外显示器或键盘。 --- ### 相关问题 1. 树莓派WiFi频繁断连如何解决? 2. 如何让树莓派启动时自动连接隐藏WiFi? 3. 树莓派如何同时连接WiFi和有线网络? 4. 树莓派Zero W如何通过USB共享电脑网络? [^1]: 如何在没有 WiFi、键盘和显示器的情况下使用树莓派 Zero W? [^2]: 树莓派3 基于Ubuntu mate 16.04的无线WIFI连接 [^3]: 小米wifi驱动 linux,树莓派2B 安装小米wifi驱动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值