WHC BT

概述

在此解决方案中,Ameba SoC 作为蓝牙控制器,通过底层接口与客户的蓝牙主机相连。该方案具有以下优势:

  • 丰富的接口选项:可通过 UART、SPI、SDIO 或 USB 建立主机与设备之间的传输通道。

  • 跨平台兼容性:支持将 FreeRTOS and Zephyr 作为主机开发环境。

该解决方案的架构图如下所示:

../../_images/whc_bt_overview.png

主机驱动负责连接蓝牙上层协议栈与底层接口。

  • 当有 HCI 数据包需要发送至蓝牙控制器时,蓝牙上层协议栈会调用主机驱动中的发送 API。随后,主机驱动调用底层接口的功能函数将数据发出。

  • 当底层接口从控制器收到数据时,会调用主机驱动的接收 API。随后,主机驱动将接收到的数据传递给蓝牙上层协议栈。

主机驱动会根据所连接的不同底层接口的要求,在发送时对 HCI 数据包进行重组,在接收时对数据进行解析。底层接口仅需负责基础的数据传输。

文件目录

├─ bluetooth
│  ├─ driver
│  │  ├─ bt_inic
│  │  │  ├─ bt_inic_defs.h
│  │  │  ├─ bt_inic_h4.c
│  │  │  ├─ bt_inic_h5.c
│  │  |  ├─ bt_inic_sdio_dplus.c
│  │  │  ├─ bt_inic_sdio.c
│  │  │  ├─ bt_inic_spi_dev.c
│  │  │  ├─ bt_inic_usb.c
│  │  │  ├─ bt_inic_usbd.c
│  │  │  └─ bt_inic.h

WHC BT 移植指南

设备端驱动移植

TODO

RTOS 驱动移植

Host 驱动

Host 驱动由两部分组成:HCI 驱动和 Ameba BT API。其中,HCI 驱动需要由客户自行实现,而 Ameba BT API 由我方提供。蓝牙 Host 通过 HCI 驱动调用 Ameba BT API,从而与 Controller 进行通信。 Host 驱动的代码结构如下所示:

../../_images/host_driver_code_structure.png
HCI 驱动

蓝牙上层协议栈通过 HCI 驱动来收发数据,客户需要在自己的 Host 开发环境中实现这一部分。 针对 FreeRTOS 环境,客户可根据项目结构,将 HCI 驱动放置在任意目录下,并修改 CMakelist 和 Config 文件以进行编译。 HCI 驱动的详细实现步骤如下:

HCI 函数

描述

HCI open

蓝牙上层协议栈通过 HCI open 函数开启蓝牙控制器。该函数需根据传输协议调用 Ameba BT enable API,以启用 Ameba 蓝牙控制器。

HCI close

蓝牙上层协议栈通过 HCI close 函数关闭蓝牙控制器。该函数需调用 Ameba BT disable API,以禁用 Ameba 蓝牙控制器。

HCI send

蓝牙上层协议栈通过 HCI send 函数发送 HCI 数据包。该函数需调用 Ameba BT send API,将数据包发送至设备。

HCI receive

蓝牙上层协议栈通过 HCI receive 函数接收 HCI 数据包。当从底层接口接收到数据时,Ameba BT receive API 会调用此函数。

Ameba BT API

Ameba BT API 由 rtk_bt_host_api.crtk_bt_host_api.hos_if.cos_if.h 以及各种接口协议模块组成。针对 FreeRTOS 环境,我们将提供所有这些文件。客户可根据项目结构,将 Ameba BT API 放置在任意目录下,并修改 CMakelist 和 Config 文件以进行编译。

Ameba BT API 起到了连接 HCI 驱动与底层接口的桥梁作用。其主要功能如下:

重组帧与传输

  • 接收来自蓝牙上层协议栈的 HCI 数据包。

  • 根据底层接口协议(H4/H5/SDIO/SPI/USB 等)对 HCI 数据包进行封装。

  • 将封装后的数据帧传递给底层接口驱动。

接收与解析

  • 接收来自底层接口的原始数据。

  • 从原始数据中解析出 HCI 数据包。

  • 将 HCI 数据包转发给上层协议栈的接收回调函数。

