背景:
BT chip:RTL8761AUV
平台:RK3399
KERNEL版本:kernel4.4
Android版本:android7.1

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

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

USB蓝牙调试浅析:

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

 drivers/bluetooth/rtk_btusb.cdrivers/bluetooth/rtk_btusb.h

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

在 Kconfig 文件中增加 BT_RTKBTUSB 的选项:

config BT_RTKBTUSB
tristate "RTK HCI USB driver"
depends on USB
help
RTK Bluetooth HCI USB driver

在 Makefile 文件中添加目标文件 rtk_btusb.o,

obj-$(CONFIG_BT_RTKBTUSB) += rtk_btusb.o

2、平台对应的defconfig文件添加Realtek BT Chip支持的宏定义,或者在 kernel 中make menuconfig选中rtk_btusb driver相关的宏。

CONFIG_BT_RTKBTUSB=y

驱动加载成功会有对应设备节点:

rk3399_all:/ # ls dev/rtk_btusb
dev/rtk_btusb

device/rockchip/common目录:
添加一些节点的权限和一些宏控开关

在device/rockchip/common/init.connectivity.rc文件(一般rk平台代码已经添加):

  4 # for bluetooth5     # change back to bluetooth from system6     chown bluetooth net_bt_stack /data/misc/bluetooth7     mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack8     # bluetooth LPM9     chown bluetooth net_bt_stack /proc/bluetooth/sleep/lpm10     chown bluetooth net_bt_stack /proc/bluetooth/sleep/btwrite1112 # USB device13     insmod /system/lib/modules/rtk_btusb.ko14     chmod 0660 /dev/rtk_btusb15     chown bluetooth net_bt_stack /dev/rtk_btusb1617 # for 8897 bt18 #    insmod /system/lib/modules/mbt8xxx.ko1920     # bluetooth MAC address programming21     chown bluetooth net_bt_stack ro.bt.bdaddr_path22     chown bluetooth net_bt_stack /system/etc/bluetooth23     chown bluetooth net_bt_stack /data/misc/bluetooth24     setprop ro.bt.bdaddr_path "/data/misc/bluetooth/bdaddr"

在device/rockchip/common/wifi_bt_common.mk文件(一般rk平台代码已经添加):

BOARD_HAVE_BLUETOOTH_RTK := true
BOARD_HAVE_BLUETOOTH_RTK_COEX := true

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

固件所在目录:

hardware/realtek/rtkbt/system/etc/firmware/rtl8761au_fw

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

system/etc/firmware/

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

char type[64];
check_wifi_chip_type_string(type);
if (!strncmp(type, "RTL", 3)) { //加载rtl厂商对应的蓝牙协议栈的库:bluetooth_rtk.default.soALOGD("%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.soALOGD("%s, load %s.default.so", __func__, id);err = hw_get_module(id, (hw_module_t const**)&module);
}//BT_STACK_RTK_MODULE_ID在./hardware/libhardware/include/hardware/bluetooth.h定义

部分HAL层对应的libbt-vendor.so的源代码浅析:

首先是bluedroid 蓝牙协议栈libbt-hci【原生蓝牙协议栈】通过system/bt/hci/src/vendor.c的vendor_open接口调用->dlopen加载libbt-vendor.so库文件,

加载libbt-vendor.so库之后调用以下接口

// Entry point of DLib
const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = {sizeof(bt_vendor_interface_t),init,op,cleanup};
调用init -> userial_vendor_init ->snprintf(vnd_userial.port_name, VND_PORT_NAME_MAXLEN, "%s", BLUETOOTH_UART_DEVICE_PORT); /*BLUETOOTH_UART_DEVICE_PORT在hardware/realtek/rtkbt/code/libbt- vendor/usb/include/vnd_buildcfg.h中宏定义,即蓝牙设备节点:/dev/rtk_btusb初始化蓝牙设备节点等*/然后调用op,在static int op(bt_vendor_opcode_t opcode, void *param)中:case BT_VND_OP_USERIAL_OPEN: //打开蓝牙设备->fd = userial_vendor_open();case BT_VND_OP_FW_CFG: //加载蓝牙固件(fw文件)->retval = ioctl(vnd_userial.fd, DOWN_FW_CFG, NULL);case BT_VND_OP_USERIAL_CLOSE:->userial_vendor_close(); //关闭蓝牙设备

调用cleanup

/** Closes the interface */
static void cleanup( void )
{BTVNDDBG("cleanup");bt_vendor_cbacks = NULL;
}

