|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Terran 于 2022-10-20 10:02 编辑
5 U6 x/ j C$ U5 e9 ]9 [+ W& r" G% H+ r) b' o
AT32 HOGP开发指南' p# f: b: M8 T& e
B T% O' K* T5 `6 a' e
前言/ O$ E+ @. c: D# i7 G/ q) [. ?& v
人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。
3 N& M1 ]+ g* H$ X) V9 B! K0 K9 l支持型号 列表:- }" }/ [$ U' S
AT32WB415' P# M$ b7 e( y: ~. B
" |; H3 v$ O4 c1 HOGP概述
5 I9 X7 u5 M% Y% W$ }0 B2 yHOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。0 H9 f" b/ a7 w. X2 a( N) y' I& ?
' F$ g3 b3 ^. ^4 {8 L2 G# L3 ^
1.1 HID 角色% w0 f7 V- k b4 |, e
在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备6 r" B2 _- `* B8 {8 w4 A
一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备3 N) {# E1 O& f& |, Q X
如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。: ]0 z; g0 Y5 X( D/ Q
& t" w+ i' Z- O0 z1.2 HID 主机
; L; z+ p3 Z8 O9 |6 DHID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处& u5 f. T7 y1 [
理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行
# y, h+ O. d( U9 ^' {有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内0 p7 E" ?( j9 v- I$ j
容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
G; I5 o r$ b行为、第 5 章连线建立。
/ Z U. ~+ y( e3 {- n& c
; M, I8 |! X: a$ d! X1.3 HID 设备
3 g6 {' y, P+ y2 j, I% d! n8 {0 uHID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标! W+ k, Z% R6 _' K3 d p q
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。3 C8 Q( U8 y$ @! F) h9 \
1 ^- z1 w$ A/ M
! h2 q7 Z4 P0 C! d7 ~" `2 y
2 例 蓝牙键盘实做
% L* J! N3 R/ [( P9 DHOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指* ?/ [# z/ Q. ^: _: D/ T6 l# I: A
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能
( | R, \0 U' G$ h够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中( g8 Q& T' {% W
进行了讨论,这些部份组合在一起以实现整体功能。
& P; A O' t+ m
* o3 S) \: ~' p2.1 报告映射讨论# }* L" A" o7 v# h8 R" R2 j; ~+ D, K
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用
' l( w8 K8 J7 H( b ^于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称
0 L9 J' u" M; n! d/ D为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告: ?+ h( w. `* ?2 j& K( ^
描述符用于 HID USB 。
) j9 W6 a6 w/ F( D该工程使用的报告映像可以在* L3 L, e X' x. Z$ e
app_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此8 w/ v3 j3 Q: I1 Q
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用
$ Q8 E* V \, S: }* k( M) M j报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,# X6 x. M5 r, j% k7 P5 f8 {. |* d2 _
USB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
, C8 @* E. K4 v" k- ^% [; T示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
a y% P- t: ]5 C. Z键,则可以轻松修改相关字段。. |3 ]4 u7 b" I1 I& D
+ k- h6 a& C" L# a2 k4 G
2.2 资源准备. n/ \. i3 \6 H5 d. ^( J* Z
1) 硬件环境:
# l8 s6 ~" K$ g [' T对应产品型号的AT-START BOARD
8 k% O; z) m# j: s2) 软件环境- W: N" o6 s# i8 S0 s6 e# v' u* h
wb415_hogp_bt_demo\projects\ble_app_remote% C& }" c% d- v5 _
wb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5$ z! I- b% c7 H0 f
9 S) a. ~7 D' B$ D6 r$ K2.3 软件设计& F1 W8 ^4 ]7 z7 P, E) e
1) 配置流程
% o3 G( h2 g/ O, l4 n5 j/ ]a) MCU端9 b8 {% L- y8 H& c3 W# q
配置USER KEY作为击键
2 |; y @3 K0 K) R$ ^2 _ 编写USART3通讯函数
, a3 k$ k |6 G& L- g E" z 轮询USER KEY是否按下
8 U2 `5 B' `( T7 {/ b7 N5 f 根据需求去配置USER KEY按下后发出的AT command
' h- ]$ b4 E7 n) w! m$ H. |0 bb) BT端
- L& A3 W% }4 A5 ?& l 将HOGP的Profile加入database( H' u: \! \, p+ Z+ L' R
编写应用层与GATT之间的界面
2 A9 P' _3 f! t& V 在应用层中轮询AT command
& e; t3 o1 r) Q% U& e$ L 透过HOGP将不同的key function发给host端! M) b3 G1 k4 m
2) 代码介绍
8 ` x: X l' Q+ `. W4 J! Y MCU端
8 J. `' m7 t1 ~ main函数代码描述4 B7 H4 J. Q" _5 ], p+ l- E
- 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();
- ....
5 B3 [$ |; O4 C" M3 o8 |1 M
' V! @& D0 z4 d. s0 z BT端6 |' L% ~* E" N
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可
% \: v3 ^# g: l& J" E 初始化HOGP装置变量4 f$ U2 W- w3 e* ^
- 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);
- }
2 O ]' k$ a3 ^8 d* j7 N$ r ' Z' y& }) ^, i. S6 S( Z7 _+ h% g
将HOGP加入database3 f! P$ a' X- ^* F5 a' @
- 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;
- ....
1 o. q" X, e2 {* p$ w' o) C
( ?( U& y3 \4 p在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。* Z. z! j' V4 z5 l2 c" T' }+ k
解析AT command并执行对应的程序+ L$ T' ], v- [/ ^
- 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();
- }
- ....
' d* d. k4 D9 I! x ' I8 ^! o" F0 J5 v
2.4 实验效果. ~" f1 x$ A1 u1 K& Q
按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页
, X$ A, _8 j! b# I" u8 M 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)1 s4 o! O( u* T/ X* a, u/ i
按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)' @1 E" j, ^' K B
[* j2 Z$ `/ l* U: S
2.5 按键定义6 }$ a- L8 U7 d7 E
本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:
% }. M+ l# F$ n C- ^1 B5 G
2 U9 N* P8 b( O4 v S' @& }) K" ^- G 多媒体按键值定义8 p$ F' e3 m$ r: m7 `& W0 U) p) e
- 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
- ....
8 ]8 S% Z1 {. L 2 z0 N% D$ H: K2 \* n7 L
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
0 A2 G' o1 J3 g2 V4 k* e这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
- U- Y" k( o6 A降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个( @/ A) w. o! v6 u
数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。
' Q, m0 I" M+ K. O8 g% S
8 p$ W5 D9 w: t6 w2.6 HOGP 相关 AT command
% L l- r/ z8 G! a5 d本应用指南中,已经建立部分的AT command ,
0 b. A# W) ?- n0 V, ~# g; l* I% r2 }4 z: Y C0 j& @
用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
( t5 v. ?8 N( E5 Kat_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT
2 s- _2 v, `; s b. Q4 S9 u0 Bcommand 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可 R5 J; q) B- f, d! c6 V
能会不正常。
7 I: ?) ~6 K) A& P# e: C |
|