|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Terran 于 2022-10-20 10:02 编辑 " k" X; r4 q$ d5 \0 O5 c0 h
3 @3 w# G1 l$ X, m6 E/ ]. _" I
AT32 HOGP开发指南
. {- q# g2 n% k' i
+ f5 ] K% l" q' e; \% |前言2 m1 i' J! `+ a9 b* g0 j, c
人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。
6 _; m$ S2 O! a/ T; E4 d: v; j支持型号 列表:
6 d! r, v" u% v$ X; Y c- ^AT32WB415
, W+ q g8 U1 \' |; I5 l" m7 I1 O
1 HOGP概述0 d7 \6 C& _: r/ r& K, c* k5 C
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。
! d o$ x1 R* o+ V1 A/ o; F* _
* u0 C* e2 }& ?5 m* o1.1 HID 角色
9 K+ u% b* W+ l+ v3 \8 g在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备$ `: Q$ s$ W, Y C
一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备
2 N0 F! x; I8 @% [0 M9 \! G如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
# l& Q" I$ }2 s) c$ u6 K1 d2 n$ ]# _, Z; n
1.2 HID 主机
2 E- T3 w+ K5 S+ A& ~* C$ O: _0 VHID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处 X/ n! X* M! `4 o$ }+ C: V! }$ ^. o
理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行
# u; w" Q. x# x有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内# S7 [+ O& C. l5 W* Q% V/ M' b
容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
% X# J" m5 H2 h$ z! y行为、第 5 章连线建立。
! n9 Y q+ z: }" u2 ~( s4 E4 @2 a" F6 ?4 M
1.3 HID 设备8 h, [1 [+ s0 S1 n1 o
HID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标
6 U8 I: W7 N7 m& i- [+ j' I或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。# f' D6 K4 X, ~ Y: k$ f/ P
1 G O. e" b8 o. w9 i1 t, E) \0 G
; i% ^) E9 h/ K. u7 I, n( f( u: U2 例 蓝牙键盘实做9 @% J9 E! A6 g% E9 k0 v+ T6 P
HOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指0 z! \% J: _- W3 G7 p( z
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能+ ]$ A: O" L7 F) r) U {, x5 O
够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中9 U- H" y- G. h4 p+ c! m, z& d) `
进行了讨论,这些部份组合在一起以实现整体功能。+ P% F, r! G7 R$ t. Z0 Q
) x8 P8 \" |: J' r* n
2.1 报告映射讨论1 M# }' V4 m! f, ~# M2 `
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用; n5 v5 F& p+ a3 ~# K! X
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称
# s: Q( r8 k. u( M6 R8 r为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告
3 h* D% ^5 f$ u9 o! ?描述符用于 HID USB 。! A* a! `! J$ K
该工程使用的报告映像可以在
: _4 \' V- U7 o" `$ b& z, {" Napp_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此) k9 j) {2 s/ h |0 P, W
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用
, p$ k$ \ b6 h0 A报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
% v# E* x y9 z8 `5 PUSB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
& s; S7 h/ @6 ~" N v示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
9 [# o+ X" r5 b8 O* [键,则可以轻松修改相关字段。- v; i! g/ X0 d/ p) h
3 Q: r( m: z4 i T2.2 资源准备2 o( w6 h/ g- n. F: O
1) 硬件环境:
9 y- ^5 B4 s: V! P1 b' M对应产品型号的AT-START BOARD
! o3 E' Z0 ]" c/ `/ k$ l3 E7 T2) 软件环境8 g( ]! k0 ^$ M( T) ^) X
wb415_hogp_bt_demo\projects\ble_app_remote# f7 r- ~ u0 x) f8 X& H/ u
wb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5, d( E2 p( ^4 v
! Y, ^" K0 @1 \) {) d2.3 软件设计* M) B% a4 H/ t! M7 U) N d; a
1) 配置流程# I v4 V- ^& B: {! f# K
a) MCU端1 f I9 R0 n7 ]6 ]- q
配置USER KEY作为击键# p" \. }3 n @
编写USART3通讯函数
5 |9 ]3 Q2 b3 |, \' c8 M7 x% Q 轮询USER KEY是否按下9 N1 Q5 a! N Q) p
根据需求去配置USER KEY按下后发出的AT command0 G, z# r( U1 d
b) BT端' V& A3 S1 N8 [, W4 r
将HOGP的Profile加入database! N. e; E7 V: F" E
编写应用层与GATT之间的界面
: c$ h. i: y0 G. A5 y& v1 ?0 M9 { 在应用层中轮询AT command
6 S9 S" w9 y0 ?/ j9 H3 n 透过HOGP将不同的key function发给host端 |' Z) A4 g) s7 x
2) 代码介绍% p6 z9 U1 F7 c2 ~* _/ d
MCU端
9 r+ n' `; N2 @3 \& x' R main函数代码描述% J) Y4 P; r6 u" R5 i( B+ D/ Q2 m
- 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();
- ....
7 ?$ l6 d+ Z3 e, b# @ ( v5 z, ^2 k# j$ V: }/ Q
BT端% p- R" @, [- I/ \2 Q
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可/ @. _' s6 Y4 w5 ~ g h& C
初始化HOGP装置变量4 Q! o6 d7 c* A9 c8 n
- 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);
- }
! c( q1 u" e3 L; `0 Z
3 e7 E( w7 Y( ~8 E9 F# j+ z 将HOGP加入database
4 @5 w6 r1 o2 ]; Q: M9 H- 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;
- ....+ E: a0 Y/ l: v* b
! t3 X! I; N @" m9 s- J1 \- p' n在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。
2 z% N1 N$ q9 H. j4 Q4 L% @ 解析AT command并执行对应的程序# u! {) i9 ]! U$ G) k8 H0 T5 G$ h6 l
- 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();
- }
- ....4 p8 R$ s- {/ H' W$ ]
6 ^9 l& S$ ^# r
2.4 实验效果
* ?7 b- V! `$ @/ U3 l, Q. p p 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页
0 N1 n: d: p+ n; _: l- h" e0 B 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)* M2 `! s2 e* @, t
按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)
; \) Y( [7 _! v4 f9 n; j+ ?1 _4 P* |
3 V; O( N; O- A: z& J2.5 按键定义
' \$ Z0 n3 m0 B: h本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:* [" ]! m) U1 |* o
6 h8 ^3 u' b5 o0 Q2 O 多媒体按键值定义+ a+ w; _( V& n3 g
- 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
- ...." n$ F' z3 n# y$ k: S
D! ]' a1 M& s/ D% }2 S% a
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
: T! W& H0 P& D& ]这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
7 ^+ L6 |5 d+ B/ L/ L7 r降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个
% E- P3 U7 ]7 g6 Q3 V数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。
0 c6 l3 l# w8 E6 T
: `* x( g+ E0 Z, z2.6 HOGP 相关 AT command( j% |5 x9 s9 c2 t
本应用指南中,已经建立部分的AT command ,
4 W& Q& N q& Z! n0 E
( h6 Y2 t; Y8 _4 ?; i% ^3 i用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在' W* w* x: Y. u( P, B# a- K. R
at_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT, v9 \' @4 g$ X5 ]/ s/ Z
command 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可/ t% {2 o* O! z+ A V+ h' _
能会不正常。
# \9 P2 Y/ Z; F. p- W$ u |
|