资讯详情

WiFi、蓝牙以及双WiFi流程

1、RTL8812AU驱动移植步骤

1.1 介绍驱动包目录

1.2 driver介绍编辑目录

1.3 移植步骤

2 、Android平台的移植

2.1Android系统上驱动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.二:接调同名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 介绍驱动包目录

1.2 driver目录介绍

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_ADROID_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/目录下

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

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

2.3 修改wif.cfg

Wif.cfg板子上对应的路径是:/system/etc/wifi/wifi.cfg Wif.cfg的格式如下:

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可以获得。

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驱动的加载。 格式如下:

其中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)

 3、蓝牙驱动移植

3.1.Rrtk_btusb driver

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

 

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/目录下

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

 

编译模块的添加 build/core/product.mk : _product_stash_var_list 添加 BORAD_HAVE_BTUETOOTH_RTK 

编译模块的添加 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数组添加

 4、双路WiFi设计

 4.1:双路WiFi框架图

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

而对于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

2:在frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiServiceImpl.java的构造方法中 new 一个WifiApStateMachine 实例化对象,构造方法的第一个参数使用p2p0,那么AP就使用这个网口。      

3:在device/ktc/ktc/overlay/frameworks/base/core/res/res/values/config.xml 下找到config_tether_upstream_types添加匹配,IP地址才能绑定到指定的网口         <item>"wlan\\d"</item>         <item>"p2p\\d"</item> 4:在WifiApStateMachin.java 的startTethering方法中修改匹配规则如下 此时IP就可以绑定在p2p0上。

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

 

改为如下:通过WifiApStateMachin的setHostApRunning方法直接启动热点; 由此开启了WiFi Ap的状态切换。

 5、SoftAp打开流程

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

packages/apps/TvSettings/Settings/src/com/android/tv/settings/connectivity/WifiApEnabler.java

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

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

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

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

 

5.3 InitialState状态对CMD_START_AP的处理

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

2:调用mWifiNative.loadapDriver() 去加载驱动ko文件。如果加载成功, 就会调用setWifiApState方法发送 消息通知状态机可以进入下一个 状态,最后主动调用 transitionTo(mSoftApStartingState); 让状态机进入SoftApStartingState 状态。

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方法中。

标签: ktc1拉杆式传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台