iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >RK3588 Android12调试USB 蓝牙模块
  • 897
分享到

RK3588 Android12调试USB 蓝牙模块

android网络网络协议 2023-09-12 09:09:56 897人浏览 安东尼
摘要

一、蓝牙的架构 Android4.2 之后采用 bluedroid 作为协议;整体由 bluetooth.apk,bluedroid ,libbt-vendor 三个 部 分 组 成 。 blue

一、蓝牙的架构

  Android4.2 之后采用 bluedroid 作为协议;整体由 bluetooth.apk,bluedroid ,libbt-vendor 三个 部 分 组 成 。
  • bluetooth.apk :作 为 蓝 牙 服 务 进 程 , 通 过 libblueooth_jni 层 获 取bluetooth*.default.so 提 供 的bt_interface_t 控 制 接 口 并 状 态 与 数 据 回 调 注 册 到bluetooth*.default.so;完成对蓝牙模块的控制与数据接收;
  • libbluetooth:主要是bluedroid的蓝牙协议栈的具体实现,向下调用libbt-hci的接口加载**libbt-vendor;**向上供libblueooth_jni的回调;
  • **libbt-vendor *完成对蓝牙模块硬件初始化与控制(物理通讯接口初始化,固件下载,供电控制)RK平台通过判断wifi+Bt模块的type,在libbuetooth_jni层选择加载不同适配厂商协议栈;并在libbt-hci中根据模块类型加载不同厂家模块的libbt-vendor.so,完成动态适配模块。

Android蓝牙框架图.png
RK 平台通过判断模块的 type,在 libbuetooth_jni 层选择加载不同适配厂商协议栈;并在 libbt-hci 中根据模块类型加载不同厂家模块的 libbt-vendor*.so,完成动态适配模块。

二、USB 蓝牙模块的调试

这里选项的是RTL8723DU的一款USB蓝牙适配器,下面将从kernel开始一步步看下适配过程;

2.1 kernel部分

首先,将Realtek提供的蓝牙驱动文件rtk_btusb.h和rtk_btusb.c拷贝到kernel的drivers/bluetooth/目录下:

kernel-5.10/drivers/bluetooth/rtk_btusb.ckernel-5.10/drivers/bluetooth/rtk_btusb.h

修改kernel的drivers/bluetooth/目录下的文件“Kconfig” 和“Makefile”。

config BT_RTKBTUSB    tristate "RTK HCI USB driver"    depends on USB    help       RTK Bluetooth HCI USB driver
obj-$(CONFIG_BT_RTKBTUSB)+= rtk_btusb.o

平台对应的defconfig文件添加Realtek BT Chip支持的宏定义,这里是dten_ribeye_me_pro.config文件

diff --git a/kernel-5.10/arch/arm64/configs/dten_ribeye_me_pro.config b/kernel-5.10/arch/arm64/configs/dten_ribeye_me_pro.configindex 54246f39..6894e782 100755--- a/kernel-5.10/arch/arm64/configs/dten_ribeye_me_pro.config+++ b/kernel-5.10/arch/arm64/configs/dten_ribeye_me_pro.config@@ -34,3 +34,5 @@ CONFIG_RTC_DRV_AT8563=y #DTEN Codec AD82088 CONFIG_SND_SOC_AD82088=y CONFIG_BACKLIGHT_PWM=n+# Add for usb bluetooth adapter+CONFIG_BT_RTKBTUSB=y

2.2 增加设备节点以及权限

device/rockchip/common目录:添加一些节点的权限和一些宏控开关
在device/rockchip/common/init.connectivity.rc文件(一般rk平台代码已经添加):

cfliu@sw-eng:RKOverlay$ gd device/rockchip/common/init.connectivity.rcdiff --git a/device/rockchip/common/init.connectivity.rc b/device/rockchip/common/init.connectivity.rcindex 82603ec0..db2e7176 100755--- a/device/rockchip/common/init.connectivity.rc+++ b/device/rockchip/common/init.connectivity.rc@@ -8,6 +8,8 @@ on zyGote-start     chown bluetooth net_bt /proc/bluetooth/sleep/lpm     chown bluetooth net_bt /proc/bluetooth/sleep/btwrite     +    # USB device+    insmod /system/lib/modules/rtk_btusb.ko     chmod 0660 /dev/rtk_btusb     chown bluetooth net_bt /dev/rtk_btusb     chmod 0660 /dev/rtkbt_dev

在device/rockchip/common/wifi_bt_common.mk文件(一般rk平台代码已经添加),这个先关闭BCM的芯片,防止BCM的影响。

diff --git a/device/rockchip/common/wifi_bt_common.mk b/device/rockchip/common/wifi_bt_common.mkindex 23149e85..af3c7017 100644--- a/device/rockchip/common/wifi_bt_common.mk+++ b/device/rockchip/common/wifi_bt_common.mk@@ -53,7 +53,7 @@ WIFI_DRIVER_FW_PATH_STA     := "/vendor/etc/firmware/fw_bcm4329.bin" WIFI_DRIVER_FW_PATH_P2P     := "/vendor/etc/firmware/fw_bcm4329_p2p.bin" WIFI_DRIVER_FW_PATH_AP      := "/vendor/etc/firmware/fw_bcm4329_apsta.bin" BOARD_HAVE_BLUETOOTH := true-BOARD_HAVE_BLUETOOTH_BCM := true+BOARD_HAVE_BLUETOOTH_BCM := false BOARD_HAVE_BLUETOOTH_RTK := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR ?= device/rockchip/$(TARGET_BOARD_PLATFORM)/bluetooth endif

2.3 libbt-vendor.so的配置

