移植 wifi模块

本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记。

1、WIFI打不开现象概述

WiFi打不开是指您在UI的settings下选中WiFi选项,将其置为on(打开),但最终结果是自动变成off(关闭)、正在打开Wi-Fi、正在扫描等一系列不能正常打开WiFi的提示。

2、问题分析流程

WiFi打不开从硬件和软件两方面进行定位,一般是先硬件,然后软件。总体分析流程如图:

3、确认硬件可以识别

8192CU WiFi模块是基于usb接口,在UI将wifi设置为ON状态,通过串口输入lsusb确认设备可以识别。

红色标记 Bus 002 Device 003: ID 0bda:8176 就是平台上8192CU usb WiFi的vid和pid,能显示这个说明系统可以正常识别8192CU usb WiFi设备,硬件没问题。

4、确认驱动已加载

确认硬件没问题后,接着查看驱动是否加载,lsmod。

当你在UI的settings里将WiFi置于on状态,如果能正常打开,这时在串口输入lsmod,会有以下结果

红色标记 8192cu ko,说明8192CU WiFi 驱动已经成功加载上,如果此时没有看到此ko文件,请 切换到平台 /system/lib/ 目录下,查看此目录下是否有 8192CU 的 ko 。

可以看到平台下有8192cu.ko。如果您平台下有这个文件,请进入5进行进一步分析,如果您的平台没有这个文件,请进入6进行进一步分析。

5、平台/system/lib下有驱动ko文件

首先确保其权限至少为 -rw-r--r-- (即 644 ) ,如果权限不对,请按照下面操作修改权限:

chmod644 8192cu.ko

如果这些都是正常的话 请先进行手动加载

手动加载操作说明:先切换到平台/system/lib/目录下,然后进行如下操作:

insmod8192cu.ko

如果手动加载成功的话,请进入a进行下一步分析,如果手动加载不成功的话,请进入b进行下一步分析

a . 手动加载可以成功,说明 UI 加载不成功应该是系统配置文件不对 ,没有加载到指定路径的驱动。

如果您是Android 4.1请按照如下配置:

确保device\xxx录下BoardConfig.mk文件中有如下配置:

WIFI_DRIVER := rtl8192cu

WIFI_DRIVER_MODULE_PATH := /system/lib/8192cu.ko

WIFI_DRIVER_MODULE_NAME := 8192cu

其中 WIFI_DRIVER 指定您从 UI 打开 WiFi 要加载什么驱动; WIFI_DRIVER_MODULE_PATH 说明你要加载驱动的 ko 文件放在什么地方; WIFI_DRIVER_MODULE_NAME 指明驱动模块的名字。

b. 手动加载驱动也不成功,一般有两个原因:

(1) 编译内核时没有将cfg80211协议编进去,对于g18公板这块是默认配置上,如果没有配置上,您在编译内核前,先进入common目录,输入make menuconfig,配上Networkingsupport里面的内容

(2) 编译驱动的内核和您目前平台的跑的内核不是同一份code,这个从手动加载不成功的log可以很明显就看出来的,所以务必使编译驱动的内核和您目前平台跑的内核是同一份code。最安全方法是重新打包升级

对于是这两种原因的哪一个,从加载驱动不成功的log可以很容易看出来魔数不匹配。

6、平台/system/lib下没有驱动ko文件

您需要编译8192CU的ko文件,驱动在common/drivers/net/wireless/rtl8xxx_CU。将其拷贝到/system/lib/目录下并修改其权限,修改权限命令如下:

chmod644 8192cu.ko

注意:在编译8192CU驱动时,保证编译驱动的内核code和系统当前运行的内核code是同一份code,否则ko文件加载不上,会提示编译的驱动和当前系统的内核的版本不匹配的错误信息。

如果这样操作还是出现加载不上,那按照下述步骤打包升级。

(1)先按照6中的a配置好相应文件

(2)将8192CU驱动8192cu.ko编译出来,并将其拷贝到device\xxx下

(3)打包升级。

