开发环境
平台: 瑞芯微RK356x
操作系统:Android11
WiFi、蓝牙芯片:RTL8723DU
通讯类型:USB协议
RTL8723du介绍
Realtek RTL8723DU是一个高度集成的单片机802.11b/g/n 1T1R WLAN,和一个集成的蓝牙2.1/4.2单片机,USB 2.0多功能。它将一个WLAN MAC、一个支持1T1R的WLAN基带、BT协议栈(LM、LL和LE)、BT基带、调制解调器和WLAN/BT RF结合在单个芯片中。RTL8723DU为一个高性能集成的无线局域网和蓝牙控制器提供了一个完整的解决方案。RTL8723DU WLAN基带实现了1发射和1接收路径的正交频分多路复用(OFDM),并与802.11n规范兼容。其特征包括一个空间流传输,400ns的短保护间隔(GI),空间扩展,以及超过20MHz和40MHz带宽的传输。
简单来说就是这个芯片是用USB进行通信的,里面集合了wifi和蓝牙这两个功能。RTL8723DU该芯片的wifi或者bt都需要驱动程序才能运行,两者的驱动程序都是分开的,互不干扰。接下来分为wifi移植和蓝牙移植两个部分进行说明。
WiFi部分的移植
内核的配置:
1、配置支持USB设备
2、支持WIFI设备
CONFIG_HOSTAP=y
CONFIG_HOSTAP_FIRMWARE=y
CONFIG_HOSTAP_FIRMWARE_NVRAM=y
3、支持IEEE 802.11
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=y
4、将wifi的驱动程序移植到kernel上并且加载。将驱动包拷贝到kernel/drivers/net/wireless/realtek/路径上
5、修改当前目录下的Makefile和Kconfig文件
##Makefile
obj-$(CONFIG_RTLWIFI) += rtlwifi/
obj-$(CONFIG_RTL8XXXU) += rtl8xxxu/
obj-y += rtl8723du/
##Kconfig
source "drivers/net/wireless/realtek/rtl8723du/Kconfig"
6、重新编译即可
7、如果在Android系统的终端输入ifconfig -a ,看到有wlan0的wifi节点,证明wifi是成功加载上的了,但是在Android系统的界面上点击打开wifi却没有反应,这个有可能是没有把当前型号wifi的vid和pid添加到系统上。可以如下:
## frameworks\opt\net\wifi\libwifi_hal\rt_wifi_ctrl.cpp
static wifi_device supported_wifi_devices[] = {
{"RTL8188EU", "0bda:8179"},
{"RTL8188EU", "0bda:0179"},
{"RTL8723BU", "0bda:b720"},
{"RTL8723BS", "024c:b723"},
{"RTL8822BS", "024c:b822"},
{"RTL8723CS", "024c:b703"},
{"RTL8723DU", "0bda:d723"},/*添加RTL8723DU的id号进去*/
{"RTL8723DS", "024c:d723"},
{"RTL8188FU", "0bda:f179"},
{"RTL8822BU", "0bda:b82c"},
{"RTL8189ES", "024c:8179"},
{"RTL8189FS", "024c:f179"},
{"RTL8192DU", "0bda:8194"},
{"RTL8812AU", "0bda:8812"},
{"RTL8821CS", "024c:c821"},
{"RTL8822CU", "0bda:c82c"},
{"RTL8822CS", "024c:c822"},
{"SSV6051", "3030:3030"},
{"ESP8089", "6666:1111"},
{"AP6354", "02d0:4354"},
{"AP6330", "02d0:4330"},
{"AP6356S", "02d0:4356"},
{"AP6335", "02d0:4335"},
{"AP6255", "02d0:a9bf"},
{"RTL8822BE", "10ec:b822"},
{"MVL88W8977", "02df:9145"},
{"SPRDWL", "0000:0000"},
};
8、如果没有什么意外的话,应该能像手机一样正常连接wifi了。
蓝牙移植
蓝牙移植貌似比wifi移植难多了,好多文件都需要配置。
首先如果是使用RTL系列的蓝牙模块,他有特定的USB 驱动程序rtk_btusb.c进行与 Realtek 蓝牙芯片通信。
1、将rtk_btusb.c、rtk_btusb.h驱动文件放在kernel/driver/bluetooth路径下。
2、修改Makefile文件
obj-$(CONFIG_BT_RTKBTUSB) += rtk_btusb.o
3、修改Kconfig
config BT_RTKBTUSB
tristate "RTK HCI USB driver"
depends on USB
help
RTK Bluetooth HCI USB driver
4、kernel中menuconfig选中该选项
内核配置方面就到这里为止,接下来是Android系统方面的配置
1、Android系统对Bluetooth的权限
##Android源码\device\rockchip\rk356x\sepolicy\sepolicy_ebook\bluetooth.te
allow bluetooth mstar_device:chr_file rw_file_perms;
##Android源码\device\rockchip\rk356x\sepolicy_ebook\file_contexts\file_contexts
/dev/rtk_btusb u:object_r:mstar_device:s0
##Android源码\handware\realtek\rtkbt\vendor\etc\bluetooth\rtkbt.conf
#Indicate USB or UART driver bluetooth
BtDeviceNode=/dev/rtkbt_dev
#BtDeviceNode=?/dev/ttyS1:H5
2、重新编译整个SDK包即可。
结论
因为上述的移植过程是基于我的SDK包移植的,有可能在其他的源码包上移植会有点问题。如果可以的话,尽量找原厂或者供应商支持。
而且上述的wifi移植是可以在linux端通用的,亲测有效。但是蓝牙在linux端不行,不知道是不是驱动程序的问题。
驱动资源
WIFI驱动:wifi驱动资源,linux,android通用
蓝牙驱动:蓝牙驱动资源,只有在android下的kernel调通过