|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Terran 于 2022-10-20 10:02 编辑
/ l" l5 O9 Z8 b) w! s5 _( ] j7 w3 m+ H$ R" A# O
AT32 HOGP开发指南+ l' I- d' r8 [' |' @# l
0 V+ ?8 c- P) _4 [前言6 b. P+ ~$ m* }2 L: H% k
人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。 x6 y. A4 I# C1 }* s
支持型号 列表:4 H/ q) ], V3 R6 Q! j
AT32WB415
/ B5 k1 z4 Q& Z% J# [2 o' f" Y7 `4 |! s$ [
1 HOGP概述
9 W- L2 n+ I6 Y1 ]% L/ \7 a8 Z( m( jHOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。
. L$ k1 }7 P7 `% l$ J8 S. B, P8 {. b5 p, X( ]0 N4 I" ]- X% M
1.1 HID 角色8 O3 |( S) N: B( c' a
在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备
; `% l7 G6 [) r9 O一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备 q' J; n/ [+ a& s9 J- J
如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
% c) t8 s4 ^ {2 y( o" F0 j7 I3 ^8 z/ K+ }' _+ _9 b
1.2 HID 主机
! a+ T& I {- v- X1 lHID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处
1 D$ }8 h( x) C5 d; p( h; e理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行' W$ z ]1 f3 x8 c, \
有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内' P* ~' b0 J% E' o1 A; r
容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
D" F4 `5 B: \0 x- g9 n行为、第 5 章连线建立。# f$ _# V( \9 z. \$ C
) e3 \. ?5 g' W$ o7 d, l1.3 HID 设备( [+ {1 ^9 `% M" P7 y5 v; j
HID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标
" c2 z% X2 Y4 i2 ?9 D( A或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。( X# V/ N1 I4 N
# V2 z Q* F9 `; H0 P$ r i" n
# t+ s4 ?1 ^7 a. L, Y O2 例 蓝牙键盘实做3 N% x! K* |: @+ D7 I
HOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指
/ Y5 F9 A' N% _5 J定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能4 L$ O3 Z/ Y, j: Q) e J
够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中/ g" O6 m7 x+ q) h
进行了讨论,这些部份组合在一起以实现整体功能。2 j F/ {$ U) F Q J4 c% M" ?
% Y) j8 G3 Q9 D2.1 报告映射讨论* a8 g8 E3 |* U, p
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用6 K E/ e8 k' _2 f k& n9 A. G8 W# T
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称: X# D7 S7 T( J: h% N
为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告( o6 F- L+ a( S( {7 g
描述符用于 HID USB 。8 v8 l' s F& L" d( d" U3 B
该工程使用的报告映像可以在) O5 A* x, |& r3 s
app_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此
; x% ]( s. \! B' c6 E: b( u/ K; l工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用
5 n% f4 e; F2 w% s) |. i8 i- w9 |报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
; H' C, z6 a' c* h; IUSB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显$ W$ P: p, W4 O/ |: `& o: n( N1 R
示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
( E) i# Z# o7 m键,则可以轻松修改相关字段。! n( @ X, H* p& q2 @; n7 g. |
o _; ?" ]* F+ N& N- Q2.2 资源准备
7 k1 k# d) U+ Y$ N- L- O2 L' P1) 硬件环境:
v( H6 z: u- [9 F8 V, E, B对应产品型号的AT-START BOARD
W. ]% z4 S/ f& f2) 软件环境; a+ n5 R% u- n% X! t" R" X( n
wb415_hogp_bt_demo\projects\ble_app_remote
: v$ \8 I0 x9 y+ Zwb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5) k! A6 R: L, ~- ~5 T
; i6 ^: V: Z3 ?; V& t
2.3 软件设计4 c; O, e% k( F) h9 N
1) 配置流程" v' `" k u/ o
a) MCU端
3 _3 G' w6 K. r9 n 配置USER KEY作为击键& h7 B, T* q" O( q2 `
编写USART3通讯函数) E3 k1 D+ _6 r$ `0 l% ^& _1 s
轮询USER KEY是否按下
; N4 @; y7 E4 j* E- u9 z 根据需求去配置USER KEY按下后发出的AT command0 ^6 ?8 h1 J q) F2 S
b) BT端4 r* j6 }* O6 I+ E5 d; A
将HOGP的Profile加入database6 j9 r1 A5 Y, c* _) W q
编写应用层与GATT之间的界面
6 x5 t$ ]7 q% U7 u: g 在应用层中轮询AT command; J6 r8 r8 ~! a& q
透过HOGP将不同的key function发给host端
( |8 i' `- z i2 G+ j. q2) 代码介绍
3 x: _; S. k$ q" B MCU端1 Q+ @$ n5 @# A% w
main函数代码描述
& y3 w: ^6 o+ o. A7 d7 {$ K) d1 r( 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();
- ..... m# j& i" x" i, I& y8 z( x% ]3 c. o
" x/ w6 a6 m& U! i5 \$ }
BT端7 n& _1 e7 Z7 \+ ^7 O, p
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可# c u# x9 a/ ^5 y) X
初始化HOGP装置变量
7 Z5 l9 |9 |6 f8 A- {2 f- 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);
- }
0 T3 n8 |9 h, A1 M, o4 |4 a, U $ D; K" i4 I9 @" E
将HOGP加入database" \3 T1 n+ a6 j* a( V
- 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;
- ....
' C" v( k% ]& {- A& V & r- f5 \# n6 ?: _! y4 K2 k
在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。
& f0 ^: T! x5 Z ^3 r1 ]* z, | 解析AT command并执行对应的程序
4 _: N) F, [3 P$ n3 Q& `- 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();
- }
- ....! z V& T* K' s- D3 b4 D7 n9 P
6 ]5 V I O9 I1 r: c$ X9 {& H0 N
2.4 实验效果
# A1 f: A; i5 E 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页' o% }, ~+ c, X1 Q
按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
) R+ \. ]; b O s# H+ j 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)# L+ m" d% V9 b! N
! B/ o/ t$ r' |2.5 按键定义
0 d# [ b3 }1 ?6 Y& A本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:
& S7 o* p/ n) A+ n" |6 F# R; u
/ @, \* x2 h {% D 多媒体按键值定义
7 z1 w0 j" V3 f1 ?- 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
- ....) ?; z/ t/ U1 T4 |) P
0 q: ^& G$ S% a- H
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
/ q% c: e& x9 b1 _5 y0 V# B- A这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
1 m# f8 G1 Z+ x. q9 y$ _2 k降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个
% Y+ G9 k. Z( W. w6 r$ L数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。+ ?5 k0 ~5 n3 B
/ B; _ X1 @; A1 ?
2.6 HOGP 相关 AT command' s* V' g- J' M3 u
本应用指南中,已经建立部分的AT command ,
2 [2 Y0 F6 {6 u
/ s- z( _' J- |; F4 X用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
- q* ]# \$ ?" d' v1 {7 M. L, K+ dat_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT7 a) Y* b$ y4 c
command 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可
6 A* v+ Z `, k% M6 r! j能会不正常。& W5 _0 B. |& p7 d/ \( D
|
|