在经过如上这些定位和解决之后,从 UI 的 settings 加载 WiFi 驱动应该是没有问题了,正常情况下到此步的时候 UI 界面可以显示出 WiFi 扫描到的不同 AP ,但是也不排除 WiFi 还是打不开,这时候打不开主要有以下现象,将 WiFi 至于 on ,发现一闪而过,又变成 off ,还有就是界面上显示“正在打开 Wi-Fi......” ,还有就是显示正在扫描,这时候出现的问题可能在 wpa_supplicant

这块,请进入8进行进一步分析。

8、wpa_supplicant分析

8.1 wpa_supplicant相关文件和服务的确认

(1) 确认平台 /system/bin/ 下 wpa_supplicant 存在:

操作步骤说明如下:

130|[email protected]:/system/bin# ls -l wpa_supplicant

-rwxr-xr-x root     shell      686672 2008-08-01 12:00

同时确保文件操作属性至少为 -rwxr-xr-x(755)

(2) 对于 Android 4.1 确认 device\xxx下init.rc中存在如下service

service p2p_supplicant /system/bin/wpa_supplicant \

-ip2p0 -Dnl80211  -c/data/misc/wifi/p2p_supplicant.conf\

-e/data/misc/wifi/entropy.bin-puse_p2p_group_interface=1\

-N  -iwlan0-Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf

class main

socket wpa_wlan0 dgram 0660 wifi wifi

disabled

oneshot

service wpa_supplicant /system/bin/wpa_supplicant \

-iwlan0 -Dnl80211  -c/data/misc/wifi/wpa_supplicant.conf\

-e/data/misc/wifi/entropy.bin

class main

socket wpa_wlan0 dgram 0660 wifi wifi

disabled

其中p2p_supplicant是当WiFi作为p2p功能启动的服务,wpa_supplicant是WiFi作为station功能启动的服务。

8.2 将WiFi至于on,发现一闪而过,又变成off

对于这种现象主要存在两种情况 :

(1) 平台下缺少 wpa_supplicant 和 p2p_supplicant 的配置文件

确认平台/data/misc/wifi/目录下是否存在wpa_supplicant.conf和p2p_supplicant.conf文件,并确认这些文件操作权限,操作说明如下:

130|[email protected]:/data/misc/wifi# ls -l *supplicant.conf

-rw-rw---- system   wifi          219 2013-07-03 03:28p2p_supplicant.conf

-rw-rw---- system   wifi          374 1970-01-02 00:35wpa_supplicant.conf

(2) 对WiFi提供的接口进行确认:

这部分主要是您要清楚WiFi作为什么功能,即WiFi是仅仅作为station功能,还是要开启p2p功能,当WiFi作为station功能时候开启的是wpa_supplicant服务,当WiFi作为p2p功能开启的是p2p_supplicantf服务。

当WiFi作为station功能时开启的是wpa_supplicant,这时候一般不会出现接口错误,因为这时候wpa_supplicant服务中只用到wlan0接口,即使上层不定义wlan0底层驱动也会默认产生wlan0接口

当WiFi作为p2p功能时开启的是p2p_supplicant,这时候可能会出现接口错误,因为p2p_supplicant服务会用到p2p0接口,所以您需要提前定义好p2p0。

如果你没有定义p2p0接口,但加载时候有时候会首先启动p2p_supplicant服务,由于p2p_supplicant服务会用到p2p0这个接口,所以出现加载失败。那么怎样才能使系统不首先启动p2p_supplicant服务,而是首先启动wpa_supplicant服务?这是因为您平台/etc/permisssions/目录下有android.hardware.wifi.direct.xml这个文件,只要将这文件删掉或者重命名下,修改后记得要reboot下才能生效,操作说明如下:

130|[email protected]:/etc/permissions# ls -l

-rw-r--r-- root  root         158 2008-08-01 12:00 amlogic.libplayer.xml

-rw-r--r--root  root          150 2008-08-01 12:00amlogic.pppoe.xml

-rw-r--r--root  root          168 2008-08-01 12:00amlogic.subtitle.xml

-rw-r--r-- root  root   975 2008-08-01 12:00 android.hardware.usb.accessory.xml

-rw-r--r-- root  root   868 2008-08-01 12:00 android.hardware.usb.host.xml

-rw-r--r-- root   root    843 2008-08-01 12:00 android.hardware.wifi.direct.xml

