WiFi、蓝牙以及双WiFi流程

目录

1、RTL8812AU驱动移植步骤

1.1 驱动包目录介绍

1.2 driver目录介绍​编辑

1.3 移植步骤

2 、Android平台的移植

2.1 Android系统上驱动ko的存放路径

2.2 编译Android系统的时候,需要把ko拷贝到指定的位置

2.3 修改wif.cfg

2.4 自动加载驱动脚本

2.5:修改 startSupplicant.sh 脚本

 3、蓝牙驱动移植

3.1.Rrtk_btusb driver

2.修改linux kernel的drivers/bluetooth/目录下的文件Kconfig 和Makefile 。

 4、双路WiFi设计

 4.1:双路WiFi框架图

4.2RealtelWiFi模块支持的模式有以下三种

4.3Android系统双路WiFi的设计

 5、SoftAp打开流程

5.1:当我们在设置中打开热点时,会调用WifiManager::setWifiApEnabled(),参数enabled为true。

5.2:接调用同名的WifiServiceImpl::setWifiApEnabled():

5.3 InitialState状态对CMD_START_AP的处理

5.3 驱动的加载流程 loadapDriver


此文档编写于2017年,如今离开了这个行业,仅此记录。适用于mstar平台,MTK TV系列平台(mt9632,mt9612,mt9669,mt9950等)

本文双wifi居于Android 5.0,现在从Android 9 开始Android framework自带wifi ap双状态机,简单配置即可。

wifi bt移植过程大同小异,请从wifi bt供应商获取最新的文档和源码去移植

按照本文的原理可以在Android 5,6,7,8上实现双wifi功能,也就是主板连接路由器的wifi能够上网,同时主板还可以打开热点AP,分享网络给其他终端设备连接使用。

1、RTL8812AU驱动移植步骤

1.1 驱动包目录介绍

WiFi、蓝牙以及双WiFi流程_第1张图片

1.2 driver目录介绍
WiFi、蓝牙以及双WiFi流程_第2张图片

1.3 移植步骤


第一步:修改Makefile 
A、修改平台
源码如下:默认是I386PC
CONFIG_PLATFORM_I386_PC = y
CONFIG_PLATFORM_ANDROID_X86 = n
……
CONFIG_PLATFORM_MSTAR = n
CONFIG_PLATFORM_SZEBOOK = n
CONFIG_PLATFORM_ARM_SUNxI = n
……
修改为:支持Mstar平台
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ANDROID_X86 = n
……
CONFIG_PLATFORM_MSTAR =y
CONFIG_PLATFORM_SZEBOOK = n
CONFIG_PLATFORM_ARM_SUNxI = n
……
B.修改内核源码路径、编译工具、内核版本
找到ifeq ($(CONFIG_PLATFORM_MSTAR), y)
修改
ARCH:=arm
CROSS_COMPILE:= /usr/src/bin/arm-none-linux-gnueabi-
KVER:= 3.1.10
KSRC:= /usr/src/Mstar_kernel/3.1.10/
为:
ARCH:=arm64
CROSS_COMPILE:= /opt/linaro-aarch64_linux-2014.09_843419-patched/bin/aarch64-linux-gnu-
KVER:= 3.10.40
KSRC:= /home/chenzhaohao/828_horin/LL/vendor/mstar/kernel/3.10.40
C.修改驱动的宏配置选项
修改:
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_USE_USB_BUFFER_ALLOC_TX -DCONFIG_FIX_NR_BULKIN_BUFFER -DCONFIG_PREALLOC_RX_SKB_BUFFER
EXTRA_CFLAGS += -DCONFIG_PLATFORM_MSTAR_HIGH、
为:
#EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_PLATFORM_MSTAR_SCAN_BEFORE_CONNECT -DCONFIG_PLATFORM_ANDROID
#EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE 
#EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
#EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_USE_USB_BUFFER_ALLOC_TX -DCONFIG_FIX_NR_BULKIN_BUFFER 
#-DCONFIG_PREALLOC_RX_SKB_BUFFER -DCONFIG_PLATFORM_ANDROID
#EXTRA_CFLAGS += -DCONFIG_PLATFORM_MSTAR_HIGH
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN 

编译 make即可得到8812au.ko
 

2 、Android平台的移植

2.1 Android系统上驱动ko的存放路径


RTL8812AU驱动移植得到的ko要放入到device/ktc/ktc/preinstall/modules/目录下

WiFi、蓝牙以及双WiFi流程_第3张图片

2.2 编译Android系统的时候,需要把ko拷贝到指定的位置


需要在device/ktc/ktc/preinstall/preinstall.mk文件中执行这个动作
$(LOCAL_PATH)/modules/8812au.ko:system/lib/modules/8812au.ko 

