找回密码
 注册
关于网站域名变更的通知
查看: 211|回复: 2
打印 上一主题 下一主题

AT32 HOGP开发指南

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-10-20 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Terran 于 2022-10-20 10:02 编辑
, f( Z2 a) A; F+ l6 w. h1 u4 a' s* [' q! u/ _2 N% S4 ^
AT32 HOGP开发指南: @8 G3 o  r- q7 f, _

$ S8 _6 t4 C: O$ p, e前言
8 P1 p5 l, R) ?人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。
# u+ X0 V5 y' r+ Y% r1 z7 _1 E支持型号 列表:
# S% ?+ ?# X3 U; F! z" h1 g; }" |+ TAT32WB415
4 h  y: t, }! ^3 I
, ^5 b( v! e5 p; y4 {1 HOGP概述  _' q$ E6 w$ J. d
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。
0 X  g9 k4 Z8 M2 \( n# W; R* c& n$ }* e
1.1 HID 角色( ^& x) h: d7 t; h, E  f
在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备
4 x. {( J6 ^" [2 p2 I# d* Z( N  g一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备
$ ]+ F2 h# x5 o* X- B7 e/ j如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。! n$ [# c. e& z9 _# X
$ e3 c2 @; i1 }+ o! }6 @. C
1.2 HID 主机
6 A$ s/ _$ k. {2 Z& @HID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处
, z% H6 d5 [1 v( ~6 Y$ x1 o" r4 G理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行
' J$ ~2 ~) u  j6 q有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
7 }6 ~3 Y' K8 K3 U2 [7 }容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和" D7 Y. x: b$ X1 p
行为、第 5 章连线建立。
* l2 t$ F7 t! ^8 k4 l. _
$ _/ s. }( g- f# c8 [1.3 HID 设备
) y( A# x7 A' h; d! dHID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标2 M% ~) U) }0 d5 I! P; `
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。9 y5 n2 I9 m3 _; N7 W6 F6 m

5 ?1 d% I7 _0 p7 T
" t) p4 S6 x* K* {  E% Q8 ]2 例 蓝牙键盘实做
8 ?6 T" ^0 [8 n2 }0 A4 xHOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指) p9 _1 C6 S* x, }1 n3 v' X
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能5 a0 H; N  {$ r7 H
够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中5 z7 S0 m, b, z7 j0 M$ f
进行了讨论,这些部份组合在一起以实现整体功能。7 @' [8 @( W4 c$ t! r

' w& j0 D, `9 w6 ^9 ~- }2.1 报告映射讨论- S9 ^" w4 Y$ o4 }! }+ h6 I
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用
4 p8 H# u# \( B' x于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称+ ^% U) @* O) o4 O. J
为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告
/ ]) i0 Z* D# B2 I描述符用于 HID USB 。# J0 N  z9 z* D" e; d9 m
该工程使用的报告映像可以在
8 H* H5 ^3 J( m  i( l9 D5 F) [) N0 happ_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此% A# a4 Y6 J' r* ^
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用' P8 k2 y& T- O. Q+ U( |
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
& H" z, N  P4 i3 f* i: x) s/ pUSB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
! }6 m! y6 N! m# x$ g3 i. i示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
7 K& P7 I2 }2 p, I: y键,则可以轻松修改相关字段。
; ?* |- o- T) \2 _& Q. n0 E
. z+ {0 V* \9 t+ Q9 C$ ?2.2 资源准备
! [: \; C$ I# o' h! j# U! ]1) 硬件环境:
2 x' P6 |/ z9 y+ t对应产品型号的AT-START BOARD: r2 |4 v3 M: ~' q% Z8 a
2) 软件环境
5 B7 x  A9 T5 Qwb415_hogp_bt_demo\projects\ble_app_remote
( {3 M/ Y( b9 g* vwb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5
% X; k' g. n& j* ~# q7 u
4 Y8 n( F4 x) N" }; @2.3 软件设计, h1 u% s0 c$ P" ^1 p
1) 配置流程4 b3 C9 f4 U! I: E( g
a) MCU端; o0 }4 U; E1 s3 V& N
 配置USER KEY作为击键
0 E) Q% C% o5 x; I  M; s 编写USART3通讯函数: B( U1 t$ k' }5 d
 轮询USER KEY是否按下
' S9 g7 V4 o* F  p' {7 r 根据需求去配置USER KEY按下后发出的AT command
! l5 G! r8 E5 U9 S2 @: M$ Zb) BT端" s0 m; e- J$ A$ g# ]- t+ K
 将HOGP的Profile加入database
! e- A& W1 Z7 q* g" S0 m9 J 编写应用层与GATT之间的界面
5 `9 d; J1 u; n 在应用层中轮询AT command
* D( j; W! l1 P" Z& m7 p 透过HOGP将不同的key function发给host端
2 u8 |7 O0 |/ t' D% `8 g9 B4 K" ]2) 代码介绍6 s: J+ |# q; W- }
 MCU端
9 @0 R: i4 \0 Y) q# ~# H2 B8 q& p; q main函数代码描述' n+ D1 W8 Q9 h0 [
  • 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();
  • ....
    & ?) p9 q% X6 V* E$ Q: z/ H! E6 r" }

) {5 m, Y$ \; c3 y BT端% v  Q) q- q: ~/ T0 z5 @
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可8 {, ]8 C# j; f! {6 c
 初始化HOGP装置变量
