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