本帖最后由 vt2017 于 2022-8-26 19:30 编辑
AT32 HOGP开发指南
前言
人机接口设备(Human Interface Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。
支持型号 列表:
AT32WB415
1 HOGP概述
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。
1.1 HID 角色
在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备
一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备
如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
1.2 HID 主机
HID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处
理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行
有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
行为、第 5 章连线建立。
1.3 HID 设备
HID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。
2 例 蓝牙键盘实做
HOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能
够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中
进行了讨论,这些部份组合在一起以实现整体功能。
2.1 报告映射讨论
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称
为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告
描述符用于 HID USB 。
该工程使用的报告映像可以在
app_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
USB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
键,则可以轻松修改相关字段。
图1 . 键盘的部份报告映像
2.2 资源准备
1) 硬件环境:
对应产品型号的AT-START BOARD
2) 软件环境
wb415_hogp_bt_demo\projects\ble_app_remote
wb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5
2.3 软件设计
1) 配置流程
a) MCU端
配置USER KEY作为击键
编写USART3通讯函数
轮询USER KEY是否按下
根据需求去配置USER KEY按下后发出的AT command
b) BT端
将HOGP的Profile加入database
编写应用层与GATT之间的界面
在应用层中轮询AT command
透过HOGP将不同的key function发给host端
2) 代码介绍
MCU端
main函数代码描述
int main(void)
{
gpio_init_type gpio_init_struct;
#ifdef BT_FLASH_WR_TEST
uint8_t data;
#endif
/* 配置系统时钟 */
system_clock_config();
/* 初始化开发板资源 */
at32_board_init();
/* 初始化USER Key */
at32_button_init();
....
BT端
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可
初始化HOGP装置变量
void app_hid_init(void)
{
// Reset the environment
memset(&app_hid_env, 0, sizeof(app_hid_env));
app_hid_env.state = APP_HID_IDLE;
app_hid_set_send_flag(true);
}
将HOGP加入database
void app_hid_add_hids(void)
{
struct hogpd_db_cfg *db_cfg;
// Prepare the HOGPD_CREATE_DB_REQ message
struct gapm_profile_task_add_cmd *req = KE_MSG_ALLOC_DYN(GAPM_PROFILE_TASK_ADD_CMD,
TASK_GAPM, TASK_APP,
gapm_profile_task_add_cmd, sizeof(struct hogpd_db_cfg));
// Fill message
req->operation = GAPM_PROFILE_TASK_ADD;
req->sec_lvl = 0;
req->prf_task_id = TASK_ID_HOGPD;
req->app_task = TASK_APP;
req->start_hdl = 0;
....
在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。
解析AT command并执行对应的程序
void app_user_entry(void)
{
uint8_t without_prefix_len;
// GPIO_int_enable();
if (ke_state_get(TASK_APP) == APPM_READY)
{
UART_PRINTF("start advertising\r\n");
appm_start_advertising();
}
....
2.4 实验效果
按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页
按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)
2.5 按键定义
本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:
多媒体按键值定义
const uint8_t media_key[47][2] =
{
{0x24, 0x02}, // WWW back 0
{0x25, 0x02}, // WWW forward 1
{0x26, 0x02}, // WWW Stop 2
{0x27, 0x02}, // WWW Refresh 3
....
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个
数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。
2.6 HOGP 相关 AT command
本应用指南中,已经建立部分的AT command ,如下表
表1 . HOGP 相关 AT command
用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
at_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT
command 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可
能会不正常。
详细内容及代码请参考附件:
AN0145_AT32WB415_HOGP_Development_Guide.zip
(1.77 MB)
|