任务:在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 中,所以暂时不知道和 库那边是有什么关系