在hardware/realtek目录:HAL层添加蓝牙协议栈的代码和对应的libbt-vendor.so的源代码,libbt-vendor完成对蓝牙模块硬件初始化与控制(物理通讯接口初始化,固件下载,供电控制)

@sw-eng:RK3588S$ cd hardware/realtek/rtkbt/vendor/firmware@sw-eng:firmware$ @sw-eng:firmware$ lsBT_Firmware.mk        rtl8723a_fw              rtl8723c_fw          rtl8723f_config     rtl8761at_config        rtl8761cs_fw      rtl8822bs_configfw_info.txt           rtl8723as_config         rtl8723cs_cg_config  rtl8723f_fw         rtl8761at_fw            rtl8821a_config   rtl8822bs_fwreadme.txt            rtl8723as_fw             rtl8723cs_cg_fw      rtl8723fs_config    rtl8761au8192ee_fw      rtl8821a_fw       rtl8822c_configrtl8703as_config      rtl8723b_config          rtl8723cs_vf_config  rtl8723fs_fw        rtl8761au8812ae_fw      rtl8821as_config  rtl8822c_fwrtl8703as_fw          rtl8723b_config_2Ant_S0  rtl8723cs_vf_fw      rtl8725a_config     rtl8761au_fw            rtl8821as_fw      rtl8822cs_configrtl8703bs_config      rtl8723b_fw              rtl8723cs_xx_config  rtl8725a_fw         rtl8761aw8192eu_config  rtl8821c_config   rtl8822cs_fwrtl8703bs_fw          rtl8723bs_config         rtl8723cs_xx_fw      rtl8725as_config    rtl8761aw8192eu_fw      rtl8821c_fw       rtl8852as_configrtl8703cs_config      rtl8723bs_fw             rtl8723d_config      rtl8725as_fw        rtl8761b_config         rtl8821cs_config  rtl8852as_fwrtl8703cs_fw          rtl8723bs_VQ0_config     rtl8723d_fw          rtl8761a_config     rtl8761b_fw             rtl8821cs_fw      rtl8852au_configrtl8723a_config       rtl8723bs_VQ0_fw         rtl8723ds_config     rtl8761at8192ee_fw  rtl8761bt_config        rtl8822b_config   rtl8852au_fwrtl8723a_config_addr  rtl8723bu_config         rtl8723ds_fw         rtl8761at8812ae_fw  rtl8761bt_fw            rtl8822b_fwcfliu@sw-eng:firmware$ 

最终会通过mk文件hardware/realtek/rtkbt/rtkbt.mk拷贝到机器的以下目录,打开蓝牙的时候会去加载fw:

ifeq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)), tablet)BT_FIRMWARE_FILES := $(shell ls $(CUR_PATH)/vendor/firmware)PRODUCT_COPY_FILES += \$(foreach file, $(BT_FIRMWARE_FILES), $(CUR_PATH)/vendor/firmware/$(file):$(TARGET_COPY_OUT_VENDOR)/etc/firmware/$(file))

最终拷贝到设备上为:/vendor/etc/firmware