WiFi、蓝牙以及双WiFi流程_第4张图片

2.3 修改wif.cfg

Wif.cfg板子上对应的路径是:/system/etc/wifi/wifi.cfg
Wif.cfg的格式如下:
WiFi、蓝牙以及双WiFi流程_第5张图片

wifi_vendor_name:wifi dongle的名字,这个名字需要具有唯一性,不能和其他的模块名字重复。可以自己指定,这里指定为RTL8812AUS
Order:是wifi dongle的序号,这个填写规则是增加1即可
count_vid_pid:wifi_vendor_name和多少款vid_pid绑定,即vid_pid后面有多少栏,比如RTL8812AUS的是vid_pid=0x0bda:0x8812,所以RTL8812AUS的就是2
vid_pid:USB wifi dongle的vid和pid,这个解释USB模块之后,通过busybox lsusb可以获得。
WiFi、蓝牙以及双WiFi流程_第6张图片

sta=1 :表示支持WiFi sta模式
softap=1:表示支持WiFi softap模式
p2p=1:表示支持WiFi p2p模式
 

2.4 自动加载驱动脚本

wifi_load_driver.sh
wifi_load_apdriver.sh
板子上对应的路径是system/bin/
源码上对应的路径是device/ktc/common/preinstall/wifi/
wifi_load_driver.sh和wifi_load_apdriver.sh脚本是Android framework用来匹配前面wifi_vendor_name实现对应的WiFi dongle驱动的加载。
格式如下:
WiFi、蓝牙以及双WiFi流程_第7张图片

其中Realtek的dongle必须带有指定ifname=wlan0 if2name=p2p0


2.5:修改 startSupplicant.sh 脚本


板子上对应的路径是system/bin/
源码上对应的路径是device/ktc/common/preinstall/wifi/
这个脚本是根据wifi_vendor_name来启动wpa_supplicant程序,不同的厂家写法不一样,只要去跟随同个厂家的写法去添加就可以了。
Realtek的如下:
RTL8192CU|RTL8192DU|RTL8192EU|RTL8812AUS|RTL8188ETV)
WiFi、蓝牙以及双WiFi流程_第8张图片

 3、蓝牙驱动移植


3.1.Rrtk_btusb driver

将Realtek提供的文件rtk_btusb.h和rtk_btusb.c拷贝到linux kernel的drivers/bluetooth/目录下。

 WiFi、蓝牙以及双WiFi流程_第9张图片

2.修改linux kernel的drivers/bluetooth/目录下的文件Kconfig 和Makefile 。


在Kconfig文件中增加BT_RTKBTUSB的选项:


最后通过“make menuconfig” 或者直接修改 kernel 的配置文件
CONFIG_BT_RTKBTUSB=y
把编译生成的蓝牙驱动rtk_btusb.ko放到device/xxx/xxx/preinstall/modules/目录下
WiFi、蓝牙以及双WiFi流程_第10张图片

 在device/xxx/xxx/preinstall/preinstall.mk 中添加编译时自动拷贝打包到out相当于目录

 WiFi、蓝牙以及双WiFi流程_第11张图片

编译模块的添加
build/core/product.mk : _product_stash_var_list 添加 BORAD_HAVE_BTUETOOTH_RTK 
WiFi、蓝牙以及双WiFi流程_第12张图片

编译模块的添加
device/xxx/xxx/BoardConfig.mk中添加
BORAD_HAVE_BTUETOOTH_RTK  := true 
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR ?=  device/ktc/ktc/bluetooth

添加pid、vid,让Android系统支持该款usb 蓝牙;在
device/ktc/common/libraries/bluetooth/bluetoothmonitor/bluedroid/bluetooth.c文件的rtk_tables数组添加
WiFi、蓝牙以及双WiFi流程_第13张图片

 4、双路WiFi设计

 4.1:双路WiFi框架图


      需要至少两个虚拟网口 WiFi走wlan0,AP走wlan1 。需要驱动去打开CONCURRENT_MODE宏,才能产生两个虚拟网口。
    在驱动源码包下的include/autoconf.h中把这个CONCURRENT_MODE宏打卡,编译生成的ko加载之后才会生成两个虚拟网口。

WiFi、蓝牙以及双WiFi流程_第14张图片WiFi、蓝牙以及双WiFi流程_第15张图片

而对于mstar 828方案双WiFi使用的是Realtek提供的,必须存在wlan0和p2p0网口,因此WiFi走wlan0,AP走p2p0网口。网口的命名有两个地方可以设置。
1:在驱动加载的时候,带参数传入。
   Insmod xxxx.ko ifname=wlan0  if2name=p2p0
