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

AT32 HOGP开发指南

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Terran 于 2022-10-20 10:02 编辑 % C' l' T% ^( o0 f; O
* {  S/ z* U" u1 J/ f: W3 f
AT32 HOGP开发指南
7 R  _& ]* ]: h' ?7 H4 _* H* }& U& Z& {
前言  U6 Y& E( t2 `7 x
人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。0 J; `5 U/ [" n% U/ S3 q7 [! v: H
支持型号 列表:( j$ ]: N4 Y7 @- j. s: V1 k
AT32WB415
* d% Y# c+ e$ S' l+ M
& F4 h" V  ?6 S" F0 u1 HOGP概述% F' \% @2 u: D: c( ]; ]1 ?+ B
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。
% O4 h. N* f/ Y
8 y1 E! X" N* `% w! e' V1.1 HID 角色
  g$ ^% w+ D  B8 P在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备
5 Q- O2 s4 w, Q6 }一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备  \& z1 ]: i# o( h4 z
如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
+ I7 `' S* K" h; \. E- a2 b& o" k; s4 `# i# C1 D& p1 o' F1 j
1.2 HID 主机5 P+ t8 y( C8 s! P& o" b
HID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处
5 X# W' Y" [6 {" |" |- z理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行
4 @) i" F6 k8 f7 n9 n2 |有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
2 y: L  t: f& N% Z容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
. q+ f) T* Q% a6 @, o行为、第 5 章连线建立。
* D' u" v  e- @1 |2 v! X2 A9 @. V; x# E$ c
1.3 HID 设备
& U$ t0 S- H. V7 z; t/ G: nHID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标
$ R6 u+ h8 N( v* j: M* T* G0 K$ I或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。
. f- p0 e; s/ [! x$ d6 p" g7 L9 z% i
. f. T; s/ C) `  @1 |
5 {& a0 S  P+ l. D2 例 蓝牙键盘实做
$ h% l: X/ g- [# T0 G+ yHOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指0 l3 _3 z, S- t0 l
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能
- T: c6 _1 s, v7 M够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中
7 T( I# N: q0 F4 c6 g5 I进行了讨论,这些部份组合在一起以实现整体功能。
' h  [! f& Z. C5 G
9 Z3 G* s7 ?! E5 y2.1 报告映射讨论( K( n6 i$ T: Y+ b6 e
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用/ C/ G; }3 Z( m
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称1 P, t' m' J# z
为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告
2 H, R% Z- d# L5 I* k( O* f描述符用于 HID USB 。
3 z: v, `: _$ }% N) z该工程使用的报告映像可以在+ H# z6 K/ K! E
app_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此' d& X& V+ b; M" f' u. Z, e2 F
工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用) e; \, ~$ Q8 Z0 V8 g2 _, ~
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
! l5 Y) A5 f8 c+ i: _* kUSB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
/ g2 w" w/ `% `0 X% X) i示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
) a. M8 h& s9 P键,则可以轻松修改相关字段。
! k+ x! \- L# y: G$ w9 a/ |( b% r9 Y, L- \8 @" j& _: D: n* k; X
2.2 资源准备' [: P) o5 u) A2 @$ r8 s$ J
1) 硬件环境:6 M7 \" q9 C" h+ i- p; _2 G& c7 ~
对应产品型号的AT-START BOARD
" v6 X  M% p" z# Q4 Y+ E2) 软件环境: @! [; N( g8 h- m
wb415_hogp_bt_demo\projects\ble_app_remote9 ^7 D* d3 ^$ R* V
wb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5
  y' G; F: n  i* N* n. X* V& Q& [5 a& t
2.3 软件设计3 t! G4 l5 N- ~. N+ y/ f% N
1) 配置流程- {$ u8 S( ?9 Q
a) MCU端/ `+ ~, `* u1 a% l, p, j4 |: O0 [2 m
 配置USER KEY作为击键
$ `* y: X. L1 o7 S6 p; | 编写USART3通讯函数
7 Y& D& M+ i7 ]5 q 轮询USER KEY是否按下$ ]( h  F2 C3 {3 Y4 R. S2 t6 |: K
 根据需求去配置USER KEY按下后发出的AT command
" P! n/ ?5 {/ c. k4 D& m6 Pb) BT端
# `9 }1 g, y: L/ x8 c 将HOGP的Profile加入database
* t4 P# J: s9 R5 U4 l 编写应用层与GATT之间的界面3 J" t! E2 E, l. h' C1 H& _
 在应用层中轮询AT command
; T4 d+ A+ n! v# Y' m 透过HOGP将不同的key function发给host端: r& B: w2 z& f) W& R2 h
2) 代码介绍' W9 {! Q6 }/ I8 W0 t" K9 t
 MCU端
" K- n  e7 M4 C& s. U main函数代码描述
% }  j2 G) P. `# W9 {
  • 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();
  • ....$ a  M  W3 X+ i. \; z
+ H5 ^, O6 h* Q5 z
 BT端
0 }9 [# t$ f+ n3 R( @# _原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可( p2 @$ s0 D3 X) c
 初始化HOGP装置变量
9 W! d" e# y" M
  • 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);
  • }
    6 V0 _+ V' i0 P. s& J5 q  c0 ~
+ [/ S; r9 y) `
 将HOGP加入database2 V8 T3 v/ P/ 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;
  • ....
    % `5 t6 ?  \7 s/ A- k2 w* t4 g
+ m% J. W( i( [' T9 H2 G! Q$ I3 f8 u
在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。+ O" a2 L6 R$ \8 l
 解析AT command并执行对应的程序2 w2 @, |3 ^# U8 k) ?* s2 v0 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();
  • }
  • ....
    4 R2 m  ^$ T: M' @

& _2 t- p! c% c# {5 X2.4 实验效果
) _" k! p5 o7 X/ M 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页
/ Y( p. b8 R6 N* Y8 q 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)* \# ~8 c' o: R$ i8 J+ q( N
 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)
$ N. q) {1 P( s" s% ^) _
% L: D2 Q% e6 j, O2.5 按键定义5 G0 E4 G- d8 T
本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:: h! F/ h" n0 @8 U6 j
( `  D3 u7 c0 f; ]" H& B  ^- n( c
 多媒体按键值定义
& V3 j0 t# Y9 U& X+ w+ n) R
  • 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
  • ....+ f/ @0 u/ P. V8 ~& H7 s- [$ z
. p- X* M9 o" |$ P
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report  G* F! F1 J# E* K6 c, R
这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
; z/ m6 A4 c( Y$ |  x: [降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个$ `% T1 _; n3 C2 @# X
数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。8 F% e% m7 O/ H# {" Y& x& A5 F

; E# d4 C3 p& G) Q0 J2.6 HOGP 相关 AT command
4 x7 t$ n2 O6 k6 q本应用指南中,已经建立部分的AT command ,
' n9 T( A4 x4 h; T/ P5 x
5 b2 p0 ~3 ~& e8 t, i9 ?7 t用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
7 U; r( z8 ^1 s4 {+ {5 Nat_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT
9 N! D6 _, Y7 M( J% G* \5 j% ?8 {8 \0 gcommand 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可
) E9 P: c6 Y1 }$ f, j! N5 D  l能会不正常。' p- Q. N6 I7 {

AN0145_AT32WB415_HOGP_Development_Guide.zip

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

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-11 09:45 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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