pro:/vendor/etc/firmware # ls4343A0.hcd                       bcm4329.hcd                  fw_awnb108_ap.bin           fw_bcm43438a0.bin                fw_cyw43438.bin       nvram_ap6212a.txt    rtl8703bs_config         rtl8723ds_config        rtl8821a_fwAP6275P_NVRAM_V1.1_20200702.txt  bcm43341b0.hcd               fw_bcm40181a2.bin           fw_bcm43438a0_apsta.bin          fw_cyw43455.bin       nvram_ap6214.txt     rtl8703bs_fw             rtl8723ds_fw            rtl8821as_configBCM20710A1.hcd                   bcm4339a0.hcd                fw_bcm40181a2_apsta.bin     fw_bcm43438a0_p2p.bin            fw_info.txt           nvram_ap6214a.txt    rtl8703cs_config         rtl8723f_config         rtl8821as_fwBCM4330B1.hcd                    bcm43438a0.hcd               fw_bcm40183b2.bin           fw_bcm43438a1.bin                mali_csffw.bin        nvram_ap6216.txt     rtl8703cs_fw             rtl8723f_fw             rtl8821c_configBCM4343A0.hcd                    bcm43438a1.hcd               fw_bcm40183b2_ag.bin        fw_bcm43438a1_apsta.bin          nh660.hcd             nvram_ap6233f.txt    rtl8723a_config          rtl8723fs_config        rtl8821c_fwBCM4343A1.hcd                    bcm4354a1.hcd                fw_bcm40183b2_ag_apsta.bin  fw_bcm43438a1_p2p.bin            nvram.txt             nvram_ap6236.txt     rtl8723a_config_addr     rtl8723fs_fw            rtl8821cs_configBCM4343B0.hcd                    clm_bcm43752a2_ag.blob       fw_bcm40183b2_ag_p2p.bin    fw_bcm43455c0_ag.bin             nvram_4330.txt        nvram_ap6255.txt     rtl8723a_fw              rtl8725a_config         rtl8821cs_fwBCM4345C0.hcd                    clm_bcm43752a2_pcie_ag.blob  fw_bcm40183b2_apsta.bin     fw_bcm43455c0_ag_apsta.bin       nvram_4330_oob.txt    nvram_ap6256.txt     rtl8723as_config         rtl8725a_fw             rtl8822b_configBCM4345C5.hcd                    clm_bcm4375b4_pcie_ag.blob   fw_bcm40183b2_p2p.bin       fw_bcm43455c0_ag_p2p.bin         nvram_AP6181.txt      nvram_ap6275hh3.txt  rtl8723as_fw             rtl8725as_config        rtl8822b_fwBCM4354A2.hcd                    config.txt                   fw_bcm43241b4_ag.bin        fw_bcm43456c5_ag.bin             nvram_AP6210.txt      nvram_ap6275s.txt    rtl8723b_config          rtl8725as_fw            rtl8822bs_configBCM4356A2.hcd                    esp32                        fw_bcm43241b4_ag_apsta.bin  fw_bcm43456c5_ag_apsta.bin       nvram_AP6210_24M.txt  nvram_ap62x2.txt     rtl8723b_config_2Ant_S0  rtl8761a_config         rtl8822bs_fwBCM4359C0.hcd                    fw_RK901.bin                 fw_bcm43241b4_ag_p2p.bin    fw_bcm4354a1_ag.bin              nvram_AP6234.txt      nvram_ap6354.txt     rtl8723b_fw              rtl8761at8192ee_fw      rtl8822c_configBCM4362A2.hcd                    fw_RK901a0.bin               fw_bcm4330.bin              fw_bcm4354a1_ag_apsta.bin        nvram_AP6275P.txt     nvram_ap6356.txt     rtl8723bs_VQ0_config     rtl8761at8812ae_fw      rtl8822c_fwBCM4375B1.hcd                    fw_RK901a0_apsta.bin         fw_bcm4330_apsta.bin        fw_bcm4354a1_ag_p2p.bin          nvram_AP6330.txt      nvram_ap6356s.txt    rtl8723bs_VQ0_fw         rtl8761at_config        rtl8822cs_configBT_Firmware.mk                   fw_RK901a2.bin               fw_bcm43341b0_ag.bin        fw_bcm4356a2_ag.bin              nvram_AP6335.txt      nvram_ap6398s.txt    rtl8723bs_config         rtl8761at_fw            rtl8822cs_fwRT2870AP.dat                     fw_RK901a2_apsta.bin         fw_bcm43341b0_ag_apsta.bin  fw_bcm4356a2_ag_apsta.bin        nvram_AP6441.txt      nvram_ap6398sa.txt   rtl8723bs_fw             rtl8761au8192ee_fw      rtl8852as_configRT2870APCard.dat                 fw_RK901a2_p2p.bin           fw_bcm43341b0_ag_p2p.bin    fw_bcm4356a2_ag_p2p.bin          nvram_AP6476.txt      nvram_ap6452.txt     rtl8723bu_config         rtl8761au8812ae_fw      rtl8852as_fwRT2870STA.dat                    fw_RK903.bin                 fw_bcm4334b1_ag.bin         fw_bcm4359c0_ag.bin              nvram_AP6493.txt      nvram_awnb108.txt    rtl8723c_fw              rtl8761au_fw            rtl8852au_configRT2870STACard.dat                fw_RK903_ag.bin              fw_bcm4334b1_ag_apsta.bin   fw_bcm4359c0_ag_apsta.bin        nvram_B23.txt         nvram_azw256.txt     rtl8723cs_cg_config      rtl8761aw8192eu_config  rtl8852au_fwawnb108.hcd                      fw_RK903_ag_apsta.bin        fw_bcm4334b1_ag_p2p.bin     fw_bcm4359c0_ag_p2p.bin          nvram_GB86302I.txt    nvram_azw372.txt     rtl8723cs_cg_fw          rtl8761aw8192eu_fw      ssv6051-sw.binbcm20710a1.hcd                   fw_RK903_ag_p2p.bin          fw_bcm4339a0_ag.bin         fw_bcm43752a2_ag.bin             nvram_RK901.txt       otp.bin.z77          rtl8723cs_vf_config      rtl8761b_config         ssv6051-wifi.cfgbcm20710a1_24M.hcd               fw_RK903_p2p.bin             fw_bcm4339a0_ag_apsta.bin   fw_bcm43752a2_ag_apsta.bin       nvram_RK903.cal       readme.txt           rtl8723cs_vf_fw          rtl8761b_fw             wifi_efuse_8189e.mapbcm20710a1_26M.hcd               fw_RK903b2.bin               fw_bcm4339a0_ag_p2p.bin     fw_bcm43752a2_pcie_ag.bin        nvram_RK903.txt       rk903.hcd            rtl8723cs_xx_config      rtl8761bt_config        wifi_efuse_8723bs-vq0.mapbcm2076b1.hcd                    fw_RK903b2_apsta.bin         fw_bcm43436b0.bin           fw_bcm43752a2_pcie_ag_apsta.bin  nvram_RK903_26M.cal   rk903_26M.hcd        rtl8723cs_xx_fw          rtl8761bt_fw            wifi_efuse_8723cs.mapbcm40183b2.hcd                   fw_RK903b2_p2p.bin           fw_bcm43436b0_apsta.bin     fw_bcm4375b4_pcie_ag.bin         nvram_WL211.txt       rtl8703as_config     rtl8723d_config          rtl8761cs_fw            wifi_efuse_8723ds.mapbcm43241b4.hcd                   fw_awnb108.bin               fw_bcm43436b0_p2p.bin       fw_bcm4375b4_pcie_ag_apsta.bin   nvram_ap6212.txt      rtl8703as_fw         rtl8723d_fw              rtl8821a_config         wifi_efuse_8821cs.map

2.4 根据type选择具体的vendor库

部分HAL层对应的libbt-vendor.so的源代码浅析:
首先是bluedroid 蓝牙协议栈libbt-hci【原生蓝牙协议栈】通过system/bt/hci/src/hci_layer_android.cc的hci_initialize函数,调用interfaces/bluetooth/1.0/default/vendor_interface.cc中的initialize函数,进而调用open函数打开对应so库。

