RTOS 蓝牙
本文档主要介绍 FreeRTOS 平台上 Bluetooth 开发,主要包括蓝牙配置介绍、蓝牙 API 接口介绍以及 demo 的使用。
蓝牙框架介绍
蓝牙框架如下图所示,从上往下可以划分为应用、中间件、适配层、驱动层,固件层,R128 芯片内置蓝牙模块,支持 BR/EDR、BLE 双模。在软件实现上,蓝牙 controller 运行在 ARM m33 CPU 上,蓝牙 HOST 运行在 RV C906 CPU 上。其中蓝牙 HOST 包含 bluedroid 和 zephyr 两个协议栈,bluedroid 协议栈提供 BR/EDR 功能支持,例如 A2DP Sink、A2DP Source、AVRCP、HFP HF、SPP 等 Profile,zephyr 协议栈提供 BLE 相关的功能支持,例如 GATT Client、GATT Server、Mesh 等。
应用层
用户所开发的蓝牙应用,一般推荐使用中间件 btmanager API 进行应用开发。
中间件
中间件指 btmanager 软件,它向上提为应用提供 API,向下对接协议栈,屏蔽了协议栈使用细节,降低蓝牙应用开发门槛。本文档将会重点介绍如何使 btmanager 进行蓝牙应用开发
代码路径:
lichee/rtos‑components/aw/wireless/btmanager/src
协议栈
HOST 使用双栈方式支持 BR/EDR、BLE 蓝牙功能。BR/EDR 使用 Bluedroid 协议栈,BLE 使用 zephyr 协议栈。
bluedroid 协议栈路径:
lichee/rtos‑components/thirdparty/bluetooth/bluedroid
zephyr 协议栈路径:
lichee/rtos‑components/thirdparty/bluetooth/zephyr
适配层
适配层主要有两个作用:
- 对接不同协议栈
- 对接驱动层
代码路径:
lichee/rtos/components/aw/bluetooth/xradio
适配层对接不同协议栈
适配层提供 bluedroid 和 zephyr 的 adapter,如下所示:
.
├── bluedroid
│ └── bt_bluedroid_adapter.c
├── Makefile
└── zephyr
└── bt_zephyr_adapter.c
提供的接口如下:
int bt_zephyr_adapter_register(void)
int bt_zephyr_adapter_unregister(void)
int bt_bluedroid_adapter_register(void)
int bt_bluedroid_adapter_unregister(void)
实现 adapter 主要填充实现 bt_hci_driver 接口,例如 hci 接口初始化、数据发送功能等。
static const struct bt_hci_driver drv = {
.name = "",
.bus = BT_HCI_DRIVER_BUS_VIRTUAL,
.open = virtual_hci_open,
#if defined(CONFIG_BT_DEINIT)
.close = virtual_hci_close,
#endif
.send = virtual_hci_h2c,
};
其中,在 hci_open
的时候,会注册数据接收回调,以 zephyr adater 为例:
static bt_hc_callbacks_t zephyr_hc_callbacks = {
.data_ind = zephyr_data_ind,
};
static int virtual_hci_open(void)
{
bt_lib_if = bt_lib_get_interface();
if (bt_lib_if && bt_lib_if‑>hci_ops && bt_lib_if‑>hci_ops‑>open) {
bt_zephyr_id = bt_lib_if‑>hci_ops‑>open(BT_FEATURES_BLE, &zephyr_hc_callbacks);
if (bt_zephyr_id >= 0)
return 0;
}
return ‑1;
}
如果 controller 上报数据,就会通过 callback 调用到 zephyr_data_ind,把数据传递给协议栈。