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

AT32 HOGP开发指南

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Terran 于 2022-10-20 10:02 编辑
- \) F) H0 d6 A- E0 w; H, P4 h  W" Z( u* t3 ^
AT32 HOGP开发指南/ P1 f. A9 O& l+ o2 H8 P+ ?

4 l, m0 U/ d0 ^4 [前言% C1 ?  T7 t6 F
人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。4 L. A; j7 m' U+ |1 U" J3 A
支持型号 列表:4 Q9 p- z' i( V
AT32WB415
. L2 T4 }6 u" h8 K  g5 q/ r0 w& p! c' J: h% k
1 HOGP概述
7 N0 U! X7 t% m! W( WHOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。
) P2 q$ J" I; A8 ~% I) [  G& F0 n: w0 b, [0 J% O8 c# E8 ^
1.1 HID 角色
0 S( T$ w) V# a5 a0 L" y/ _# J在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备
( m# D8 k3 F! u" {+ \7 N/ `一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备# U, R3 H: \( }1 S
如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。8 ]9 B/ D# d5 |" o

3 {" A8 C: o" J6 }1.2 HID 主机# B# m: b/ s6 [/ b( a
HID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处% ]1 |$ K0 U* _: `/ ~; B$ i
理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行8 W7 T- t/ ?  G. O
有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
7 z5 w9 p* |7 {8 H容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
3 Z7 x4 W8 [' O" h: x5 [: u行为、第 5 章连线建立。
3 A/ r7 L& S, s! o
, M+ i& d1 G9 s7 B: \$ w% q1.3 HID 设备
# J, U6 L- K! Y9 ~HID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标! o6 Y. s# j+ X/ m* c/ A8 Y
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。
/ d; A+ M* E+ G- b6 F! g* ]# U2 v, g, L1 i, l" W
- _/ {  F3 [; R  w
2 例 蓝牙键盘实做; _( {8 ]& q4 `+ a" ?
HOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指
+ X) P7 I7 p- k! J* B4 H定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能/ D2 f. U; q  s5 b+ J" S
够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中0 H' g1 q% {& T5 i
进行了讨论,这些部份组合在一起以实现整体功能。
7 m7 e: d$ S* i* G
: ], d' d1 w$ S2.1 报告映射讨论$ _- s( \3 `6 z  [: S
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用! d* N+ r1 }! x3 q! T$ I
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称
4 z7 f6 v* n$ H) x9 p为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告
5 d8 j7 J0 F, K+ ^' m描述符用于 HID USB 。3 L0 k2 ~# z# D& A1 \
该工程使用的报告映像可以在
, [& X8 P, |5 sapp_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此6 t8 o% ~3 S; X2 o% L5 z
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用6 f0 C6 x( n4 Z! C# w3 F1 h* }% X
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,: P) T7 P) p0 y% E! m0 S
USB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显* P: y/ y" s  X; B" a! z5 ]: {
示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按: Y5 f0 H0 T: w1 S
键,则可以轻松修改相关字段。2 c5 y! ?. c& \5 i
( ]6 a8 y$ B; [- `- I5 }) T) W
2.2 资源准备2 U- u: y4 A: ?- x$ |# H- c
1) 硬件环境:
9 ~9 p$ K+ t0 q, v% h对应产品型号的AT-START BOARD
( N' P2 L. V& N$ C! ?2) 软件环境+ m: c5 i2 s. Z
wb415_hogp_bt_demo\projects\ble_app_remote+ H$ Z8 S0 D# d5 d4 U+ v
wb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5
" d4 n6 U( [' f* K/ O
5 Q, F. _! l8 n% |1 l$ i" @) l# C2.3 软件设计' A% D. C( l$ \$ N
1) 配置流程. V" V2 l9 Q0 N* J- |( ]
a) MCU端
7 [) J" I0 H9 D# c 配置USER KEY作为击键& M6 o0 g5 K% ]! s2 ^' U( Y
 编写USART3通讯函数# _5 n% u9 {5 x# N4 J) y) a
 轮询USER KEY是否按下
6 B; p6 {9 _; w: V 根据需求去配置USER KEY按下后发出的AT command
! p7 y. M3 G9 i, a( e& ]  Hb) BT端4 k% m/ T/ a3 l" U' k) ]
 将HOGP的Profile加入database1 J2 M: ~: h2 Y5 Q3 [2 J1 |
 编写应用层与GATT之间的界面
' D# D" V9 L( m 在应用层中轮询AT command
2 M0 j. y5 Z7 N& m4 I 透过HOGP将不同的key function发给host端
" y: Z$ q: ?2 s0 M3 g( b; v/ c2) 代码介绍
; o. |7 `) A! ]8 o3 z MCU端
  ?% a2 k- ^- b main函数代码描述7 |5 e2 L- y7 v, J/ z
  • 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();
  • ....( L, t  ?) H: o

, y2 G3 y& r9 h6 Y8 t8 _6 Q9 Q BT端$ v1 |( A  V" y0 B8 @3 A
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可
7 [1 v2 f1 c" b5 a# o 初始化HOGP装置变量  L+ Z4 o, O& x% ~
  • 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);
  • }
    & `. K$ J" A: S

4 d5 B5 W' R/ ^! `$ r* P0 a( P) L 将HOGP加入database7 s7 w& O# t" x  p8 N
  • 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;
  • ....
    * y3 L1 u3 y* d% P  L! n: c& d
( r3 F3 t2 Z3 B1 t' Q
在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。# b2 r- \& O# T, b' V. U% p
 解析AT command并执行对应的程序- d' k1 J) [; m4 U( |' E( w; r2 O* T
  • 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();
  • }
  • ....
    8 w1 j- t: s- p4 N
4 J0 i5 l' X/ |8 r9 k# v, j' o
2.4 实验效果+ {) n# K& C2 t. ?
 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页
% U* B- z% U0 f4 I 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
* F4 k6 a" k4 ~: n 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)
1 F" p$ A% y3 f3 M/ @1 A$ d' [1 Y) \  j6 V: \
2.5 按键定义! r8 C0 L' l) c2 X/ h1 E5 Y
本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:3 c# c+ o3 M9 v3 ~) C" }6 G, B& j
+ t( \' O1 D' C  C, w# R
 多媒体按键值定义2 g- D  a( ?5 S( j: v/ z- s7 T- b
  • 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
  • ....
    " |. k. x* o8 Z( @

; K* d9 [! K% O4 k! I/ G在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
; I, B: e3 `% C# O% @$ c1 s这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出/ T- K/ L8 v: D% w* i
降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个
% |" M& Z3 s- W* q( A+ G" ?; z数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。; O6 S! i6 K; {$ z  B) J
/ I) p; c5 S, H( s
2.6 HOGP 相关 AT command
# S. O# J0 I# e/ U7 X! I1 i本应用指南中,已经建立部分的AT command ,0 D1 l  p1 j  C6 O+ Z7 g7 e
' x" K3 W4 ^2 t$ n6 Z3 ]9 s
用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
  y) h- }# S# P: l7 s. B/ L, uat_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT. U% V+ J, u; d) b% w$ ?
command 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可. ?6 ^/ z9 P. q6 S+ o2 u2 P  b* @8 ?
能会不正常。! z# C7 J4 Y' N- l1 F

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 13:45 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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