//interfaces/bluetooth/1.0/default/vendor_interface.ccstatic const char* VENDOR_LIBRARY_NAME = "libbt-vendor.so";static const char* VENDOR_REALTEK_LIBRARY_NAME = "libbt-vendor-realtek.so";static char wifi_type[64] = {0};extern "C" int check_wifi_chip_type_string(char *type);bool VendorInterface::Open(InitializeCompleteCallback initialize_complete_cb,                           PacketReadCallback event_cb,                           PacketReadCallback acl_cb,                           PacketReadCallback sco_cb,                           PacketReadCallback iso_cb) {  initialize_complete_cb_ = initialize_complete_cb;  char vendor_lib_name[32];  // Initialize vendor interface  if (wifi_type[0] == 0)      //获取当前wifi芯片的type加载不同的so库,目前这个接口有权限问题,待进一步分析  check_wifi_chip_type_string(wifi_type);  if ((0 == strncmp(wifi_type, "RTL", 3)) ||      (0 == strncmp(wifi_type, "SSV", 3))) { // for ssv6051 wifi + rtl8761 bt      //此时加载的是libbt-vendor-realtek.so    strcpy(vendor_lib_name, VENDOR_REALTEK_LIBRARY_NAME);  } else {      //此时加载的是libbt-vendor.so    strcpy(vendor_lib_name, VENDOR_LIBRARY_NAME);  }  ALOGD("%s: %s", __func__, vendor_lib_name);  lib_handle_ = dlopen(vendor_lib_name, RTLD_NOW);  if (!lib_handle_) {    ALOGE("%s unable to open %s (%s)", __func__, vendor_lib_name,          dlerror());    return false;  }  lib_interface_ = reinterpret_cast<bt_vendor_interface_t*>(      dlsym(lib_handle_, VENDOR_LIBRARY_SYMBOL_NAME));  if (!lib_interface_) {    ALOGE("%s unable to find symbol %s in %s (%s)", __func__,          VENDOR_LIBRARY_SYMBOL_NAME, vendor_lib_name, dlerror());    return false;  }  // Get the local BD address  uint8_t local_bda[BluetoothAddress::kBytes];  //获取本地的蓝牙地址  if (!BluetoothAddress::get_local_address(local_bda)) {    LOG_ALWAYS_FATAL("%s: No Bluetooth Address!", __func__);  }  //接口的初始化  int status = lib_interface_->init(&lib_callbacks, (unsigned char*)local_bda);  if (status) {    ALOGE("%s unable to initialize vendor library: %d", __func__, status);    return false;  }  ALOGD("%s vendor library loaded", __func__);  // Power on the controller  int power_state = BT_VND_PWR_ON;  lib_interface_->op(BT_VND_OP_POWER_CTRL, &power_state);  // Get the UART Socket(s)  int fd_list[CH_MAX] = {0};  int fd_count = lib_interface_->op(BT_VND_OP_USERIAL_OPEN, &fd_list);  if (fd_count < 1 || fd_count > CH_MAX - 1) {    ALOGE("%s: fd_count %d is invalid!", __func__, fd_count);    return false;  }  for (int i = 0; i < fd_count; i++) {    if (fd_list[i] == INVALID_FD) {      ALOGE("%s: fd %d is invalid!", __func__, fd_list[i]);      return false;    }  }  event_cb_ = event_cb;  PacketReadCallback intercept_events = [this](const hidl_vec<uint8_t>& event) {    HandleIncomingEvent(event);  };  if (fd_count == 1) {    hci::H4Protocol* h4_hci =        new hci::H4Protocol(fd_list[0], intercept_events, acl_cb, sco_cb, iso_cb);    fd_watcher_.WatchFdForNonBlockingReads(        fd_list[0], [h4_hci](int fd) { h4_hci->OnDataReady(fd); });    hci_ = h4_hci;  } else {    hci::MctProtocol* mct_hci =        new hci::MctProtocol(fd_list, intercept_events, acl_cb);    fd_watcher_.WatchFdForNonBlockingReads(        fd_list[CH_EVT], [mct_hci](int fd) { mct_hci->OnEventDataReady(fd); });    fd_watcher_.WatchFdForNonBlockingReads(        fd_list[CH_ACL_IN], [mct_hci](int fd) { mct_hci->OnAclDataReady(fd); });    hci_ = mct_hci;  }  // Initially, the power management is off.  lpm_wake_deasserted = true;  // Start configuring the firmware  //配置和加载Firmware  firmware_startup_timer_ = new FirmwareStartupTimer();  lib_interface_->op(BT_VND_OP_FW_CFG, nullptr);  return true;}

2.5 协议栈的选择

system/bt目录下,蓝牙协议栈代码和加载libbt-vendor.so库的代码,通常情况下建议使用原生的蓝牙协议栈【在system/bt目录】,如果有厂商的协议栈对原生协议栈做过较大的修正而必须使用厂商自己的协议栈的情况下在 jni 层完成对不同厂商协议栈【一般在hardware目录下】的加载

//packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cppstatic void classInitNative(JNIEnv* env, jclass clazz) {    ......    char type[64];    check_wifi_chip_type_string(type);    if (!strncmp(type, "RTL", 3)) { //加载rtl厂商对应的蓝牙协议栈的库:bluetooth_rtk.default.so        ALOGD("%s, load %s.default.so", __func__, BT_STACK_RTK_MODULE_ID);         err = hw_get_module(BT_STACK_RTK_MODULE_ID, (hw_module_t const**)&module);    } else { //加载原生的蓝牙协议栈的库:bluetooth.default.so        ALOGD("%s, load %s.default.so", __func__, id);        err = hw_get_module(id, (hw_module_t const**)&module);    }}//处理一些回调const bt_vendor_callbacks_t lib_callbacks = {    sizeof(lib_callbacks), firmware_config_cb, sco_config_cb,    low_power_mode_cb,     sco_audiOState_cb,  buffer_alloc_cb,    buffer_free_cb,        transmit_cb,        epilog_cb,    a2dp_offload_cb};}  // namespace//BT_STACK_RTK_MODULE_ID在./hardware/libhardware/include/hardware/bluetooth.h定义