% B/ J8 E! }5 \$ z7 @! b
  • 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);
  • }
    9 P) s; W3 F: E, E

, v0 A  ]4 N; ^2 f: h 将HOGP加入database
" N8 d6 ]7 Q  |$ v1 ~$ e8 \5 {" ]5 B+ O
  • 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;
  • ....3 M6 P, N. E/ j/ d
$ u' J6 ^+ G# l. ~% v1 g2 u3 r
在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。( T: C- a9 _: V& w7 s
 解析AT command并执行对应的程序- {6 `4 f8 T9 u9 o, 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();
  • }
  • ....
    & R1 L- [' b, W' T

* n. q" H5 ?6 R: F& ^7 Q& u8 @2.4 实验效果
& ^% K" N8 [, E% S 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页1 }# S2 F" X  ^8 E# `/ e  R: c
 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
- _3 n6 Z/ p3 z 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)6 H% }9 |6 r9 n* `! U5 v6 }  J
+ x; g) p5 h  {' J( z
2.5 按键定义8 ?' ~0 V7 D  Q  s# J1 k( u
本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:
$ O* L8 n4 n1 Q. E: _6 n# Y- D7 A) a/ g: I
 多媒体按键值定义* d7 n- M- j+ p% r# c( w3 ]' m' a8 `
  • 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
  • ....; `1 V6 h- [! h8 {/ ?! n* q; I. Y8 a
1 }; f& ^) N) t4 Y7 ]) l7 l
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
* R8 z  F: T% c9 A4 S/ V  [这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
* G$ H9 f" v* k$ E3 t降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个! \1 c0 |# v# K1 X) i- i
数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。! T# e# Z- f; |8 @  y/ H

1 F' W7 U0 U: Z) |2.6 HOGP 相关 AT command9 R$ ?3 y  N! |1 Z6 M. D
本应用指南中,已经建立部分的AT command ,
. @8 {; [' G' {! X. f% h, K( U
# v" D7 @6 t6 C( X9 v1 i* g用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
2 u* z* o' L& v/ Xat_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT
/ [$ M' i/ f1 L: p; b% Scommand 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可$ z+ }! E* F" T
能会不正常。* ^" S+ X4 _  Z

AN0145_AT32WB415_HOGP_Development_Guide.zip

1.77 MB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-10-20 13:15 | 只看该作者
常见的物联网应用,小至家庭,大至整个城市系统网络,无线则是串起IoT系统中最重要的通讯方式。AT32都能够用得到!

该用户从未签到

3#
发表于 2022-10-20 15:02 | 只看该作者
终端装置进行联网时,会产生的大量隐私数据,要确保用户隐私和数据安全,MCU在数据储存中的受保护区管理(带有硬件的访问控制)和严格的编程流程规划,以及操作中管理访问权限的应用,非常重要。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-11 00:38 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表