任务:在rk3288 android7.1 上移植配置 rtl8822cs 的蓝牙模块

思路:拿到厂商的蓝牙驱动,参考里面的 驱动移植步骤 (注: 需要注意的是,最新的驱动是否和 Bluetooth app 中 jni 的代码匹配,文档中提到的 .rc 和 .mk 中的配置,rk 原来的 sdk 中就已经做有配置,只需检查是否和 Broadcom 冲突即可,大部分不需要修改)

调试驱动打印:
内核rfkill 驱动:[BT_RFKILL] 对应着 kerne/net/rfkill/rfkill-bt.c (配置 蓝牙 gpio 口的驱动)
rtkbt 驱动:在 logcat 中

rk 平台修改:
在 /device 下有连个需要注意的和 蓝牙相关的 .mk 文件,具体修改脚本中有说明
device/rockchip/rk3288/wifi_bt.mk
device/rockchip/common/wifi_bt_common.mk
build/core/product.mk
蓝牙 app 所在目录
packages/apps/Bluetooth
(需要注意,查看 app 代码,发现蓝牙的 type 是通过 wifi 代码中的一个函数获取的,也就是说,在wifi 那边必须先配置好,蓝牙才能正确获取)

首先,配置 dts ,根据文档中的提示进行配置,主要就是对应 rfkill 驱动中的引脚,配正确了,都不会有什么问题。
在系统中通过指令 ,可以查看是否能控制bt_reg_on引脚

echo 1 > /sys/class/rfkill/rfkill0/state
echo 0 > /sys/class/rfkill/rfkill0/state

接下来是系统中的配置

device/rockchip/rk3288/wifi_bt.mk

-BOARD_CONNECTIVITY_VENDOR := Broadcom
-BOARD_CONNECTIVITY_MODULE := ap6xxx
+BOARD_CONNECTIVITY_VENDOR := RealTek
+BOARD_CONNECTIVITY_MODULE := rtl8822cs

build/core/product.mk (驱动移植文档中提到)

_product_stash_var_list += \
+BOARD_HAVE_BLUETOOTH_RTK \

packages/apps/Bluetooth/res/values/config.xml (根据情况修改,有的时候会有问题,有的时候不行也需要修改尝试)

-<bool name="profile_supported_rtkbt">false</bool>
+<bool name="profile_supported_rtkbt">true</bool>

rk 平台的 rtkbt 驱动是放在 hardware/realtek 中
使用厂商给的 rtkbt 驱动将其替换
需要特别注意:看是否真的需要替换,因为最新的驱动代码可能和系统上层的代码不匹配,我使用了厂商给的最新代码发现有加载库和模块失败的问题,怀疑是驱动中 c 文件的 函数名被修改,在 jni 中无法找到对应的函数导致失败。
解决方法:使用旧版本的驱动,在里面添加 rtl8822cs 对应的 fw 和 config 文件,成功解决。

适配蓝牙模块有一点很重要的就是加载入正确的 fw 和 config 文件。(具体是在 rtkbt 驱动中)
修改方法:

diff --git a/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/bt_vendor_rtk.c b/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/bt_vendor_rtk.c
index d42a995e32..8d5b3d3c3b 100755
--- a/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/bt_vendor_rtk.c
+++ b/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/bt_vendor_rtk.c
@@ -26,7 +26,7 @@
 
 #undef NDEBUG
 #define LOG_TAG "bt_vendor_uart"
-#define RTKBT_RELEASE_NAME "20170109_TV_ANDROID_7.x"
+#define RTKBT_RELEASE_NAME "20190717_BT_ANDROID_7.0"
 #include <utils/Log.h>
 #include "bt_vendor_rtk.h"
 #include "upio.h"
diff --git a/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/hardware.c b/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/hardware.c
index e9c47bfb03..6174d0003e 100755
--- a/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/hardware.c
+++ b/hardware/realtek/rtkbt/code/libbt-vendor/uart/src/hardware.c
@@ -27,7 +27,7 @@
  ******************************************************************************/
 
 #define LOG_TAG "bt_hwcfg"
-#define RTKBT_RELEASE_NAME "20170109_TV_ANDROID_7.x"
+#define RTKBT_RELEASE_NAME "20190717_BT_ANDROID_7.0"
 
 #include <utils/Log.h>
 #include <sys/types.h>
@@ -55,7 +55,7 @@
 /******************************************************************************
 **  Constants &  Macros
 ******************************************************************************/
-#define RTK_VERSION "4.1.1"
+#define RTK_VERSION "4.2.1"
 
 #ifndef BTHW_DBG
 #define BTHW_DBG FALSE
