|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Terran 于 2022-10-20 10:02 编辑 4 B4 x) v4 w) _: l: e
" d- z( r8 q* ~AT32 HOGP开发指南8 _9 u6 R& _, S4 m* G
: p+ k Y1 y, C9 x. }/ g6 y! k前言
9 o4 [. E3 o: O1 X人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。
, x7 H* w. k' r# C支持型号 列表:1 H2 Y3 x) {, n) ?
AT32WB415
9 r, Q5 D' D/ [0 k4 a, |1 N A2 D; Y/ }$ S/ B) K! I1 r
1 HOGP概述& L" o8 ^- u( z& w- U. v
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。- R. u% P1 d3 i
# N1 f$ j( f0 ^
1.1 HID 角色+ c2 J- q$ j1 l* s* T+ ?
在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备# r/ y; C' |1 |2 L( S- M6 l" V
一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备1 j& c" w% g4 ~' |6 ^2 X- C4 d# n
如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。 F* J) ^6 x8 G* Y
5 r) a o/ Z# Z7 O0 W7 \. G) W1.2 HID 主机# N$ r; D* S1 ?
HID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处
/ D. Q( p/ t$ u8 @ K理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行
2 s& @3 `+ [4 D; V有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
1 m) Y4 H r/ k8 n1 S. X, t$ X# T( c容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和7 ^+ m6 t0 S, [4 ]8 }) x- R: i+ T
行为、第 5 章连线建立。
3 G$ @4 z9 \- y( p. | l' W9 F3 @6 v; j
1.3 HID 设备" O" g% R; l. B7 R8 x3 T
HID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标+ A3 R/ y' d7 n2 B
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。
& H9 e7 ~! e* G6 J5 n4 P, }/ |' n
( S& @: ~* L) v6 W0 K$ p- _. c
4 G( j; l+ ?/ l, J% E$ g4 Y2 例 蓝牙键盘实做, o, Q3 K2 }0 o/ N7 L
HOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指% H7 J+ K' X8 }+ E" h
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能 c5 @8 S7 g" [! s ^4 i
够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中) ]! l [2 D. X4 e7 H
进行了讨论,这些部份组合在一起以实现整体功能。$ e" f9 l) h8 j9 t/ A3 \% }
! P/ |; @- `1 f2.1 报告映射讨论
$ L; s4 F' |4 q& f- @* DHOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用( B: ^1 B r. l# y7 [2 q2 M+ k( ]
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称$ K1 V* |# p* P$ j
为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告) C! L3 u" k ~0 J0 ^6 |
描述符用于 HID USB 。! Z: z: L$ ]" t: n& u) _' e
该工程使用的报告映像可以在
& o' j6 G! V1 lapp_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此5 R9 Q( p& M/ U& C5 q: d0 x& ~
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用 n1 g% o$ }3 }1 L. J3 d
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,& w: X2 h" U- k
USB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
; I: J' _. p, B$ Q# j' V G示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
5 t! e6 {8 ~- l& s3 O f; D键,则可以轻松修改相关字段。
" V. e2 `+ S5 x; X
" ~9 I* d( A; T6 v4 e2.2 资源准备
3 o6 Z! Y4 z: J' Z6 h1) 硬件环境:
& q. o7 a- i5 l8 _7 T对应产品型号的AT-START BOARD
% j K L8 h$ }, U# |2 M7 z# m2 O0 [2) 软件环境4 N+ R4 O- `( Z5 i) n: u
wb415_hogp_bt_demo\projects\ble_app_remote
, C$ n9 X0 G" B! j P0 _2 u- swb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v55 T# b9 @' e: Y& s2 U; V) I& b
- Y& e) P* I: N; f2.3 软件设计2 D+ N7 C0 {( b* L
1) 配置流程
6 ]: R/ A5 K7 a% f/ f9 Na) MCU端
2 _! W& ~; z2 }+ d6 ] 配置USER KEY作为击键1 I5 G4 Q8 C1 q; `) m2 s7 D
编写USART3通讯函数
/ Z) y4 ]4 e3 N) R" Q% V 轮询USER KEY是否按下0 E6 m/ j) z. ]3 ^8 P
根据需求去配置USER KEY按下后发出的AT command
# e! n% S/ ]& G; Cb) BT端
! M u& B% c- }/ N 将HOGP的Profile加入database2 ?/ O3 u% M1 t% _7 ^5 R
编写应用层与GATT之间的界面* ?/ X. z; [) y$ c0 q
在应用层中轮询AT command; W' c0 `+ D4 `, V5 h! q
透过HOGP将不同的key function发给host端
: h% E/ V# |2 ]8 l, a6 {4 F9 L; Y2) 代码介绍8 v" a. L- \7 q {( E; R/ C5 f
MCU端7 h* \& b; y$ R9 |
main函数代码描述8 a y* m. R; |1 L* J1 ?
- 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();
- ....
2 ~; {; Z# [+ P 2 W8 |- K1 K5 M6 Y3 m- s/ B* B
BT端
* R/ x) t" }5 T" a原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可
% N* I8 v4 G* b, }0 z; [ 初始化HOGP装置变量& ]3 M, z& L$ x3 I
- 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);
- }3 p7 G* X$ `& v$ y) d$ l" G+ v
& w6 |0 Y% |. x' ~* g! i$ v 将HOGP加入database* D) |; M1 ~4 L) C+ ]
- 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;
- .... j }5 B# Y3 m( G* d R
8 k/ k d% A4 A# ]5 \' y' Q在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。 `. S0 O* M6 E2 L. R# Y/ I* G7 P5 q
解析AT command并执行对应的程序2 F! z' o/ X; D; ^. W6 P
- 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();
- }
- ....9 R9 r7 E- ]+ y6 _ A6 M. v7 Q0 {
# W8 W) f- f$ J R# R: s* h2.4 实验效果
, h; x6 L" t _* W3 j 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页8 v% \5 E9 n+ C
按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)2 t9 ~. j) [+ Q- f2 n
按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)6 B d3 O0 h* M# i, A; e
7 w* m1 Q5 i' c. \: k- M
2.5 按键定义
! L( I: ?% ?% }' {4 ~! r6 S本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:$ x8 g& C5 S2 M' i" W
, w m2 x5 | }$ f- H- u 多媒体按键值定义- L: l% d; O0 l
- 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
- ....
& K9 E5 ]" c, u8 I' W r 6 Z* j( l* G6 H3 G; p4 e& l% h
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
5 [$ ^; H* p2 k4 H" U8 v$ v这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
! m" Y$ D$ }$ {0 v: x降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个
) Q [/ D& h) P; Y/ Z数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。
" \% Z7 c6 J3 F, S/ \, n7 v$ _7 [
2.6 HOGP 相关 AT command
3 r" G- C' H2 P& T; a本应用指南中,已经建立部分的AT command ,
9 d9 K9 W* b: U1 x+ s( D" X/ C+ T/ Y* z4 S, ?. E |( g* S
用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在: E9 V3 ?0 }5 J3 {2 w
at_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT
: o( p; R: h" `' ~, p6 Gcommand 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可
5 }/ T+ g; X0 L# e% R4 `能会不正常。
( c. S* P$ q2 z. K/ J6 x# I |
|