rk3399_android7.1调试USB蓝牙模块小结相关推荐

  1. A10 JBM146 usb蓝牙模块调试心得

    1.首先A10 的kernel 没有把usb 蓝牙的驱动打开 配置内核支持Bluetooth, 1.1 make menuconfig [*] Networking support  ---> ...

  2. JDY-31蓝牙模块远程控制STM32F103单片机

    一,概述 手机app通过蓝牙模块发送指令实时控制单片机的外设功能,比如发送衣柜开关门指令(舵机旋转),衣架上升降落(步进电机正转反转),远程开启去污除湿功能(继电器控制打开\关闭小风扇+加热片). 本 ...

  3. 如何使用蓝牙模块与电脑通信,实现自主开发

    项目中使用到了蓝牙模块,但是很多时候我们是从别人手里购买核心模块,然后进行二次开发使用,究竟如何使用核心模块,在所给资料甚少的情况下,还真的要费一番功夫去研究如何使用开发哦.这两天正好做完超声波后,要 ...

  4. Mac电脑蓝牙连接出问题了,如何重置Mac的蓝牙模块

    蓝牙是Mac电脑用来连接无线设备的工具,当Mac电脑蓝牙连接出问题了,如何解决呢?可以通过取消配对和修复蓝牙设备,更换其电池,重新启动Mac或执行SMC重置来解决大多数问题.但是,如果这些方法都不起作 ...

  5. ARM USB蓝牙,Bluez 移植。

    标题:USB 蓝牙适配器在ARM 开发板下的使用: 关键字: dbus,bluez-lib, bluez-utils, USB 蓝牙,ARM 正文: 1.我的操作环境是 主机:xp + VMware ...

  6. hc-05蓝牙模块调试

    hc-05蓝牙模块调试 本文主要记录hc-05蓝牙模块调试的过程,包括hc-05蓝牙模块连线,驱动下载,hc-05蓝牙模块模式介绍,AT指令,串口调试以及与安卓手机app连接发送数据.(只列举了我在调 ...

  7. 蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输)

    蓝牙模块HC-05的调试(利用LED灯来检验信号是否能正常传输) by hasyu 我所用到的硬件 BlueTooth HC-05,arduino 2560(uno也行吧) 电脑 手机 硬件的连接 不 ...

  8. 蓝牙模块安装调试工艺

    蓝牙模块安装调试工艺 1 调试蓝牙模块之前先看ATK-HC05-V11用户手册,里面有详细的说明 2 目标:对蓝牙模块进行参数设置:波特率:460800,一位停止位:0,偶校验位:2. 3 需要的工具 ...

  9. 蓝牙模块—HC-05调试

    每次拿到蓝牙模块进行调试时,都会忘记一些细节等信息.因此为了将来能够顺利地调试蓝牙模块,以本文来记录一下调试过程. 调试所需的硬件有HC-05蓝牙模块,USB转TTL模块,杜邦线若干. 首先用杜邦线将 ...

  10. 安卓手机与蓝牙模块联合调试(五)-- 编写自己的蓝牙控制界面控制单片

    安卓手机与蓝牙模块联合调试(五)-- 编写自己的蓝牙控制界面控制单片机(上篇,Android 代码实现) 2018年09月18日 00:10:43 涛声依旧Cjt 阅读数:252更多 所属专栏: 安卓 ...

最新文章

  1. Oracle RAC一节点宕机导致另一节点HANG的问题分析
  2. 软件开发详细设计说明书_汽车软件开发之ASPICE系统需求过程组
  3. openEuler系统配置yum镜像源
  4. 【深度学习】CNN神经网络应用(用于亚洲大黄蜂分类)
  5. x5675相当于e5_如何辨别电商电脑主机是否二手翻新硬件?揭秘i7级E5电脑主机猫腻...
  6. 今天学了瀑布流的js方法
  7. STM32串口的使用(原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯)
  8. 大数据技术 学习之旅_为什么聚焦是您数据科学之旅的关键
  9. python django 优势_为什么选择Django?
  10. 集合的交并差 -python
  11. 459B Pashmak and Flowers
  12. Windows绘图基础
  13. DVWA安装教程(懂你的不懂·详细)
  14. Linux命令注销电脑,Linux基本命令-注销、关机、重启
  15. html 显示闹钟,闹钟设置.html
  16. 小米路由器青春版刷Padavan固件
  17. 2013年最火和最挣钱的IT职位
  18. 如何将windows桌面变成类似mac样式
  19. 【复旦大学】考研初试复试资料分享
  20. simulink半桥逆变电路仿真

热门文章

  1. Knowing is not enough; we must apply. Willing is not enough; we must do.
  2. 导出数据报ORA-39002: 操作无效 ORA-39070: 无法打开日志文件。 ORA-39087: 目录名 DUMP_DIR 无效...
  3. 6.2上午 外教 阅读
  4. Hadoop学习之SecondaryNameNode
  5. linux gdb基本调试及其多线程调试
  6. 项目铺垫系列导航目录
  7. 57个深度学习专业术语
  8. ExtraPhrase:一种针对抽象式(生成式)摘要的数据增强方法
  9. 一名南京985AI硕士,CSDN博客专家
  10. 【ACL2019】轻松了解张岳实验室的六篇paper