三、相关日志

3.1 Kernel相关日志

//USB识别设备类型pid,vid以及序列号等02-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): New USB device found, idVendor=0bda, idProduct=d723, bcdDevice= 2.0002-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): New USB device strings: Mfr=1, Product=2, SerialNumber=302-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): Product: 802.11n WLAN Adapter02-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): Manufacturer: Realtek02-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): SerialNumber: 00e04c000001//Realtk驱动加载已经装载firmware信息02-24 14:08:54.869 I/KERNEL: rtk_btusb( 7855): btusb_probe: usb_interface 00000000a7ea3647, bInterfaceNumber 0, idVendor 0x0bda, idProduct 0x000002-24 14:08:54.869 I/KERNEL: rtk_btusb( 7855): get_fw_table_entry: Product id = 0xd723, fw table entry size 7102-24 14:08:54.870 I/KERNEL: rtk_btusb( 7855): firmware_info_init: Auto suspend is disabled02-24 14:08:54.870 I/KERNEL: rtk_btusb( 7855): btusb_probe: Check bt reset flag 002-24 14:08:54.870 I/KERNEL: rtk_btusb( 7855): load_firmware_info: Default lmp version = 0x8723, fw file name[rtl8723d_fw]02-24 14:08:54.870 I/KERNEL: rtk_btusb( 7855): load_firmware_info: epatch_buf = vmalloc(fw->size, GFP_KERNEL)02-24 14:08:55.152 I/KERNEL: rtk_btusb( 7855): get_eversion: status 0, eversion 202-24 14:08:55.152 I/KERNEL: rtk_btusb( 7855): load_firmware_info: Default lmp_version 0x8723, project_id[9] 0x8723 -> match

3.2 应用侧和framework相关日志

02-24 14:09:01.039 D/BluetoothManagerService(  797): enable(com.android.dten.settings):  mBluetooth =null mBinding = false mState = OFF02-24 14:09:01.039 D/BluetoothManagerService(  797): enable returning02-24 14:09:01.039 D/BluetoothManagerService(  797): binding Bluetooth service02-24 14:09:01.040 D/BluetoothA2dp( 1770): Binding service...02-24 14:09:01.041 D/BluetoothHidHost( 1770): Binding service...//加载协议栈libbluetooth.so库02-24 14:09:01.091 I/BluetoothServiceJni( 9618): hal_util_load_bt_library: loaded Bluetooth library successfully02-24 14:09:01.117 D/BluetoothManagerService(  797): MESSAGE_BLUETOOTH_STATE_CHANGE: OFF > BLE_TURNING_ON02-24 14:09:01.117 D/BluetoothManagerService(  797): Sending BLE State Change: OFF > BLE_TURNING_ON

3.3 协议栈libbluetooth/libbt_hci日志

//协议栈初始化以及消息线程的处理02-24 14:09:01.104 I/bt_btif ( 9618): system/bt/btif/src/bluetooth.cc:162 init: init: start restricted = 0 ; common criteria mode = 0, config compare result = 002-24 14:09:01.105 I/droid.bluetoot( 9618): [0224/140901.105332:INFO:message_loop_thread.cc(224)] Run: message loop starting for thread bt_stack_manager_thread02-24 14:09:01.105 I/bt_stack_manager( 9618): system/bt/btif/src/stack_manager.cc:210 event_init_stack: is initializing the stack02-24 14:09:01.106 I/bt_btif_core( 9618): system/bt/btif/src/btif_core.cc:235 btif_init_bluetooth: btif_init_bluetooth entered02-24 14:09:01.106 I/bt_stack_manager( 9618): system/bt/btif/src/stack_manager.cc:233 event_init_stack: finished//hci协议层初始化,并且调用hardware下HDIL接口02-24 14:09:01.135 I/bt_hci  ( 9618): system/bt/hci/src/hci_layer.cc:200 hci_module_start_up: hci_module_start_up02-24 14:09:01.135 I/bt_hci  ( 9618): system/bt/hci/src/hci_layer_android.cc:159 hci_initialize: hci_initialize02-24 14:09:01.136 I/bt_hci  ( 9618): system/bt/hci/src/hci_layer_android.cc:178 hci_initialize: hci_initialize: IBluetoothHci::getService() returned 0xb400006ff7a7d390 (remote)02-24 14:09:01.136 I/android.hardware.bluetooth@1.0-impl( 9496): BluetoothHci::initialize()

3.4 HDIL接口相关日志

