摘要:
在移植时请注意,因为Realtek发布的移植代码和文档不是针对Freescale平台的,所以首先看一下,目前使用的平台是否已经支持BT和WIFI功能(可能不是我们要移植的模块)。
一般情况下,原厂发布BSP都支持BT和WIFI功能,也就是说Android OS部分已经完整的包含BT和WIFI功能,只要适配驱动和HAL即可。我们针对RTL8723BU的BT和WIFI的移植就是基于这个思路去移植的。
因为I.MX6 DQ的BSP已经支持BT模块ath3k,如果硬件使用ath3k的UART模块,那么平台的BT功能是OK的。而WIFI部分平台是支持RTL8723AS的SDIO模块,也就是说硬件使用RTL8723AS的SDIO接口的WIFI模块,那么平台是已经支持了WIFI功能。
基于这个情况,我们将RTL8723BU的BT和WIFI二合一模块移植BT和WIFI功能,只需要适配驱动和HAL即可实现。
1. 资源的获取
从Realtek提供的FTP上下载
20140714_RTL8723BU_WiFi_linux_v4.3.6_11841_BT_android4.4_V2.19_P23_FW_svn12197-BTCOEX20140507-4E40文件包,里面包含:
WIFI相关的文件:
RTL8723BU_WiFi_linux_v4.3.6_11841.20140714_BTCOEX20140507-4E40.zip
BT相关的文件:
20140530_RTL8723BU_BT_android4.4_V2.19_P23_FW_svn12197-BTCOEX20140507-4E40.zip
涉及到的补丁文件
Wi-Fi_patch/
2. RTL8723BU WIFI移植
2.2 驱动部分的移植
2.2.1驱动源码文件
减压RTL8723BU_WiFi_linux_v4.3.6_11841.20140714_BTCOEX20140507-4E40.zip,将里面的drivers/rtl8723BU_WiFi_linux_v4.3.6_11841.20140711_BTCOEX20140507-4E40.tar.gz加压到/kernel_imx/drivers/net/wireless/rtl8723bu/文件夹下面,修改驱动本身的配置和内核的配置文件,如下:
2.2.2修改驱动本身的配置
- 修改/kernel_imx/drivers/net/wireless/rtl8723bu/Makefile
添加:
CONFIG_PLATFORM_FS_MX6Q = y
ifeq ($(CONFIG_PLATFORM_FS_MX6Q), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
EXTRA_CFLAGS+= -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
EXTRA_CFLAGS += -DCONFIG_P2P_IPS
ARCH := arm
CROSS_COMPILE := ~/s6000/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
KSRc := ~/s6000/kernel_imx
MODULE_NAME := 8723bu
Endif
- 修改/kernel_imx/drivers/net/wireless/rtl8723bu/include/autoconf.h
使能以下配置:
#define CONFIG_IOCTL_CFG80211 1
//#define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER
#define CONFIG_CONCURRENT_MODE 1
#define CONFIG_P2P_IPS
2.2.3修改内核配置:
修改/kernel_imx/drivers/net/wireless/Makefile文件,添加:
obj-$(CONFIG_RTL8723BU) += rtl8723bu/
修改/kernel_imx/drivers/net/wireless/Kconfg文件,添加:
source "drivers/net/wireless/rtl8723bu/Kconfig"
修改/kernel_imx/arch/arm/config/imx6_android_defconfig文件,添加:
#CONFIG_RTL8192CE=m
#CONFIG_RTL8723AS=m
CONFIG_RTL8723BU=m
2.3 HAL层修改
修改/hardware/libhardware_legacy/wifi/wifi_unite.c,将
//#define WIFI_DRIVER_MODULE_PATH_REALTEK "/system/lib/modules/8723as.ko"
//#define WIFI_DRIVER_MODULE_NAME_REALTEK "8723as"
#define WIFI_DRIVER_MODULE_PATH_REALTEK "/system/lib/modules/8723bu.ko"
#define WIFI_DRIVER_MODULE_NAME_REALTEK "8723bu"
去掉wifi_load_driver()中的
422行 //WifiVendor = get_wifi_vendor_info();
2.4 Android OS部分的配置
修改编译内核拷贝模块修改成如下方式:
TARGET_KERNEL_MODULES := \
kernel_imx/drivers/net/wireless/rtl8723bu/8723bu.ko:system/lib/modules/8723bu.ko \
kernel_imx/net/wireless/cfg80211.ko:system/lib/modules/cfg80211_realtek.ko
2.5 编译和测试
在源码的顶层目录执行
./s6000_build.sh
编译完成后下载boot.img和system.img启动系统,之后在主界面打开WIFI,就可以搜索到附件的热点了。
总结:因为WIFI热点部分需要3G网络的支持,目前平台的3G模块还没调试,所以等3G模块调试完毕之后,再来调试,并且我们的POS产品并没有特殊的要求WIFI热点。
3. RTL8723BU BT移植
3.1 驱动文件的修改和内核配置
3.1.1 驱动资源文件
减压获取到的资料包中的20140530_RTL8723BU_BT_android4.4_V2.19_P23_FW_svn12197-BTCOEX20140507-4E40.zip文件,内核部分的代码20140530_RTL8723BU_BT_android4.4_V2.19_P23_FW_svn12197-BTCOEX20140507-4E40.zip/kernel/
3.1.2 合并驱动和内核驱动配置
- 复制获取的BT资料下面
kernel/drivers/bluetooth/rtk_btusb.h
kernel/drivers/bluetooth/rtk_btusb.h
到I.MX6 DQ平台的kernel_imx/drivers/bluetooth/下面.
- 修改kernel_imx/drivers/bluetooth/Makefile,添加
obj-$(CONFIG_BT_RTKBTUSB) += rtk_btusb.o
修改kernel_imx/drivers/buletooth/Kconfig,添加
config BT_RTKBTUSB
tristate "RTK HCI USB driver"
depends on USB
help
RTK Bluetooth HCI USB driver
修改kernel_imx/arch/arm/configs/imx6_android_defconfig
CONFIG_BT_RTKBTUSB=m
去掉UART口的ath3k蓝牙模块的驱动配置,如下:
CONFIG_BT_HCIUART is not set
CONFIG_BT_HCIUART_ATH3K is not set
编译内核,将RTL8723BU的驱动编译成rtk_btusb.ko,将rtk_btusb.ko拷贝到/device/fsl/sabresd_dq/bluetooth/目录,后面系统启动加载模块要用。
3.2 HAL层的设置
HAL层的Realtek提供的文件在20140530_RTL8723BU_BT_android4.4_V2.19_P23_FW_svn12197-BTCOEX20140507-4E40.zip/hardware/目下。
拷贝hardware/realtek/bt到我们的hardware/realtek/bt/
修改hardware/realtek/bt/libbt-vendor/include/bt_vendor_rtk.h,如下:
#define BLUETOOTH_UART_DEVICE_PORT "/dev/ttyO1" 修改成
#define BLUETOOTH_UART_DEVICE_PORT "/dev/rtk_btusb"
复制hardware/realtek/bt/libbt-vendor/include/vnd_dalmore.txt到
hardware/realtek/bt/libbt-vendor/include/vnd_sabresd_6dq.txt
修改hardware/imx/libbt-ath3k/Android.mk,如下:
#ifneq ($(BOARD_USE_AR3K_BLUETOOTH),)
ifeq ($(BOARD_USE_AR3K_BLUETOOTH),true)
让系统编译时,不编译ath3k的HAL层,否则会跟RTL8723BU的HAL引起冲突,编译不过去。
3.3 Android OS的配置
1) 修改device/fsl\sabresd_6dq/BoardConfig.mk,如下:
#BOARD_USE_AR3K_BLUETOOTH := true
BOARD_USE_AR3K_BLUETOOTH := false ----->去掉ath3k HAL层编译
BOARD_HAVE_BLUETOOTH_RTK := true ------->添加RTL8723BU HAL编译
2) 修改device/fsl/imx6/sabresd_6dq.mk,添加如下:
#Realtek add start
$(call inherit-product, hardware/realtek/bt/firmware/rtl8723a/device-rtl.mk)
$(call inherit-product, hardware/realtek/bt/firmware/rtl8723b/device-rtl.mk)
$(call inherit-product, hardware/realtek/bt/firmware/rtl8821a/device-rtl.mk)
$(call inherit-product, hardware/realtek/bt/firmware/rtl8761a/device-rtl.mk)
#realtek add end
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.bluetooth.xml:system/etc/permissions/android.hardware.bluetooth.xml \ ------->添加这行
frameworks/native/data/etc/android.hardware.bluetooth_le.xml:system/etc/permissions/android.hardware.bluetooth_le.xml \
- 修改device/fsl/imx6/imx6.mk,添加:
PRODUCT_PACKAGES += \
Email \
Bluetooth \ ------->添加这行,让系统将bluetooth.apk编译进去
PRODUCT_COPY_FILES += \
device/fsl/justtide/gprs-3g/libhuawei-ril.so:system/lib/libhuawei-ril.so \
device/fsl/sabresd_6dq/bluetooth/rtk_btusb.ko:system/lib/modules/rtk_btusb.ko ---->添加这行PRODUCT_DEFAULT_PROPERTY_OVERRIDES := \
persist.sys.usb.config=mtp \
ro.product.8723.bt=use ------->添加这行
- 修改device/fsl/imx6/etc/ueventd.freescale.rc,添加
/dev/rtk_btusb 0660 bluetooth net_bt_stack
- 修改device/fsl/imx6/etc/init.rc ,将
# Prepare for bluetooth
chmod 665 /sys/class/rfkill/rfkill0/state
chown bluetooth bluetooth /sys/class/rfkill/rfkill0/state
write /sys/class/rfkill/rfkill0/state 0
修改成:
# Prepare for bluetooth
#chmod 665 /sys/class/rfkill/rfkill0/state
#chown bluetooth bluetooth /sys/class/rfkill/rfkill0/state
#write /sys/class/rfkill/rfkill0/state 1
# bluetooth realtek config init
# change back to bluetooth from system
chown bluetooth net_bt_stack /data/misc/bluetooth
mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack
#power up/down/ interface
chmod 665 /sys/class/rfkill/rfkill0/state
chmod 665 /sys/class/rfkill/rfkill0/type
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state
chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type
write /sys/class/rfkill/rfkill0/state 1
# bluetooth MAC address programming
chown bluetooth net_bt_stack ro.bt.bdaddr_path
chown bluetooth net_bt_stack /system/etc/bluetooth
chown bluetooth net_bt_stack /data/misc/bluetooth
setprop ro.bt.bdaddr_path "/data/misc/bluetooth/bdaddr"
# USB device
insmod /system/lib/modules/rtk_btusb.ko
chmod 0660 /dev/rtk_btusb
chown bluetooth net_bt_stack /dev/rtk_btusb
write /sys/class/rfkill/rfkill0/state 0
#end realtek configure
其它部分不需要修改。修改完成后回到源码的顶层目录,运行
./s6000_build.sh
命令,编译完成后下载boot.img和system.img,启动系统之后在系统主界面打开蓝牙就可以搜索到附件的蓝牙设备了,点击搜索到的蓝牙设备进行匹配即可。经过测试是匹配成功了的,并且可以接收到手机发送来的文件。到此BT就移植完成了,其它具体的一些协议等后续APP使用到在具体的测试。