|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Terran 于 2022-10-20 10:02 编辑 / T$ ]& e, W! A+ ^
* @, O* X- `1 \$ j3 f" Y9 i. [7 ZAT32 HOGP开发指南
: E; Z: D' u% E6 @& y$ U q6 W) i% t1 G2 N( w. T, \0 s
前言: N( M- o6 Y; ^; e- L. n# O
人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。+ Z) I3 [4 @! b! `' q# R7 o$ g/ G
支持型号 列表:
& q4 a2 y7 h$ ~AT32WB415
* n9 m" v& s% \3 N! c8 f, }, A5 G8 F% U) {) Y- R
1 HOGP概述! h" F$ |2 e8 x. E2 g) X1 ?
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。3 b. p$ H, o) ^" e$ t$ c
# \* W( W' I( ?1.1 HID 角色
+ U+ r2 Q5 ~7 I* E! ^在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备' h2 Q5 U+ W6 B4 k% u: V0 V
一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备
: P7 P: D9 i9 u- z如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
5 V; j( a1 a- |! ^: n7 _6 S7 h
' Z# c1 }. W0 h, g, |& Y1.2 HID 主机
5 m) W$ G5 `9 G- `HID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处
1 ]! w3 q/ M! L" Z理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行
- h: g9 W- e4 j) ]6 @6 O有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
, S3 b' Q6 x: S) Q8 ], E容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
* w' f' j; q7 e7 w; ]5 A7 V- Q行为、第 5 章连线建立。
& w Z' U1 ~: ^; J, P; P6 ] E+ t0 n c o$ D) g% t; o/ |
1.3 HID 设备2 j; ^0 _1 o0 [/ g$ P0 }
HID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标
; v5 |% G+ n8 j+ b或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。
* i+ O9 [3 o! ?/ k/ u7 \- R T! e& i- v; m) b4 p% n$ k
3 z4 H' x/ y0 s2 H8 j9 \8 i
2 例 蓝牙键盘实做
% A5 A8 ?$ Q, b* F' `5 q. Q$ lHOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指8 y# S0 l* M E" q/ p
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能
# \' A7 x X8 \; a4 K- a4 m够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中
$ j* b% h( k& ~) F; x进行了讨论,这些部份组合在一起以实现整体功能。
# m% O" F8 N; @, J/ r, a
) [$ I# X" i' T- A- Y2.1 报告映射讨论
9 d; b4 J4 m, `* mHOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用- @( z; j" @ _) _6 ]
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称( ]6 T. i& l# V
为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告2 b- p6 }4 s7 U0 ]4 x
描述符用于 HID USB 。
: W: `* }) z) \( H. ~% N/ B该工程使用的报告映像可以在# L, K2 C4 K0 V2 D9 p
app_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此- Z3 E0 `4 L' l9 ]6 T
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用
2 H! u# \. Y7 Y报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
" P& L0 `$ I" p. \ NUSB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
9 S9 G( c0 P8 Y5 I Y8 f示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
/ d1 z% E$ A2 ^: r键,则可以轻松修改相关字段。
7 M. k7 B, r# n5 U2 ^
0 T0 F6 F! E3 J! n0 Y2.2 资源准备
& F w. M1 A" e5 U" }# z1) 硬件环境:
: A. P! g& P7 |; t( u对应产品型号的AT-START BOARD
: \/ L8 b9 O. w) R2) 软件环境1 t X) U: G5 b$ |
wb415_hogp_bt_demo\projects\ble_app_remote
( W+ \! r0 K. C2 fwb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5* Z$ x9 q: K( P( X
4 k: S5 S: g% n
2.3 软件设计8 M7 t( ? Y( ^. Y7 e& M. ]
1) 配置流程
( M" p t& }4 c' B8 h' ?a) MCU端
9 ^* d+ }) O! T9 k0 p 配置USER KEY作为击键
2 Y6 G6 c q4 q4 u0 | 编写USART3通讯函数2 I$ s8 W7 B+ U6 v( T( D4 w' r) i
轮询USER KEY是否按下
4 |0 w5 q" E; P 根据需求去配置USER KEY按下后发出的AT command4 O& X- N. t Z: }& ^
b) BT端0 q- ~/ C7 s& Z
将HOGP的Profile加入database+ F9 E- J* z$ g% q) B
编写应用层与GATT之间的界面: B# j( J, M# e* e2 x) G
在应用层中轮询AT command- B7 i/ O# z4 @7 L# E
透过HOGP将不同的key function发给host端6 V9 ^* g) ]! \8 \" H
2) 代码介绍0 n" f" D4 t5 T3 l
MCU端
' S5 B& T. @' E' d F main函数代码描述
$ q& J0 p8 n2 y0 O! S1 L4 u- 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();
- ....
( c, I9 S: R+ T- n- j
4 J4 p& X }+ r: y BT端2 d; U8 f$ K* g! }) T$ a8 u) a
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可
. {; R0 p" Q: e( o% ]: e 初始化HOGP装置变量9 n% K; e; z# X- O7 N o0 n# 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);
- }
; F+ \$ M1 D; A" z; t4 j
& x, x. X7 L: W 将HOGP加入database
3 f4 n$ P' Q; m, | E- 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;
- ....
/ M7 j ~% k: w* V1 q" T # x) Y1 y2 b1 `# ^
在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。* \6 m0 ^5 \* p
解析AT command并执行对应的程序
$ _7 }0 r# R2 I- 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();
- }
- ...." l) F1 i5 n6 |/ E* O
) c( S( G& n4 V: M2.4 实验效果
+ h8 N7 S9 y% V8 ` Y 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页$ ?9 C5 e7 r1 D
按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
1 B, q9 W% j- L2 H" f, m6 ~7 { 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command): K, q8 W$ D% y- {4 r& W, Y: \
! C& l2 `9 F9 u" T$ Q( R' \4 c8 C
2.5 按键定义+ |4 Y! `. Q8 L; V+ K, M4 {; y$ l# p
本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:9 ?+ o/ V! t% H
+ o+ x' I* m2 ]* k. _4 ` 多媒体按键值定义
) I1 j$ a, G9 p4 R9 n- 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
- ....: b5 R) X" f5 P3 E8 A6 ~
1 }3 d$ L$ N P5 w
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report' v7 U2 u! G* x; ?7 R
这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
x8 \5 \0 f8 U. j% t+ U$ K7 |降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个( _2 @2 C9 ~3 e& |5 L% Q2 U
数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。
6 ~$ p: f/ K, W" B. _
6 E* e4 K* m6 ^4 t: a* ?2.6 HOGP 相关 AT command
) H' O3 ?7 }+ D3 U* m! ~8 Z' d本应用指南中,已经建立部分的AT command ,( n" ?+ n5 T) p% E* b( W
+ X$ d2 Y1 r) ^- O+ K
用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
! F7 m* |8 @5 R& U! \5 i' mat_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT
5 S. A: n2 J( Kcommand 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可
( d6 _+ b9 O2 M1 `& {" s2 I能会不正常。
! Q/ H4 V K% Y* t% | |
|