目录

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 驱动包目录介绍

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

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

WiFi、蓝牙以及双WiFi流程相关推荐

  1. 开源一个微信小程序,支持蓝牙配网+WiFi双控制ESP32-C3应用示范;(附带Demo)

    文章目录 一.前言 二. Blufi乐鑫自研的蓝牙配网协议 ESP32 配网流程 流程图 三.相关代码 3.1 蓝牙快速配网 3.2 蓝牙本地控制 2.3 外设驱动 3.1 蓝牙搜索 3.2 蓝牙服务 ...

  2. android wifi 流程图_实现双wifi的方法及Android终端与流程

    本发明涉及无线通信技术领域,尤其涉及一种实现双wifi的方法及Android终端. 背景技术: 在楼宇对讲产品中,楼宇对讲的家庭设备,如平板,需要连接到楼宇对讲的局域网络,以实现与楼宇内的相关设备进行 ...

  3. 信驰达推出RTL8720DN系列2.4G和5G双频Wi-Fi+蓝牙二合一模块

    近日,领先的无线物联网通信模块厂商深圳信驰达科技RF-star推出了基于RTL8720DN SoC的2.4 GHz和5 GHz双频Wi-Fi蓝牙二合一模块-RF-WM-20DNB1. 图 1信驰达RF ...

  4. Ubuntu20.04 intel ax201双系统没有wifi蓝牙,驱动激活教程

    Ubuntu20.04 intel ax201双系统没有wifi蓝牙,驱动激活教程 正文开始 安装好系统,使用`uname -r`查看内核版本 更新系统 更新相关的包 linux-headers 同样 ...

  5. atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二

    该方案适合小米笔记本Air 13初代,适合小米笔记本PRO等型号,适合通用的预留有M.2 PCIE通道SSD卡槽的电脑.也是作者极力推荐的终极改造方案. 总体方案: 使用笔记本主板上的M.2 nvme ...

  6. Qualcomm QCA9379无线WiFi/蓝牙模块芯片参数介绍

    QCA9379将先进的2x2双频802.11acMU-MIMO WiFi蓝牙4.2结合在一块高性能.小形状的片上系统(SoC)中.支持增强的WiFi/Bluetooth与蓝牙专用(第三个)天线共存. ...

  7. 什么软件可以用蓝牙测试信号,litepoint IQview蓝牙测试仪/无线wifi网络信号测试仪...

    无线测试系统 LitePoint IQview®提供强大工具,能取得并测量WiFi及蓝牙讯号,并以分析功能提供装置运作说明,简化了WiFi与Bluetooth®装置的开发过程.IQview与IQfle ...

  8. ESP32学习笔记(48)——WiFi蓝牙网关

    一.项目简介 蓝牙网关 又叫蓝牙探针,是采集蓝牙设备的蓝牙数据,通过 WIFI 等方式传至服务器的一款中继设备.如果类比的话,就如同 WIFI 网络中的无线 AP 的作用.WIFI 网络中无线 AP ...

  9. WiFi蓝牙FM三合一模块AP6356S

    AMPAK正基AP6356S,这是一款可同时双频工作的双通道SDIO接口WiFi支持11ac级双频.蓝牙支持BT4.1标准的WiFi 蓝牙 FM三合一模块;其中蓝牙和WiFi共用天线(也就是双天线), ...

最新文章

  1. wpa_supplicant drivers 查看跟踪
  2. gui的design 无界面_无蓝光不刺眼 海信阅读手机超长续航双11嗨不停_
  3. 10、MySQL锁等待,死锁,死锁检测
  4. python神经网络多元函数_阿里达摩院推荐的最新400集python教程,据说懂中文就能上手...
  5. 进程的静止和活动状态
  6. Eclipse最新插件的下载地址大全[收集整理] zt
  7. TrackBack 技术规范
  8. 卫星轨道的估计问题(Matlab)(三):标准重采样粒子滤波(SIR)对新问题的尝试
  9. HTML标签和属性大全
  10. 川大考研复试c语言参考书目_北京航空航天大学英语笔译考研参考书目-复试分数线...
  11. Android Studio实现简单的图书馆订座系统
  12. 标签打印软件中Excel数据整理及导入
  13. 全面解析《嵌入式程序员应该知道的16个问题》
  14. 计算机组成原理编码键盘实验报告,计算机组成原理实验报告–杨睿.doc
  15. 7脚spi OLED屏幕改造成IIC屏幕
  16. 人工智能专家:AI并不像你想象的那么先进
  17. Redis内存分析工具之redis-rdb-tools的安装与使用
  18. win7我的文档里.android是什么文件夹,[转载]移动Win7用户文件夹(我的文档)默认位置至D盘...
  19. Android框架排行榜
  20. 金仓数据库 KingbaseES 与 Oracle 的兼容性说明(4. SQL)

热门文章

  1. 「学习笔记」多项式的蛇皮操作
  2. python用户登录a_python实现用户登录
  3. 蓝桥杯-基础练习-字母图形(BASIC-3)
  4. 解决[1]:XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'id\xef\xbc\x8cage
  5. 3Q大战再起闪现“三英战吕布”?
  6. 2003下搭建easypanel(康乐)虚拟主机控制面板
  7. cdkey和激活码的生成
  8. 【算法】遗传算法及其 Java 实现
  9. 一个好用的按键驱动模块
  10. (六)温故知新系列之RXJS——RXJS操作符基础(转化类)