@@ -112,6 +112,7 @@ struct rtk_bt_vendor_config{
 #define HCI_VSC_DOWNLOAD_FW_PATCH               0xFC20
 #define HCI_VSC_READ_ROM_VERSION                0xFC6D
 #define HCI_VSC_READ_CHIP_TYPE                  0xFC61
+#define HCI_VENDOR_FORCE_RESET_AND_PATCHABLE    0xFC66
 
 #define HCI_VERSION_MASK_10     (1<<0)     //Bluetooth Core Spec 1.0b
 #define HCI_VERSION_MASK_11     (1<<1)     //Bluetooth Core Spec 1.1
@@ -138,6 +139,7 @@ struct rtk_bt_vendor_config{
 
 #define CONFIG_MAC_OFFSET_GEN_1_2       (0x3C)      //MAC's OFFSET in config/efuse for realtek generation 1~2 bluetooth chip
 #define CONFIG_MAC_OFFSET_GEN_3PLUS     (0x44)      //MAC's OFFSET in config/efuse for rtk generation 3+ bluetooth chip
+#define CONFIG_MAC_OFFSET_GEN_4PLUS     (0x30)      //MAC's OFFSET in config/efuse for rtk generation 4+ bluetooth chip
 
 #define HCI_EVT_CMD_CMPL_OPCODE_OFFSET          (3)     //opcode's offset in COMMAND Completed Event
 #define HCI_EVT_CMD_CMPL_STATUS_OFFSET          (5)     //status's offset in COMMAND Completed Event
@@ -300,14 +302,18 @@ static patch_info patch_table[] = {
     {0x8723,            ~(HCI_VERSION_MASK_21),  ~(1<<0xd),             CHIP_TYPE_MASK_ALL,  1<<1,                  "rtl8723bs_fw",         "rtl8723bs_config",     CONFIG_MAC_OFFSET_GEN_1_2,  MAX_PATCH_SIZE_24K},     //Rtl8723BS
 //    {0x8723,            ~(HCI_VERSION_MASK_21),  ~(1<<0xd),             CHIP_TYPE_MASK_ALL,  1<<1,                  "rtl8723bs_VQ0_fw",     "rtl8723bs_VQ0_config", CONFIG_MAC_OFFSET_GEN_1_2}, //Rtl8723BS_VQ0
     {0x8821,            HCI_VERSION_MASK_ALL,    ~(1<<0xc),             CHIP_TYPE_MASK_ALL,  1<<2,                  "rtl8821as_fw",         "rtl8821as_config",     CONFIG_MAC_OFFSET_GEN_1_2,  MAX_PATCH_SIZE_24K},     //Rtl8821AS
-    {0x8761,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL,  1<<3,                  "rtl8761at_fw",         "rtl8761at_config",     CONFIG_MAC_OFFSET_GEN_1_2,  MAX_PATCH_SIZE_24K},     //Rtl8761AW
+//    {0x8761,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL,  1<<3,                  "rtl8761at_fw",         "rtl8761at_config",     CONFIG_MAC_OFFSET_GEN_1_2,  MAX_PATCH_SIZE_24K},     //Rtl8761AW
+    {0x8761,            HCI_VERSION_MASK_ALL,    ~(1<<0xb),             CHIP_TYPE_MASK_ALL,  1<<3,                  "rtl8761at_fw",         "rtl8761at_config",     CONFIG_MAC_OFFSET_GEN_1_2,  MAX_PATCH_SIZE_24K},     //Rtl8761AW
+    {0x8761,            HCI_VERSION_MASK_ALL,    (1<<0xb),              CHIP_TYPE_MASK_ALL,  1<<14,                 "rtl8761bt_fw",         "rtl8761bt_config",     CONFIG_MAC_OFFSET_GEN_4PLUS,  MAX_PATCH_SIZE_40K},     //Rtl8761BW
     {0x8723,            HCI_VERSION_MASK_21,     HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL,  1<<4,                  "rtl8703as_fw",         "rtl8703as_config",     CONFIG_MAC_OFFSET_GEN_1_2,  MAX_PATCH_SIZE_24K},     //Rtl8703AS
 
     {0x8703,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, 1<<7,                1<<6,                  "rtl8703bs_fw",         "rtl8703bs_config",     CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_24K},     //Rtl8703BS
     {0x8703,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, 1<<5,                1<<7,                  "rtl8723cs_xx_fw",      "rtl8723cs_xx_config",  CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_24K},     //rtl8723cs_xx
     {0x8703,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, 1<<3,                1<<7,                  "rtl8723cs_cg_fw",      "rtl8723cs_cg_config",  CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_24K},     //rtl8723cs_cg
     {0x8703,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, 1<<4,                1<<7,                  "rtl8723cs_vf_fw",      "rtl8723cs_vf_config",  CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_24K},     //rtl8723cs_vf
-    {0x8822,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL,  1<<8,                  "rtl8822bs_fw",         "rtl8822bs_config",     CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_24K},     //Rtl8822BS
+//    {0x8822,            HCI_VERSION_MASK_ALL,    HCI_REVISION_MASK_ALL, CHIP_TYPE_MASK_ALL,  1<<8,                  "rtl8822bs_fw",         "rtl8822bs_config",     CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_24K},     //Rtl8822BS
+    {0x8822,            HCI_VERSION_MASK_ALL,    ~(1<<0xc),             CHIP_TYPE_MASK_ALL,  1<<8,                  "rtl8822bs_fw",         "rtl8822bs_config",     CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_24K},     //Rtl8822BS   
+    {0x8822,            HCI_VERSION_MASK_ALL,    (1<<0xc),              CHIP_TYPE_MASK_ALL,  1<<13,                 "rtl8822cs_fw",         "rtl8822cs_config",     CONFIG_MAC_OFFSET_GEN_4PLUS,  MAX_PATCH_SIZE_40K},     //Rtl8822CS 
 
     {0x8723,            HCI_VERSION_MASK_ALL,    (1<<0xd),              ~(1<<7),           1<<9,                    "rtl8723ds_fw",         "rtl8723ds_config",     CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_40K}, //Rtl8723ds
     {0x8723,            HCI_VERSION_MASK_ALL,    (1<<0xd),              1<<7,              1<<9,                    "rtl8703cs_fw",         "rtl8703cs_config",     CONFIG_MAC_OFFSET_GEN_3PLUS,  MAX_PATCH_SIZE_40K}, //Rtl8703cs
diff --git a/hardware/realtek/rtkbt/rtkbt.mk b/hardware/realtek/rtkbt/rtkbt.mk
index cc8c869b6c..4cba306bd1 100755
--- a/hardware/realtek/rtkbt/rtkbt.mk
+++ b/hardware/realtek/rtkbt/rtkbt.mk
@@ -53,6 +53,8 @@ PRODUCT_COPY_FILES += \
        $(LOCAL_PATH)/system/etc/firmware/rtl8822b_fw:system/etc/firmware/rtl8822b_fw \
        $(LOCAL_PATH)/system/etc/firmware/rtl8822bs_config:system/etc/firmware/rtl8822bs_config \
        $(LOCAL_PATH)/system/etc/firmware/rtl8822bs_fw:system/etc/firmware/rtl8822bs_fw \
+       $(LOCAL_PATH)/system/etc/firmware/rtl8822cs_config:system/etc/firmware/rtl8822cs_config \
+       $(LOCAL_PATH)/system/etc/firmware/rtl8822cs_fw:system/etc/firmware/rtl8822cs_fw \

        $(LOCAL_PATH)/system/lib/hw/audio.vr_bee_hidraw.default.so:system/lib/hw/audio.vr_bee_hidraw.default.so \
        $(LOCAL_PATH)/system/lib/rtkbt/3dd_service.so:system/lib/rtkbt/3dd_service.so \
        $(LOCAL_PATH)/system/lib/rtkbt/autopair_huawei.so:system/lib/rtkbt/autopair_huawei.so \

需要注意: 对应目录下是否会有对应所需要的 fw 和 config 文件。

由于该模组是 UART 蓝牙,所以还需要检查 rtkbt\system\etc\bluetooth\rtkbt.conf 中的配置对应的是 usb 还是 uart

如果是 usb 蓝牙,还需要注意一下文件,因为这次调的是 uart 蓝牙,所以没有很注意,具体在驱动移植文档中有相关说明
kernel/drivers/bluetooth/rtk_btusb.c
kernel/drivers/bluetooth/rtk_btcoex.c

文档中提到,要确保 bluetooth.default.so 是正确的,将 BoardConfig 中的 BOARD_HAVE_BLUETOOTH_XXX 全部设置为 false 或者删除。
将 通 过 命 令

rm –rf out/target/product/{product}/obj/*/*bt* 
out/target/product/{product}/obj/*/*luetooth* out/target/product/{product}/obj/*/*hci* 
out/target/product/{product}/obj/*/*a2dp* out/target/product/{product}/system/*

删除掉之前编译出来的文件
我在删除相关库后出现了编译出错,不过的现象
解决方案:
将 packages/apps/Bluetooth 中的代码 删掉重新同步,推断原因可能是库没有删正确或者删全,重新编译的时候出现重定义的错误。

继续查看,会发现和 rtkbt 相关的编译,都在 /device/…/device.mk 中
bluetooth.default.so 库的编译其实是在 packages/apps/Bluetooth 中,所以暂时不知道和 库那边是有什么关系