-rw-r--r--root  root    829 2008-08-01 12:00 android.hardware.wifi.xml

-rw-r--r--root  root  1050 2008-08-01 12:00 android.software.live_wallpAPer.xml

-rw-r--r--root  root    880 2008-08-01 12:00android.software.sip.voip.xml

-rw-r--r--root  root    828 2008-08-01 12:00com.android.location.provider.xml

-rw-r--r-- root  root 828 2008-08-01 12:00com.google.widevine.software.drm.xml

-rw-r--r--root  root    10536 2008-08-01 12:00 platform.xml

-rw-r--r--root  root    2614 2008-08-01 12:00tablet_core_hardware.xml

怎么判断启动的是 p2p_supplicant 还是 wpa_supplicant ?因为您在没有定义 p2p0时启动 p2p_supplicant 服务,从 log 里面可以很明显看到如下 log :

wpa_supplicant( 4316):p2p0: Failed to initialize driver interface

提示:为避免因为接口出现加载失败,按照以下设置就不会出现此类错误:

对于Android 4.1,确保device\xxx目录下Boarconfig.mk中有如下内容:

WIFI_DRIVER_MODULE_ARG  := "ifname=wlan0 if2name=p2p0"

9、UI上“正在打开Wi-Fi......”

这个现象一般会有如下几种情况:

(1) 缺少配置文件:按照8的步骤确认

(2) 驱动加载失败,使底层的网络接口都没有产生,以致 supplicant 对底层的网络接口初始化失败,但是 supplicant 会尝试重复初始化几次,如果不断初始化一段时间后还是会失败,最终 supplicant 退出, UI 上 WiFi 变成 off 。

怎么查看平台下的 WiFi 模块的接口有没有产生,直接在串口输入 netcfg 命令,操作如下:

130|[email protected]:/# netcfg

lo       UP            127.0.0.1/8   0x00000049 00:00:00:00:00:00

eth0     DOWN       0.0.0.0/0   0x00001002 00:56:0b:d9:59:65

sit0      DOWN        0.0.0.0/0   0x00000080 00:00:00:00:00:00

ip6tnl0   DOWN     0.0.0.0/0   0x0000008000:00:00:00:00:00

wlan0  UP    192.168.0.138/24  0x00001043 34:08:04:df:9a:63

p2p0  UP      0.0.0.0/0   0x00001003 36:08:04:df:9a:63

这是我在自己机器上操作结果,红色标记的 wlan0 和 p2p0 接口就是WiFi模块产生的两个与supplicant进行通信的接口。

(3) 底层WiFi模块确实已经在系统产生了相应接口,但是supplicant对这些接口进行初始化的时候失败,这主要是因为底层驱动提供给supplicant的接口函数有问题,这个一般是底层驱动的问题,请反馈给作者进一步分析。

10、 UI上“正在扫描AP......”

一般出现这种现象应该是supplicant和底层WiFi驱动通信有问题,请反馈给作者分析。

时间: 2024-12-25 16:55:41

移植 wifi模块的相关文章

天嵌E9平台下进行USB Wifi模块RT3070驱动的移植

因为项目工作须要,要在天嵌E9平台下实现wifi的点对点,点对多点的传输. Wifi 模块芯片:雷凌3070芯片 嵌入式平台:E9(ARM) 交叉编译环境:arm-none-linux-gnueabi 1 首先下载了wifi模块的驱动 2011_0719_RT3070_RT3370_RT5370_RT5372_RT2070_Linux_STA_V2.5.0.3_DPO 2 对驱动进行交叉编译 a 打开驱动文件解压后的文件,假设须要WPA等功能,可打开./os/linux/config.mk进行编

全志A20 ap6210 wifi模块移植

1. 编译wifi相关功能为模块,生成bcmdhd.ko:由bcmdhd.ko的模块信息可知,该模块依赖于cfg80211.ko和rfkill.ko. 2. 写脚本,开机自动加载wifi模块. 3. 使用命令#ifconfig wlan0 up开启WIFI. 开启wifi需要加载2个固件:fw_bcm40181a2.bin 和 nvram_ap6210.txt. 根据芯片ID(ap6210内部使用bcm43362)选择固件 fw_bcm40181a2.bin(该固件名称程序中定义) nvram_

