|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Terran 于 2022-10-20 10:02 编辑 - z# y- P1 |1 R& |! v" R4 p8 d' {9 l
: E4 I# j1 _' _" b" P' w
AT32 HOGP开发指南0 g$ e4 Y5 C0 Z* E
% b; @; w F2 {7 w. g前言8 U3 @8 p* s9 D) z* L s# l% Y# S2 r
人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。6 C8 u4 Q* O3 i6 i3 n4 h! e
支持型号 列表: g' d) s; y' Y) H, u O& Z
AT32WB4154 K+ z: e, g0 m( d \4 Z; p
1 \* {! F& |3 V7 A1 ?" n1 HOGP概述5 X6 m( j& @4 V. I( w
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。
% |) ?- O" c* W5 x! R4 m3 k3 T$ g, j7 c2 d+ g
1.1 HID 角色
) ~( C8 h9 a/ X2 {在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备+ X5 q, w- B8 E5 c9 _
一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备
, ?) u" C- ]9 s! }# |6 s h. q如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
# @1 ], e4 K* I( C7 z4 H* P. i4 k' ?
% S. e% m: U2 m0 p( Q1.2 HID 主机
6 q; t" u, q. K5 m4 dHID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处0 v; w) L8 J+ w( d! G
理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行2 Q0 U& Y. }) N* A
有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
( k/ c( z% ?$ W6 r+ P- Y容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
( @; `& X$ x$ @- a w0 M' a8 g7 ^) D行为、第 5 章连线建立。
' D& j& k5 H# d4 g2 I
i3 s+ f+ L- U) S9 r b, j1.3 HID 设备
0 s- A. x3 w$ U( u& U7 yHID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标1 f. B" ~4 Q; i2 E/ C. m- H) H
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。
# w) x4 e9 a6 A! M ?7 W5 `. |
& r9 v) A. e% Y L& }2 q6 \
6 j; y! j2 b/ r. H. e2 l. S8 d2 例 蓝牙键盘实做
5 c9 i9 A7 @9 d& i6 j+ S1 u# HHOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指1 N" y5 H% X; |; J9 K, v2 w
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能
5 r* G7 Q9 k1 w. V2 X& ]够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中6 v8 T" `* G( i5 E1 p
进行了讨论,这些部份组合在一起以实现整体功能。
5 b# y. q/ ]! Q0 n, ^8 i; b+ Y; A/ O7 T% K
2.1 报告映射讨论% ]' V9 B- h6 m B8 O+ A
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用* h, x3 N8 C3 O" k$ L* j2 b
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称
+ V, ^( o; e P; d- M! e为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告
( }2 G$ `6 X( B描述符用于 HID USB 。7 [! } y$ U) _ |9 N8 r
该工程使用的报告映像可以在
; {0 T. ^3 W# Oapp_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此5 Y% r2 e" s# e- r! c6 C7 C y+ i7 y8 V
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用7 S2 H2 _3 G* W
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
9 ~* y! e: |( ?9 k# n Q: HUSB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
- Z$ S. T# i2 o- D: L; D示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按. Q- B) U, O9 p0 h" g
键,则可以轻松修改相关字段。1 p+ {2 D' K- [) |# ^
% B3 M2 v$ n1 ^2 H2.2 资源准备
/ h1 ]. T/ r$ ^1 K1) 硬件环境:
) A! _6 ?) W$ }% r对应产品型号的AT-START BOARD* s3 \) b" `0 c/ m( k4 `$ E
2) 软件环境5 @( v5 r4 j& ]8 z$ z0 ^
wb415_hogp_bt_demo\projects\ble_app_remote
' G6 f3 ?+ K0 I' bwb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5
3 g& H0 C4 v* A% p; f
, a) U: ]5 _7 S5 f; D; [4 c/ t2.3 软件设计, H, a6 s" \7 F3 v1 A7 z! L
1) 配置流程
9 e& @. j4 B( q, p/ x5 C3 Wa) MCU端$ i! P) {0 C' c/ B
配置USER KEY作为击键
1 u) J) l; P$ }3 R' L+ _ 编写USART3通讯函数
/ A, g0 W Z7 ~1 U, ]. K 轮询USER KEY是否按下. s( x1 V- z' G# W; ^7 m% c% `
根据需求去配置USER KEY按下后发出的AT command/ d) X: \" J! E- v& F6 Y: w
b) BT端; d+ R9 M8 A1 t! y% r; y- v- f* q
将HOGP的Profile加入database$ |6 v, s7 w+ _
编写应用层与GATT之间的界面
, n1 a1 ]8 g' h! O4 K 在应用层中轮询AT command; M8 b1 J" w$ C: L- Q0 B! e4 O
透过HOGP将不同的key function发给host端
/ k$ y0 H6 j& ~5 M/ }: ]* |6 d2) 代码介绍
: f1 z9 R3 z: G7 C. j2 J MCU端6 Q; O7 M: N, e4 P
main函数代码描述
" g& \! D9 j% j6 x* L" v( 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();
- ....+ e* v% O" N4 c0 y9 f% n( t' o8 i
6 a9 z1 U. B4 c4 Y2 ~# p
BT端
( { A, b0 E% d# P9 p: _0 k原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可. `% \% Z# L1 b7 |
初始化HOGP装置变量
- i5 h( f, Z1 M' ]. c6 ?- 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);
- }
5 U7 s. Q. A; N4 P' O
" m' {* x/ {% ? T. f 将HOGP加入database( h W% W& H6 q; V/ s
- 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;
- ....( L- F7 a5 a( N' H3 ~
9 F7 O, _% B* [在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。
# B; z/ S L" x0 z/ U' P/ Z# J' M) @ 解析AT command并执行对应的程序) F9 b+ C% V3 S
- 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();
- }
- ....
+ F) ~' t$ k9 Q. i; a `$ ~# H& r & Q% n& f# R, e; |4 n& P# b0 D
2.4 实验效果( g* A' T$ _3 o) o& \& U p% O
按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页
! B& f& D9 `( {4 T 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
8 |1 ~9 s5 @7 F7 \' \ 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)
2 D0 b) o7 E% A/ B8 U, T, v* Y9 ]) K* A
2.5 按键定义
8 n6 v- B5 z t, A; p% g P本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:
8 I1 p: k- w3 S5 g8 K
% L, d( R8 `# c2 N4 e8 h 多媒体按键值定义
, i5 C- R: x3 Q# Z" |4 E( F% n6 }9 a1 f- 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
- ....0 @7 G) f6 Q/ u
! q; ^8 Q- o$ R& V( |在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report, e0 v Q+ E8 \# d! A) {9 A# Y$ q
这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
8 {7 m2 ` v3 z5 h0 s' m& H降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个: b* o6 |6 \6 s& f+ z. [7 i7 a
数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。
( k( k5 Y! a. e1 |9 ~" [6 @1 ~
. P; q7 h% D! T7 z; X% ~9 |2.6 HOGP 相关 AT command
/ E+ Q$ P* U- b& {本应用指南中,已经建立部分的AT command ,
( X1 V% Q: W# D* d/ m& w0 T: E9 l, f) u1 j/ Z9 c' |# n% }
用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在3 y) L1 R: U7 E! E) i& ] M3 v
at_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT+ S( y9 {* C, f: X H% L
command 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可
4 P2 ]; J% X2 F, a能会不正常。
1 _% H6 \* j* K, @7 h. K$ t) a |
|