RK3588 Android12调试USB 蓝牙模块

RK3588S Android13驱动移植实战:以EW-7611UXB为例,拆解WiFi+蓝牙二合一网卡的集成难点 本文深入解析了在RK3588S Android13平台上移植Realtek EW-7611UXB WiFi+蓝牙二合一网卡驱动的全过程。从Rockchip定制驱动框架解析、USB设备ID适配、SELinux策略配置,到系统服务集成与性能优化,详细拆解了驱动移植的核心难点和解决方案,为嵌入式开发者提供了实用的系统级适配方法论。 阅读详情
AI摘要

本文详细介绍了Android系统从4.2版本后采用的蓝牙架构,包括bluetooth.apk、libbluetooth和libbt-vendor组件的职责。重点讲解了USB蓝牙模块的调试步骤,如kernel中添加驱动、设备节点配置、libbt-vendor.so的加载,以及如何根据模块type选择对应的vendor库。同时,文章提到了协议栈的选择和初始化过程,以及相关日志分析,最后列举了几个遗留问题,如芯片type获取异常和SCO模式不工作等。

一、蓝牙的架构

  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.c
kernel-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.config
index 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.rc
diff --git a/device/rockchip/common/init.connectivity.rc b/device/rockchip/common/init.connectivity.rc
index 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.mk
index 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$ ls
BT_Firmware.mk        rtl8723a_fw              rtl8723c_fw          rtl8723f_config     rtl8761at_config        rtl8761cs_fw      rtl8822bs_config
fw_info.txt           rtl8723as_config         rtl8723cs_cg_config  rtl8723f_fw         rtl8761at_fw            rtl8821a_config   rtl8822bs_fw
readme.txt            rtl8723as_fw             rtl8723cs_cg_fw      rtl8723fs_config    rtl8761au8192ee_fw      rtl8821a_fw       rtl8822c_config
rtl8703as_config      rtl8723b_config          rtl8723cs_vf_config  rtl8723fs_fw        rtl8761au8812ae_fw      rtl8821as_config  rtl8822c_fw
rtl8703as_fw          rtl8723b_config_2Ant_S0  rtl8723cs_vf_fw      rtl8725a_config     rtl8761au_fw            rtl8821as_fw      rtl8822cs_config
rtl8703bs_config      rtl8723b_fw              rtl8723cs_xx_config  rtl8725a_fw         rtl8761aw8192eu_config  rtl8821c_config   rtl8822cs_fw
rtl8703bs_fw          rtl8723bs_config         rtl8723cs_xx_fw      rtl8725as_config    rtl8761aw8192eu_fw      rtl8821c_fw       rtl8852as_config
rtl8703cs_config      rtl8723bs_fw             rtl8723d_config      rtl8725as_fw        rtl8761b_config         rtl8821cs_config  rtl8852as_fw
rtl8703cs_fw          rtl8723bs_VQ0_config     rtl8723d_fw          rtl8761a_config     rtl8761b_fw             rtl8821cs_fw      rtl8852au_config
rtl8723a_config       rtl8723bs_VQ0_fw         rtl8723ds_config     rtl8761at8192ee_fw  rtl8761bt_config        rtl8822b_config   rtl8852au_fw
rtl8723a_config_addr  rtl8723bu_config         rtl8723ds_fw         rtl8761at8812ae_fw  rtl8761bt_fw            rtl8822b_fw
cfliu@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 # ls
4343A0.hcd                       bcm4329.hcd                  fw_awnb108_ap.bin           fw_bcm43438a0.bin                fw_cyw43438.bin       nvram_ap6212a.txt    rtl8703bs_config         rtl8723ds_config        rtl8821a_fw
AP6275P_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_config
BCM20710A1.hcd                   bcm4339a0.hcd                fw_bcm40181a2_apsta.bin     fw_bcm43438a0_p2p.bin            fw_info.txt           nvram_ap6214a.txt    rtl8703cs_config         rtl8723f_config         rtl8821as_fw
BCM4330B1.hcd                    bcm43438a0.hcd               fw_bcm40183b2.bin           fw_bcm43438a1.bin                mali_csffw.bin        nvram_ap6216.txt     rtl8703cs_fw             rtl8723f_fw             rtl8821c_config
BCM4343A0.hcd                    bcm43438a1.hcd               fw_bcm40183b2_ag.bin        fw_bcm43438a1_apsta.bin          nh660.hcd             nvram_ap6233f.txt    rtl8723a_config          rtl8723fs_config        rtl8821c_fw
BCM4343A1.hcd                    bcm4354a1.hcd                fw_bcm40183b2_ag_apsta.bin  fw_bcm43438a1_p2p.bin            nvram.txt             nvram_ap6236.txt     rtl8723a_config_addr     rtl8723fs_fw            rtl8821cs_config
BCM4343B0.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_fw
BCM4345C0.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_config
BCM4345C5.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_fw
BCM4354A2.hcd                    config.txt                   fw_bcm43241b4_ag.bin        fw_bcm43456c5_ag.bin             nvram_AP6210.txt      nvram_ap6275s.txt    rtl8723b_config          rtl8725as_fw            rtl8822bs_config
BCM4356A2.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_fw
BCM4359C0.hcd                    fw_RK901.bin                 fw_bcm43241b4_ag_p2p.bin    fw_bcm4354a1_ag.bin              nvram_AP6234.txt      nvram_ap6354.txt     rtl8723b_fw              rtl8761at8192ee_fw      rtl8822c_config
BCM4362A2.hcd                    fw_RK901a0.bin               fw_bcm4330.bin              fw_bcm4354a1_ag_apsta.bin        nvram_AP6275P.txt     nvram_ap6356.txt     rtl8723bs_VQ0_config     rtl8761at8812ae_fw      rtl8822c_fw
BCM4375B1.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_config
BT_Firmware.mk                   fw_RK901a2.bin               fw_bcm43341b0_ag.bin        fw_bcm4356a2_ag.bin              nvram_AP6335.txt      nvram_ap6398s.txt    rtl8723bs_config         rtl8761at_fw            rtl8822cs_fw
RT2870AP.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_config
RT2870APCard.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_fw
RT2870STA.dat                    fw_RK903.bin                 fw_bcm4334b1_ag.bin         fw_bcm4359c0_ag.bin              nvram_AP6493.txt      nvram_awnb108.txt    rtl8723c_fw              rtl8761au_fw            rtl8852au_config
RT2870STACard.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_fw
awnb108.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.bin
bcm20710a1.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.cfg
bcm20710a1_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.map
bcm20710a1_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.map
bcm2076b1.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.map
bcm40183b2.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.map
bcm43241b4.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.cc
static 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.cpp
static 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.00
02-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): New USB device strings: Mfr=1, Product=2, SerialNumber=3
02-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): Product: 802.11n WLAN Adapter
02-24 14:08:54.866 I/KERNEL: usb 4-1.1( 7855): Manufacturer: Realtek
02-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 0x0000
02-24 14:08:54.869 I/KERNEL: rtk_btusb( 7855): get_fw_table_entry: Product id = 0xd723, fw table entry size 71
02-24 14:08:54.870 I/KERNEL: rtk_btusb( 7855): firmware_info_init: Auto suspend is disabled
02-24 14:08:54.870 I/KERNEL: rtk_btusb( 7855): btusb_probe: Check bt reset flag 0
02-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 2
02-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 = OFF
02-24 14:09:01.039 D/BluetoothManagerService(  797): enable returning
02-24 14:09:01.039 D/BluetoothManagerService(  797): binding Bluetooth service
02-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 successfully
02-24 14:09:01.117 D/BluetoothManagerService(  797): MESSAGE_BLUETOOTH_STATE_CHANGE: OFF > BLE_TURNING_ON
02-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 = 0
02-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_thread
02-24 14:09:01.105 I/bt_stack_manager( 9618): system/bt/btif/src/stack_manager.cc:210 event_init_stack: is initializing the stack
02-24 14:09:01.106 I/bt_btif_core( 9618): system/bt/btif/src/btif_core.cc:235 btif_init_bluetooth: btif_init_bluetooth entered
02-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_up
02-24 14:09:01.135 I/bt_hci  ( 9618): system/bt/hci/src/hci_layer_android.cc:159 hci_initialize: hci_initialize
02-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.so
02-24 14:09:01.138 E/android.hardware.bluetooth@1.0-service( 9496): vendor storage read error
02-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.0
02-24 14:09:01.138 I/libbt_vendor( 9496): init
02-24 14:09:01.138 I/rtk_parse( 9496): RTKBT_RELEASE_NAME: 20200318_BT_ANDROID_10.0
02-24 14:09:01.138 E/libbt_vendor( 9496): rtk_btsnoop_dump = 0, rtk_btsnoop_save_log = 0
02-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 200ms
02-24 14:09:02.339 D/libbt_vendor( 9496): set power on and delay 1000ms
02-24 14:09:02.339 D/libbt_vendor( 9496): USB op for 3
02-24 14:09:02.339 I/bt_userial_vendor( 9496): device fd = 8 open
02-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 opening
02-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.0
02-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 0
02-24 14:09:04.373 I/KERNEL: rtk_btusb( 9498): btusb_open: End, PM usage count 0
02-24 14:09:02.610 D/bt_hwcfg_usb( 9496): hw_cfg_cb.state = 9
02-24 14:09:02.911 D/bt_hwcfg_usb( 9496): hw_cfg_cb.state = 2
02-24 14:09:02.911 I/bt_hwcfg_usb( 9496): BT config file: /vendor/etc/firmware/rtl8723d_config
02-24 14:09:02.911 D/bt_hwcfg_usb( 9496): bt_addr = 0
02-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_fw
02-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 = 0x4b4a
02-24 14:09:02.911 D/bt_hwcfg_usb( 9496): hw_usb_config_cback: Cold BT controller startup
02-24 14:09:02.912 D/bt_hwcfg_usb( 9496): hw_cfg_cb.state = 3
02-24 14:09:02.912 D/bt_hwcfg_usb( 9496): hw_usb_config_cback chip_id of the IC:3
02-24 14:09:02.912 E/bt_hwcfg_usb( 9496): update altsettings
02-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 00
02-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 directory
02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): rtk_update_altsettings: 1 AltSettings
02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): MAC: 22:22:2b:2c:02:00
02-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 2c
02-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 00
02-24 14:09:02.912 I/bt_hwcfg( 9496): bt_hw_parse_project_id: opcode 0, len 1, data 9
02-24 14:09:02.912 I/bt_hwcfg( 9496): rtk_get_patch_entry: fw_ver 0x829a4b4a, patch_num 3
02-24 14:09:02.912 I/bt_hwcfg( 9496): rtk_get_patch_entry: chip_id 3, patch_len 0x7ea0, patch_offset 0x4940
02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): total_len = 0x7eb3
02-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 = 829a4b4a
02-24 14:09:02.912 I/bt_hwcfg_usb( 9496): Fw: exists, config file: exists
02-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 179
02-24 14:09:02.913 D/bt_hwcfg_usb( 9496): bt vendor lib: HW_CFG_DL_FW_PATCH status:0, opcode:0xfc20
02-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:0xfc20
02-24 14:09:03.170 D/bt_hwcfg_usb( 9496): bt vendor lib: HW_CFG_DL_FW_PATCH status:0, iIndexRx:129
02-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: 0
02-24 14:09:03.170 I/android.hardware.bluetooth@1.0-impl( 9496): Firmware configured in 0.831s
02-24 14:09:03.170 I/android.hardware.bluetooth@1.0-impl( 9496): OnFirmwareConfigured: lpm_timeout_ms 0
02-24 14:09:03.170 D/android.hardware.bluetooth@1.0-impl( 9496): OnFirmwareConfigured Calling StartLowPowerWatchdog()
//Kernel io接口OK
02-24 14:09:04.943 I/KERNEL: rtk_btusb( 9722): btchr_ioctl with Cmd:1074021811
02-24 14:09:04.943 I/KERNEL: rtk_btusb( 9722): btchr_ioctl lmp_sub = 0x4b4a, patch_entry->lmp_sub = 0x4b4a