Ameba BT API 的详细实现步骤如下:

BT API

描述

BT enable

Ameba BT enable API 将注册 HCI 接收回调函数和接口操作,并发送厂商命令以启用 Ameba 蓝牙控制器。 请根据接口协议选择合适的 API。

  • 如果使用 UART H4 接口,请调用 bool rtk_bt_host_enable_with_h4(struct hci_low_level_opts *opts, APP_RECV recv)。由于 UART 接口仅由蓝牙控制,因此您需要自行实现底层的操作。

  • 如果使用 SDIO 接口,请调用 bool rtk_bt_host_enable_with_sdio(APP_RECV recv)。由于 SDIO 接口是由 WiFi 而非蓝牙控制的,因此在调用此 API 时,您需要确保 SDIO 接口已启用。

  • 如果使用 SPI 接口,请调用 bool rtk_bt_host_enable_with_spi(APP_RECV recv)。由于 SPI 接口是由 WiFi 而非蓝牙控制的,因此在调用此 API 时,您需要确保 SPI 接口已启用。

BT disable

Ameba BT disable API void rtk_bt_host_disable(void) 将发送厂商命令以禁用 Ameba 蓝牙控制器。如果底层接口是由 WiFi 控制的,请确保在调用此 API 时接口处于启用状态。

BT send

Ameba BT send API uint16_t rtk_bt_host_send(uint8_t type, uint8_t *buf, uint16_t len) 将根据传输协议,通过底层接口将 HCI 数据包发送至设备。

BT receive

Ameba BT receive API void rtk_bt_host_recv_raw(uint8_t *buf, uint16_t len) 将从底层接口接收原始数据,并根据所使用的协议(如 H4、H5、SDIO、SPI)将原始数据解析为 HCI 数据包。

随后,API void rtk_bt_host_recv(uint8_t type, uint8_t *buf, uint16_t len) 会通过 HCI 接收回调函数,将解析后的 HCI 数据包传递给上层协议栈。

底层接口

备注

目前仅 FreeRTOS UART H4 接口驱动已就绪!
UART 接口由蓝牙控制,请参阅 uart_if.c 获取 UART 接口配置信息。

APIs

bool rtk_bt_host_enable_with_h4(struct hci_low_level_opts *opts, APP_RECV recv);

项目

描述

功能

注册 UART 接口操作和上层协议栈接收回调,并启用 H4 协议

参数

opts: 底层接口操作

recv: 蓝牙上层协议栈的 HCI 数据包接收回调

返回值

成功返回 True,失败返回 False

bool rtk_bt_host_enable_with_sdio(APP_RECV recv);

项目

描述

功能

注册 SDIO 接口操作及上层协议栈接收回调

参数

recv: 蓝牙上层协议栈的 HCI 数据包接收回调

返回值

成功返回 True,失败返回 False

bool rtk_bt_host_enable_with_spi(struct hci_spi _opts *opts, APP_RECV recv);

项目

描述

功能

注册 SPI 接口操作及上层协议栈接收回调

参数

opts: SPI 接口操作

recv: 蓝牙上层协议栈的 HCI 数据包接收回调

返回值

成功返回 True,失败返回 False

void rtk_bt_host_disable(void);

项目

描述

功能

关闭 Ameba 蓝牙控制器

uint16_t rtk_bt_host_send(uint8_t type, uint8_t *buf, uint16_t len);

项目

描述

功能

将 HCI 数据包发送至设备

参数

type: HCI 数据包类型

buf: HCI 数据包缓冲区

len: HCI 数据包缓冲区长度

返回值

发送到设备的实际数据长度

void rtk_bt_host_recv(uint8_t *buf, uint16_t len);

项目

描述

功能

将已解析的数据包从主机驱动程序发送到上层协议栈

参数

buf: 从主机驱动收到的数据

len: 收到数据的长度

void rtk_bt_host_recv_raw(uint8_t *buf, uint16_t len);

项目

描述

功能

将从底层接口接收到的原始数据发送给主机驱动程序

参数

buf: 从底层接口收到的数据

len: 收到数据的长度

Linux 驱动移植

TODO