02-24 14:09:01.136 I/android.hardware.bluetooth@1.0-impl( 9496): BluetoothHci::initialize()//根据type来决定加载不同的so库02-24 14:09:01.137 E/android.hardware.bluetooth@1.0-service( 9496): check_wifi_chip_type_string : APXXX: Permission denied//打开libbt-vendor.so来配置端口,上下电,firmware的加载等02-24 14:09:01.137 D/android.hardware.bluetooth@1.0-impl( 9496): Open: libbt-vendor.so02-24 14:09:01.138 E/android.hardware.bluetooth@1.0-service( 9496): vendor storage read error02-24 14:09:01.138 D/android.hardware.bluetooth@1.0-service( 9496): get_local_address: Trying /data/misc/bluetooth/bdaddr// libbt_verdor库中处理,获取版本信息,日志开关等等02-24 14:09:01.138 I/libbt_vendor( 9496): RTKBT_RELEASE_NAME: 20201130_BT_ANDROID_11.002-24 14:09:01.138 I/libbt_vendor( 9496): init02-24 14:09:01.138 I/rtk_parse( 9496): RTKBT_RELEASE_NAME: 20200318_BT_ANDROID_10.002-24 14:09:01.138 E/libbt_vendor( 9496): rtk_btsnoop_dump = 0, rtk_btsnoop_save_log = 002-24 14:09:01.138 D/android.hardware.bluetooth@1.0-impl( 9496): Open vendor library loaded//设置电源管理情况,先下电在上电02-24 14:09:01.338 D/libbt_vendor( 9496): set power off and delay 200ms02-24 14:09:02.339 D/libbt_vendor( 9496): set power on and delay 1000ms02-24 14:09:02.339 D/libbt_vendor( 9496): USB op for 302-24 14:09:02.339 I/bt_userial_vendor( 9496): device fd = 8 open02-24 14:09:02.339 D/bt_service( 9496): OsAllocateTimer bt_service sigev.sigev_notify_thread_id = syscall(__NR_gettid)!02-24 14:09:02.339 D/bt_service( 9496): RTK_btservice_init init done!//驱动打开USB设备02-24 14:09:03.814 I/KERNEL: DTEN(  182): HW_INFO:time:2023-2-24 6:9:3.02-24 14:09:04.111 I/KERNEL: rtk_btusb( 9498): btchr_open: BT usb char device is opening02-24 14:09:04.112 I/KERNEL: rtk_btusb( 9498): btchr_ioctl with Cmd:-2147203660//libbt_verdor对设备的firmware的配置,以及信息的获取02-24 14:09:02.601 D/bt_hwcfg_usb( 9496): RTKBT_RELEASE_NAME: 20201130_BT_ANDROID_11.002-24 14:09:02.601 D/bt_hwcfg_usb( 9496): 02-24 14:09:02.601 D/bt_hwcfg_usb( 9496): Realtek libbt-vendor_usb Version 5.1.1 02-24 14:09:02.601 D/bt_hwcfg_usb( 9496): hw_usb_config_start, transtype = 0x20, pid = 0xd723, vid = 0x0bda 02-24 14:09:04.373 I/KERNEL: rtk_btusb( 9498): btusb_open: Start, PM usage count 002-24 14:09:04.373 I/KERNEL: rtk_btusb( 9498): btusb_open: End, PM usage count 002-24 14:09:02.610 D/bt_hwcfg_usb( 9496): hw_cfg_cb.state = 902-24 14:09:02.911 D/bt_hwcfg_usb( 9496): hw_cfg_cb.state = 202-24 14:09:02.911 I/bt_hwcfg_usb( 9496): BT config file: /vendor/etc/firmware/rtl8723d_config02-24 14:09:02.911 D/bt_hwcfg_usb( 9496): bt_addr = 002-24 14:09:02.911 I/bt_hwcfg_usb( 9496): config offset(0xe4),length(0x1)//装载固件成功02-24 14:09:02.911 I/bt_hwcfg( 9496): BT fw file: /vendor//etc/firmware/rtl8723d_fw02-24 14:09:02.911 I/bt_hwcfg( 9496): Load FW OK//解析firmware以及rtl8723d_config的信息02-24 14:09:02.911 D/bt_hwcfg_usb( 9496): lmp_subversion = 0x8723 hw_cfg_cb.hci_version = 0x8 hw_cfg_cb.hci_revision = 0xd, hw_cfg_cb.lmp_sub_current = 0x4b4a02-24 14:09:02.911 D/bt_hwcfg_usb( 9496): hw_usb_config_cback: Cold BT controller startup02-24 14:09:02.912 D/bt_hwcfg_usb( 9496): hw_cfg_cb.state = 302-24 14:09:02.912 D/bt_hwcfg_usb( 9496): hw_usb_config_cback chip_id of the IC:302-24 14:09:02.912 E/bt_hwcfg_usb( 9496): update altsettings02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): ORG Config len=0000000a:02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): 00000000: 55 ab 23 87 04 00 e4 00 01 08 00 00 00 00 00 0002-24 14:09:02.912 I/bt_hwcfg_usb( 9496): Couldn't open extra config /vendor/etc/bluetooth/rtk_btconfig.txt, err:No such file or directory02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): rtk_update_altsettings: 1 AltSettings02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): MAC: 22:22:2b:2c:02:0002-24 14:09:02.912 I/bt_hwcfg_usb( 9496): rtk_update_altsettings: add 0044[06]02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): NEW Config len=00000013:02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): 00000000: 55 ab 23 87 0d 00 e4 00 01 08 44 00 06 00 02 2c02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): 00000010: 2b 22 22 00 00 00 00 00 00 00 00 00 00 00 00 0002-24 14:09:02.912 I/bt_hwcfg( 9496): bt_hw_parse_project_id: opcode 0, len 1, data 902-24 14:09:02.912 I/bt_hwcfg( 9496): rtk_get_patch_entry: fw_ver 0x829a4b4a, patch_num 302-24 14:09:02.912 I/bt_hwcfg( 9496): rtk_get_patch_entry: chip_id 3, patch_len 0x7ea0, patch_offset 0x494002-24 14:09:02.912 I/bt_hwcfg_usb( 9496): total_len = 0x7eb302-24 14:09:02.912 I/bt_hwcfg_usb( 9496): BTCOEX:20200103-3535 svn_version:24232 lmp_subversion:0x8723 hci_version:0x8 hci_revision:0xd chip_type:31 Cut:3 libbt-vendor_uart version:5.1.1, patch->fw_version = 829a4b4a02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): Fw: exists, config file: exists02-24 14:09:02.912 D/bt_hwcfg_usb( 9496): Check total_len(0x00007eb3) max_patch_size(0x0000a000)//总共129条02-24 14:09:02.912 D/bt_hwcfg_usb( 9496): patch fragment count 129, tail len 17902-24 14:09:02.913 D/bt_hwcfg_usb( 9496): bt vendor lib: HW_CFG_DL_FW_PATCH status:0, opcode:0xfc2002-24 14:09:02.913 D/bt_hwcfg_usb( 9496): bt vendor lib: HW_CFG_DL_FW_PATCH status:0, iIndexRx:0....02-24 14:09:03.170 D/bt_hwcfg_usb( 9496): bt vendor lib: HW_CFG_DL_FW_PATCH status:0, opcode:0xfc2002-24 14:09:03.170 D/bt_hwcfg_usb( 9496): bt vendor lib: HW_CFG_DL_FW_PATCH status:0, iIndexRx:12902-24 14:09:03.170 D/bt_hwcfg_usb( 9496): vendor lib fwcfg completed//HDIL的相关回调02-24 14:09:03.170 D/android.hardware.bluetooth@1.0-impl( 9496): OnFirmwareConfigured result: 002-24 14:09:03.170 I/android.hardware.bluetooth@1.0-impl( 9496): Firmware configured in 0.831s02-24 14:09:03.170 I/android.hardware.bluetooth@1.0-impl( 9496): OnFirmwareConfigured: lpm_timeout_ms 002-24 14:09:03.170 D/android.hardware.bluetooth@1.0-impl( 9496): OnFirmwareConfigured Calling StartLowPowerWatchdog()//Kernel io接口OK02-24 14:09:04.943 I/KERNEL: rtk_btusb( 9722): btchr_ioctl with Cmd:107402181102-24 14:09:04.943 I/KERNEL: rtk_btusb( 9722): btchr_ioctl lmp_sub = 0x4b4a, patch_entry->lmp_sub = 0x4b4a02-24 14:09:03.202 E/bt_userial_vendor( 9496): set event mask, it should bt stack init, set coex bt on//rtk心跳相关配置和初始化02-24 14:09:03.202 D/rtk_heartbeat( 9496): Heartbeat_init start02-24 14:09:03.202 E/rtk_heartbeat( 9496): load_rtkbt_heartbeat_conf unable to open file '/vendor/etc/bluetooth/rtkbt_heartbeat.conf': No such file or directory02-24 14:09:03.202 D/rtk_heartbeat( 9496): Heartbeat_init res = 002-24 14:09:03.202 D/rtk_heartbeat( 9496): Heartbeat_init end