全志A20 ap6210 wifi模块移植2

1. 编译wifi相关功能为模块,生成bcmdhd.ko:由bcmdhd.ko的模块信息可知,该模块依赖于cfg80211.ko和rfkill.ko. 2. 写脚本,开机自动加载wifi模块. 3. 使用命令#ifconfig wlan0 up开启WIFI. 开启wifi需要加载2个固件:fw_bcm40181a2.bin 和 nvram_ap6210.txt(bcm43362的配置文件). 根据芯片ID(ap6210内部使用bcm43362)程序自动选择固件 fw_bcm40181a2.bin

基于WIFI模块(ESP8266)与非同一个局域网内服务器建立连接(转)

原文地址:https://blog.csdn.net/ludaoyi88/article/details/62236644 案例简述: 以WIFI模块(ESP8266)为开发对象,处在局域内网中的WIFI模块,连接到另外一个局域内网的TCP服务器,形成WIFI模块和服务器之间通信.本文先以电脑控制WIFI模块的连接,熟悉AT指令的使用,再通过编程手段,由单片机去控制WIFI模块,深入学习. 一.电脑端调试,控制WIFI模块的连接 说明:将WIFI模块通过串口与电脑连接,电脑通过串口调试软件给模块

ESA2GJK1DH1K升级篇: 测试STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 注意:BootLoader程序还是用以前的程序. 一开始设计这个升级篇的时候,我就规定好了大的框架 BootLoader只是负责升级,其它一概不管 用户程序只是写入升级标志,然后重启,所有的升级步骤全部交给BootLoader! 协议: 一,MQTT上位机通过MQTT发送获取设备信息指令 {"da

用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯

最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 WIFI模块实现了这个功能.下面向大家就简单分享一下. 工具:网络调试助手  ESP8266  STM32F1开发板 首先,用网络调试助手来虚拟一个服务器,如下: 有了服务器后,接下来我们就要用WIFI来连接这个服务器.ESP8266 有三种工作模式,由于项目要求,我选用了STA中的客户端模式.下面

树莓派3uart wifi模块调试 (浪费了我3天时间的宝贵经验)

最开始我是连接一个wifi模块到我的arduino uno上,可是uno只有一个uart并且这个uart和usb串口相连的.出现了一些和很奇怪的问题.进入设置模式(m0=1 , m1=1)后,确实能够设置,设置的参数都保存成功了,但是使用c3c3c3无法获取到版本没有任何返回,可能当时是我的rx数据线的没有接触的问题. 后来我将两块uart wifi模块通讯,在电脑上外接usb转串口 (2个usb转换器,通讯一点问题没有,使用linux的minicom. minicom一定要将硬件流控制关闭,8

智能家居常用WiFi模块

WiFi模块 WiFi模块就是整个系统的控制中心,控制很简单,就是输出一个开关信号控制继电器,而这个模块的核心是WiFi的连接,手机连接WiFi时需要扫描,输入密码,而这类本身没有屏幕和键盘的硬件设备,要想快捷的接入WiFi网络就需要更加便捷的连接方案,这就是这些模块厂家的主要工作了,所以这些模块都提供类似的连接方案,即手机APP扫描WiFi,在APP上输入对应WiFi的连接密码后自动由APP发送到模块,完成模块和WiFi的连接,本质上是一样的,只是叫的名字不同而已,有的叫SimpleLink有

【手把手教你树莓派3 (二)】 启动wifi模块

概述 树莓派3内置了wifi和蓝牙模块,我们不用像以前的版本那样,再去购买一个外接的模块练到raspberry上. 当我们第一次启动了树莓派的时候,必然使用了网线,但是之后的每一次使用,我们当然更希望使用wifi连接树莓派和路由器,而且wifi模块内置在树莓派3中,何乐而不为? 下面介绍下如何启动wifi模块,这时还是要借助网线的. 使用图形界面: 这个很简单了,我们只要像以往的Linux系统一样,在右上角的菜单栏里面选择wifi,输入密码就可以了. 使用命令行: 当然,对于木有显示器的童靴,只