2:在驱动源码中写入固定名称,此时加载驱动不需要参数
   在os_dep/linux/os_intfs.c中
   char *ifname = "wlan%d"; 改为 char *ifname = "wlan0";
   char *if2name = "p2p%d"; 改为 char *if2name = "p2p0";


4.2RealtelWiFi模块支持的模式有以下三种


1. Station mode + Station mode
2. Station mode + AP mode
3. Station mode + P2P mode 
但是Android系统目前只是支持1,3点;需要去实现Android层的STA+AP 


4.3Android系统双路WiFi的设计


1:在frameworks\opt\net\wifi\service\java\com\android\server\wifi目录下增加一个WIFI AP状态机,命名为WifiApStateMachine.java
WiFi、蓝牙以及双WiFi流程_第16张图片

2:在frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiServiceImpl.java的构造方法中 new 一个WifiApStateMachine 实例化对象,构造方法的第一个参数使用p2p0,那么AP就使用这个网口。
     
WiFi、蓝牙以及双WiFi流程_第17张图片

3:在device/ktc/ktc/overlay/frameworks/base/core/res/res/values/config.xml 下找到config_tether_upstream_types添加匹配,IP地址才能绑定到指定的网口
        "wlan\\d"
        "p2p\\d"
4:在WifiApStateMachin.java 的startTethering方法中修改匹配规则如下
此时IP就可以绑定在p2p0上。
WiFi、蓝牙以及双WiFi流程_第18张图片

 5:WifiServiceImpl.java中把所有关于热点的状态机部分的接口全部改成WifiApStateMachin对象的。
6:修改setWifiApEnabled方法

 WiFi、蓝牙以及双WiFi流程_第19张图片

改为如下:通过WifiApStateMachin的setHostApRunning方法直接启动热点;
由此开启了WiFi Ap的状态切换。
WiFi、蓝牙以及双WiFi流程_第20张图片

 5、SoftAp打开流程

5.1:当我们在设置中打开热点时,会调用WifiManager::setWifiApEnabled(),参数enabled为true。


packages/apps/TvSettings/Settings/src/com/android/tv/settings/connectivity/WifiApEnabler.java
WiFi、蓝牙以及双WiFi流程_第21张图片

5.2:接调用同名的WifiServiceImpl::setWifiApEnabled():


WiFi、蓝牙以及双WiFi流程_第22张图片

mWifiApStateMachine.setHostApRunning(wifiConfig, enabled);  这一句才是真正开启热点流程状态切换。
 mWifiApStateMachine.setHostApRunning(wifiConfig, enabled);  

WiFi、蓝牙以及双WiFi流程_第23张图片
wifiConfig:对象保存了在Settings中操作时保留的热点信息,如热点名称、密钥和加密方式等等。
enabled:热点的状态,true为打开,false:为关闭。
执行这一句之后就进入到了WiFi Ap的状态机模式

在这个接口里只是简单的向WifiApStateMachine
转发了开启/关闭热点的消息以及传进来的设置信息。
WifiApStateMachine在被实例化时,在它的构造方法
里面定义了很多状态,并且设置初始状态为InitialState
CMD_SET_AP消息会在InitialState状态中被处理。

WiFi、蓝牙以及双WiFi流程_第24张图片
 

5.3 InitialState状态对CMD_START_AP的处理


1:首先会等待usb设备初始化完毕
使用一个while循环去等待。

2:调用mWifiNative.loadapDriver()
去加载驱动ko文件。如果加载成功,
就会调用setWifiApState方法发送
消息通知状态机可以进入下一个
状态,最后主动调用
transitionTo(mSoftApStartingState);
让状态机进入SoftApStartingState
状态。
WiFi、蓝牙以及双WiFi流程_第25张图片

5.3 驱动的加载流程 loadapDriver


 路径:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java

可以看到这是一个native方法的JNI接口:
路径frameworks/opt/net/wifi/service/jni/com_android_server_wifi_WifiNative.cpp

这里有封装了另外一个方法,wifi_ap_load_driver。
路径:hardware/libhardware_legacy/wifi/wifi.c

真正的实现是在wifi_common_load_driver方法中。
WiFi、蓝牙以及双WiFi流程_第26张图片

WiFi、蓝牙以及双WiFi流程_第27张图片

WiFi、蓝牙以及双WiFi流程_第28张图片

WiFi、蓝牙以及双WiFi流程_第29张图片

WiFi、蓝牙以及双WiFi流程_第30张图片

WiFi、蓝牙以及双WiFi流程_第31张图片

你可能感兴趣的:(Android系统,WIFI,大数据)