四、遗留问题

4.1 芯片type获取异常

目前通过check_wifi_chip_type_string这个接口获取提示有权限问题,因此调试RTL8723DU时候,是将BCM的宏是关掉了的。后面如果check_wifi_chip_type_string这个接口ok,BCM宏默认是可以打开做兼容处理。下面需要加日志具体分析check_wifi_chip_type_string接口返回异常的问题。

4.2 USB蓝牙适配器SCO模式不工作问题

耳机正常配对连接过A2DP模式可以正常工作,因为不需要注册声卡,走的是蓝牙本身协议;而SCO走的是pcm流需要通过ALSA走声卡的流程。目前测试看声卡用的是原生的card 2,device 0是针对BCM芯片拐角的配置,因此USB蓝牙适配器的声卡需要自己注册,而且需要将USB的数据转为PCM处理。

4.3 开会强制使用A2DP

为了开会使用蓝牙耳机,先强制在开会时候使用A2DP模式,Mic使用本机local的mic。而开会使用SCO模式主要调用以下几个接口:

//audioManager.java//开启sco模式void startBluetoothSco()void startBluetoothScoVirtualCall()//停止sco模式void stopBluetoothSco()//是否使用本机speakervoid setSpeakerphoneOn(boolean on)//通知hal层进行模式和设备选择void setMode(@AudioMode int mode)//设置communication的设备,替代传统的方式startBluetoothSco/stopBluetoothSco/setSpeakerphoneOnboolean setCommunicationDevice(@NonNull AudioDeviceInfo device)

强制使能A2DP,则将上述接口屏蔽即可。这里简单说下新增接口setCommunicationDevice的用法

//The example below shows how to enable and disable speakerphone mode. // Get an AudioManager instance AudioManager audioManager = Context.getSystemService(AudioManager.class); AudioDeviceInfo speakerDevice = null; List<AudioDeviceInfo> devices = audioManager.getAvailableCommunicationDevices(); for (AudioDeviceInfo device : devices) {     if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {         speakerDevice = device;         break;     } } if (speakerDevice != null) {     // Turn speakerphone ON.     boolean result = audioManager.setCommunicationDevice(speakerDevice);     if (!result) {         // Handle error.     }     // Turn speakerphone OFF.     audioManager.clearCommunicationDevice(); }

来源地址:https://blog.csdn.net/franc521/article/details/130103992

--结束END--

本文标题: RK3588 Android12调试USB 蓝牙模块