02-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 start
02-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 directory
02-24 14:09:03.202 D/rtk_heartbeat( 9496): Heartbeat_init res = 0
02-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()

//是否使用本机speaker
void setSpeakerphoneOn(boolean on)
//通知hal层进行模式和设备选择
void setMode(@AudioMode int mode)

//设置communication的设备,替代传统的方式startBluetoothSco/stopBluetoothSco/setSpeakerphoneOn
boolean 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();
 }
RK3568-Android11-USB-WiFi-RTL8821CU移植实战 本文详细介绍了在RK3568平台上基于Android 11系统移植RTL8821CU USB WiFi模块的完整流程。从硬件环境准备、设备树配置到内核驱动移植和Android框架层适配,逐步解析了WiFi和蓝牙功能的实现方法,并提供了常见问题的解决方案,帮助开发者快速完成无线模块的定制化开发。 阅读详情

相关推荐

RK3588 USB蓝牙调试_awnb108

/BT_STACK_RTK_MODULE_ID在./hardware/libhardware/include/hardware/bluetooth.h定义。strncmp(type, “RTL”, 3)) { //加载rtl厂商对应的蓝牙协议栈的库:bluetooth_rtk.default.so。} else { //加载原生的蓝牙协议栈的库:bluetooth.default.so。//此时加载的是libbt-vendor-realtek.so。//此时加载的是libbt-vendor.so。

2401_83817689的博客 1605

https://source.android.com/devices/bluetooth/ - 蓝牙 Android 8.0 架构

蓝牙Android 提供支持经典蓝牙和蓝牙低功耗的默认蓝牙堆栈。借助蓝牙,Android 设备可以创建个人区域网络,以便通过附近的蓝牙设备发送和接收数据。在 Android 4.3 及更高版本中,Android 蓝牙堆栈可提供实现蓝牙低功耗 (BLE) 的功能。要充分利用 BLE API,请遵循 Android 蓝牙 HCI 要求。具有合格芯片组的 Android 设备可以实现经典蓝牙或同时实现经...

weixin_39481506的博客 2439

[RK3588]调试串口波特率优化实战:从1.5M到115200的完整指南

本文提供了RK3588开发板调试串口波特率从默认1.5Mbps修改为通用115200的完整实战指南。详细解析了必须同步修改DDR初始化镜像、U-Boot配置及Linux内核设备树中fiq-debugger节点的“三件套”原理与步骤,并涵盖编译、烧录及常见问题排查,帮助开发者彻底解决串口乱码与通信失败问题。

Pepper的专栏 379

【RK3588 开发笔记——wifi蓝牙调试】

SDIO接口与PCIE接口无线模块二选一,若二者蓝牙共用同一个串口,则需要单独供电,不可同时上电。

W_B_C的博客 6912

RK3588平台AP6275HH3芯片驱动调试实战:从DTS配置到问题排查

本文详细介绍了在RK3588平台上调试AP6275HH3 Wi-Fi/蓝牙模块的完整实战流程。核心在于设备树(DTS)的精确配置,包括Wi-Fi和蓝牙节点的GPIO、中断及电源管理设置,并深入分析了驱动加载、PCIE枚举及固件加载过程。文章重点分享了Bring Up过程中常见的GPIO冲突、电源管理异常、PCIE枚举失败等问题的排查思路与解决方案,为嵌入式开发者提供了宝贵的调试经验。

github5actions的博客 484

保姆级教程:在RK3588开发板上搞定AP6275S蓝牙SPP通信(从手机到PC全链路测试)

本文详细介绍了在RK3588开发板上配置AP6275S蓝牙模块实现SPP通信的全流程,包括开发环境准备、服务配置、与Android手机和Windows PC的连接测试,以及常见问题解析和自动化脚本实现。通过本教程,开发者可以快速掌握蓝牙串口通信技术,适用于物联网设备开发等场景。

weixin_33713503的博客 303

Android博通BCM libbt-vendor.so 分析蓝牙初始化流程

主要通过android的libbt vendor的代码来说明博通蓝牙芯片的初始化流程,彻底了解蓝牙使能原理

朝气蓬勃 5246

【香橙派】安卓镜像烧录与功能调试全攻略

本文详细介绍了香橙派安卓镜像烧录的全流程及功能调试技巧,包括环境准备、烧录操作细节、系统初始化设置、蓝牙功能调试和投屏功能优化。特别针对蓝牙5.0协议和投屏延迟问题提供了实用解决方案,帮助用户快速掌握香橙派的安卓系统部署与功能调试。

weixin_28278377的博客 251

RK3568 移植USB WIFI 方法

基于RK3568硬件平台上移植USB WIFI完整步骤。

m0_58553975的博客 6273

瑞芯微芯片软硬件协同开发实战指南:从RK3588到全系SOC工程落地

瑞芯微SoC(如RK3588、RK3566)是边缘AI与嵌入式系统的核心平台,其开发本质是芯片架构、硬件电路与Linux/Android软件栈的深度协同。理解TRM寄存器定义、设备树资源建模、电源时序约束及VPU/NPU内存带宽分配等底层原理,才能突破‘资料齐全却无法启动’的困局。技术价值在于将碎片化文档转化为可复用的工程决策链——例如USB3.1 Gen2需同步满足PHY电气参数、PCB阻抗控制与dwc3驱动配置;又如RK3588设备树中pinctrl复用编号必须严格对照TRM Pinmux表。典型应用场

weixin_33829657的博客 513

瑞芯微 RK356x 基于Android11移植usb接口rtl8723du wifi和蓝牙一体化

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规范兼容。

qq_45147279的博客 2321

RK3588 Android12 SDK 中在device介绍及如何新建自己的产品lunch项

RK3588 Android12 SDK 中在device下新建自己的产品lunch项 目的 RK3588 Android12 在编译的时候需要先lunch选择产品,这个lunch项会根据不同的产品配置对应的参数,比如配置系统参数、配置产品个性化需求、是否支持HDMI、是否支持4G网络、配置分区信息等等。可以针对不同的产品新建对应的lunch,满足在同一套代码下开发不同产品的需求。本文将介绍RK3588 Android12的device结构和如何新建一个产品lunch。 RK3588 Android12的d

weixin_43245753的博客 6957

深度揭秘RK3588平台音频开发:探索Android音频调试利器tiny-alsa工具

tiny-alsa是一个轻量级的Linux音频库,专注于提供简单而高效的音频接口。在Android平台上,tiny-alsa常被用于调试和测试音频设备,为开发者提供了强大的工具支持。通过本文的讲解,我们深入了解了在RK3588平台上进行Android音频调试的核心概念和tiny-alsa工具的高效使用。音频系统的优化是确保用户获得出色音频体验的关键一环,而tiny-alsa为我们提供了强大的工具支持。希望本文对于正在进行RK3588平台音频开发的开发者有所帮助。

一直在水些技术小文 1201

RK3588蓝牙调试实战:UART桥接、BlueZ协议栈与RFCOMM通道调优

蓝牙技术是嵌入式系统中实现无线串口(SPP)和音频传输(A2DP)的关键通信方式,其底层基于HCI协议栈,依赖UART或USB等物理链路承载控制指令与数据。在RK3588这类集成Realtek BT基带的SoC上,蓝牙并非即插即用,而是采用分体式架构——BT PHY与BlueZ协议栈通过UART桥接,导致波特率匹配、流控配置、固件加载和电源管理成为稳定运行的核心瓶颈。掌握bluetoothctl状态机流程、RFCOMM通道绑定机制及A2DP codec协商逻辑,可显著提升串口透传可靠性与音频播放连续性。本文

weixin_33895475的博客 281

RK3568平台(网络篇)蓝牙调试

蓝牙技术是一种的方式,利用特定频率的波段(),进行电磁波传输。蓝牙传输原理是主从关系,一个主设备可以与7个蓝牙从设备配对。

weixin_49303682的博客 3101

东方财富网API接口逆向分析:手把手教你破解那个带jQuery回调的股票数据接口

本文详细解析了东方财富网股票数据API接口的逆向工程实战技巧,重点介绍了JSONP接口的核心机制、参数解析及数据处理方法。通过Python代码示例演示了如何构造请求、处理分页数据及应对反爬策略,帮助开发者高效获取股票数据。文章还提供了完整的爬虫实现案例和常见问题排查指南。

weixin_30790841的博客 716

避坑指南:RK3588开发板Qt+OpenCV摄像头采集的那些坑(Ubuntu20.04版)

本文详细解析了在RK3588开发板上基于Ubuntu 20.04系统,使用Qt和OpenCV进行摄像头采集的完整流程与常见问题。内容涵盖从系统镜像烧录、环境搭建(Qt、OpenCV编译)、摄像头驱动识别,到Qt项目配置、代码编写及核心“坑点”排查(如权限、格式、性能问题),旨在帮助开发者高效完成嵌入式视觉应用开发,规避典型陷阱。

wasm7browser的博客 644

数据助力行业发展:BJTU-RAO转向架数据集介绍

BJTU-RAO转向架数据集是完全公开的,何研究人员皆可以通过后文的下载链接免费下载数据,且在标注数据来源的前提下,研究人员可以自由使用BJTU-RAO转向架数据集。因此,聚焦各类列车转向架传动系统在途安全保障新技术研究和新算法开发,实现牵引电机、驱动齿轮箱和轴箱等关键部件的实时状态监测与智能故障诊断,对保障列车安全可靠运行具有重要的现实意义。BJTU-RAO转向架数据集包含51种健康状态的样本,涵盖正常状态、部件级单一故障、部件级复合故障以及系统级关联复合故障,数据量达116GB。

2401_88870554的博客 3501

Android车机用USB Gadget配置CarPlay的完整指南

USB Gadget是Linux内核强大的外设模拟框架,可让设备在USB总线上扮演不同角色,实现从Host到Device的灵活切换。通过合理配置内核选项与configfs,Android车机可将自身模拟为CarPlay附件,使iPhone从USB层面识别设备并建立iAP2数据通道。本文从USB拓扑原理出发,详解内核依赖、FunctionFS端点配置、UDC绑定、开机自启及常见故障排查方法,并延伸至产品化中的稳定性、音频视频回传策略与无线CarPlay的技术距离,帮助开发者在实际车机上高效落地完整的CarPl

weixin_33978044的博客 328

C++碰撞检测库FCL安装(MinGW,CMake)

FCL碰撞检测库、libccd\Eigen库编译配置,全流程问题记录

weixin_45650767的博客 4675

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由

版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建...

qq_37992321的博客 1万+

USB3.0拓展坞、高能效脉冲控制仪、工业控制单板、RK3566安卓手机、全志H3开发板、千兆5口交换机、百兆路由器

个人学习工作期间做过的嵌入式产品

qq_52139746的博客 1277

【Unity】Unity 跨平台及编译过程

早期的Unity跨平台是基于MONO运行时的,又通过CLS实现了跨语言。其基本思路是将各个版本的语言统一编译成CIL语言,在不同平台运行时使用CLR进行解释。有点类似于Java的jdk和jvm。 CLS(Common Language System)通用语言规范:CLS是一种规范,类似于schema,当文件被指定遵守CLS规范后,在某语言中写出不符合通用规范的代码后将被警告或报错。 MONO是一个开源工程,其中包含C#编译器,CLR运行时,以及一组类库。该工程常见了一系列符合ECMA标准的.NET工具,MO

一个普普通通的游戏开发者 7237
上一篇: RK3588平台正基AP6275HH3芯片Bring Up
下一篇: 抓取wifi sniffer日志看WiFi的连接过程
GitFranc
博客等级 码龄17年 46粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GitFranc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值