本文链接: https://www.lsjlt.com/news/404261.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • RK3588 Android12调试USB 蓝牙模块
    一、蓝牙的架构 Android4.2 之后采用 bluedroid 作为协议;整体由 bluetooth.apk,bluedroid ,libbt-vendor 三个 部 分 组 成 。 blue...
    99+
    2023-09-12
    android 网络 网络协议
  • RK3588 Android12 广和通L716 4G模块调试记录
    调试前先找模块厂获取相关资料 Kernel修改: 可用RK的参考配置来控制,把原理图对应角位配置上就行。 rk_modem: rk-modem {compatible="4g-modem-platdata";pinctrl-nam...
    99+
    2023-09-07
    Android 4G 广和通 Powered by 金山文档
  • 怎么关闭小程序蓝牙模块
    本文将为大家详细介绍“怎么关闭小程序蓝牙模块”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“怎么关闭小程序蓝牙模块”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获新知识吧。关闭蓝...
    99+
    2023-06-26
  • 如何用C#开发CF蓝牙模块
    这篇文章主要讲解了“如何用C#开发CF蓝牙模块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用C#开发CF蓝牙模块”吧!基本要点首先明确一点,因为涉及到驱动硬件的问题,所以仅靠了解C#开...
    99+
    2023-06-17
  • Python下使用串口控制蓝牙模块---
             蓝牙模块型号为HC-05,淘宝上一抓一大把. 笔电的话需要USB转串口模块,卖蓝牙模块的店也同样会卖 接线方面: 主要就是VCC(3.3~5V),GND接好即可.同时蓝牙TXD与串口RXD相接,蓝牙RXD与串口TXD相...
    99+
    2023-01-31
    蓝牙 串口 模块
  • 如何初始化小程序蓝牙模块
    这篇文章主要为大家展示了如何初始化小程序蓝牙模块,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“如何初始化小程序蓝牙模块”这篇文章吧。初始化小程序蓝牙模块,生效周期为调用wx.openBluetoo...
    99+
    2023-06-26
  • 如何获取在小程序蓝牙模块生效
    这篇文章主要为大家展示了如何获取在小程序蓝牙模块生效,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“如何获取在小程序蓝牙模块生效”这篇文章吧。获取在小程序蓝牙模块生效期间所有已发现的蓝牙设备,包括已...
    99+
    2023-06-26
  • 如何模块调试golang
    Golang是一种强类型语言,它是一种编译执行语言,这意味着用户需要编译代码才能执行它。在编写高质量的软件时,调试代码非常重要。当代码中的bug被发现时,它可以导致程序失败或产生意外结果。本文将介绍如何在Golang中进行模块调试。使用GD...
    99+
    2023-05-15
  • python调试模块ipdb详解
    目录1. 调试python1.1 使用ipdb1.2 常用命令1. 调试python ipdb是用来python中用以交互式debug的模块,可以直接利用pip安装; 其功能类似于p...
    99+
    2023-03-19
    python调试ipdb python调试模块ipdb
  • 使用wml进行npm模块调试
    要使用 wml 进行 npm 模块调试,您需要按照以下步骤操作:1. 首先,确保您已经在本地安装了 Node.js 和 npm。2....
    99+
    2023-09-21
    npm模块
  • python调试模块ipdb怎么使用
    1. 调试pythonipdb是用来python中用以交互式debug的模块,可以直接利用pip安装;其功能类似于pycharm中 python控制台,而使用ipdb 的优点,便是直接在代码中调试,避免了在python控制台,或者重新设置一...
    99+
    2023-05-14
    Python
  • 如何进行linux内核模块调试
    这篇文章将为大家详细讲解有关如何进行linux内核模块调试,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 开启虚拟机,虚拟机运行到 kgdb: Waiting for connection ...
    99+
    2023-06-16
  • RK3399 4G模块移远EC20移植调试
    CPU:RK3399系统:Android 7.1通过串口打印或者adb获取模块的 pid 和 vid,顺便可以看到生成 4 个虚拟串口 /dev/ttyUSB*[   11.734379] usb 1-1.1: new ...
    99+
    2023-06-06
  • Python中logging日志模块代码调试过程详解
    目录一、日志层级二、创建模块三、使用日志的优点大家好,为了进行调试和错误跟踪,人们在整个代码库中广泛使用日志,今天来看看如何在代码中定义日志,并探讨日志的权限。 一、日志层级 在开始...
    99+
    2023-05-18
    Python logging日志模块 Python 日志模块代码调试
  • 如何使用 npm 日志模块来调试 ASP 应用程序?
    在 ASP 应用程序开发过程中,我们经常需要进行调试来解决一些问题。而 npm 日志模块可以帮助我们快速定位问题并进行调试。本文将介绍如何使用 npm 日志模块来调试 ASP 应用程序。 什么是 npm 日志模块? npm 日志模块是一个 ...
    99+
    2023-09-18
    npm 日志 面试
  • Node.js 原生插件:如何编写、调试和部署自定义模块
    Node.js 原生插件是一种特殊的模块,它可以通过 C/C++ 语言编写,并在项目中使用。由于原生插件是直接通过 C/C++ 语言编写的,因此它的执行速度比纯 JavaScript 模块更快。此外,原生插件还可以访问一些 JavaSc...
    99+
    2024-02-25
    Node.js 插件 Node.js 原生插件 Node.js 模块 Node.js 自定义模块 Node.js 插件编写 Node.js 插件调试 Node.js 插件部署
  • Python使用日志模块快速调试代码并记录异常信息
    目录一、日志层级二、创建模块三、使用日志的优点大家好,为了进行调试和错误跟踪,人们在整个代码库中广泛使用日志,今天来看看如何在代码中定义日志,并探讨日志的权限。 一、日志层级 在开始...
    99+
    2023-05-17
    Python日志模块调试 Python logging日志模块调试
  • 单步调试理解webpack里通过require加载nodejs原生模块实现原理
    在webpack和nodejs里,我们经常使用require函数加载原生模块或者开发人员自定义的模块。原生模块的加载,比如:const path = require("path");这个语句是webpack和nodejs...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作