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

AT32 HOGP开发指南

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Terran 于 2022-10-20 10:02 编辑
, ^/ L9 W" G# h1 F9 x  [: C/ M! R# G# R
AT32 HOGP开发指南
/ C3 O* a0 _4 w/ X% R" y3 d8 j. D: {( n0 D8 B# {+ ]1 B" F9 T
前言
7 a2 @7 i  W- ?( A. `人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。# y: G# Q" o0 f
支持型号 列表:, d% w9 s* q! h+ f0 t" V
AT32WB415" {0 |% k. ~$ l* q% Z$ {# S
7 a4 l& m5 U- @$ d! Y, X$ z- ^- w
1 HOGP概述* N2 t9 `& x5 e) J& S0 F, z
HOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。7 K3 v9 |( O; A9 M

2 p" R+ U- A( I% d2 D7 K1.1 HID 角色; i' h8 t6 T  g8 U. G
在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备
- o% S. F- Y. ^8 k一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备
9 _/ J3 |! h' t0 I, a如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
  E0 @& q* S; ^0 g* V3 }1 d8 D$ ~( v7 e9 Z6 ~
1.2 HID 主机$ x4 Q" M# d9 J" I: t! y% j
HID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处1 o0 ]" d; t* ~- L1 a- W* f
理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行8 }7 p4 Q" W: N8 M8 o& C% y2 j
有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内. T- S: K  C- d& J5 I
容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
' a0 M+ `5 j0 R5 y行为、第 5 章连线建立。
& v6 r; d" O( G1 f' U, E& G% a; Y9 d% S- `/ `" ~7 Z
1.3 HID 设备  c4 r* F3 U; q! O% q
HID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标5 j& N0 I, t1 d1 N. p; d
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。
! @9 J* ^7 I0 a; h8 I1 K6 j% C" X' @' a- i3 E" H" ?8 {' Y
$ r. y1 q5 t) L' b
2 例 蓝牙键盘实做' U" Z; _% l6 G9 h4 f+ z# Q
HOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指3 p) t, r; ]6 t9 x3 U% l
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能& P3 [6 |* h. ^9 ]7 O( h* t
够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中8 q+ t2 v+ w! k) o$ _9 H( g# c
进行了讨论,这些部份组合在一起以实现整体功能。
, _; w/ r. ]7 t3 B6 X# D6 A) j% b* [! T$ I/ N
2.1 报告映射讨论7 q, Q# J& j1 y- \( x
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用3 s9 S6 ^5 h) F1 Z+ Z, F, ^
于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称
  u) i) A! {/ }* N6 c7 a% ^为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告
7 E7 p7 D4 y5 K0 B/ t( S描述符用于 HID USB 。! w  R/ i6 X5 z  @! g# W$ a
该工程使用的报告映像可以在4 X4 s5 Q. i; O0 l  p( C
app_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此
* ~8 Z; I3 a5 s' {7 L( G工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用5 U- P: a0 {* _2 l
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,5 ~5 R, ]$ E: U
USB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显: P9 o; ]* s1 ^
示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按7 R5 ?. s. j0 ^" t8 d1 p, R
键,则可以轻松修改相关字段。* G4 k- s; ]& S# x8 }# {; C  L! X# k
3 H& W6 F  M. Y
2.2 资源准备
9 {: j  ]1 I+ A5 U0 V1) 硬件环境:5 s; g$ m7 @, |
对应产品型号的AT-START BOARD
! \% z/ S: b( l* e5 S" D2) 软件环境
8 L" ~, M, F- ~. \wb415_hogp_bt_demo\projects\ble_app_remote$ x' M9 s5 u! T
wb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v5
7 K; v3 q' |8 o* Z! q  W% H3 u" ], c6 h$ y4 D# A
2.3 软件设计
# o: ~( V4 X; y9 |# U1) 配置流程+ x, G) @. O6 z! c$ P. y& ?" z
a) MCU端
5 e/ N, B+ E/ d& f1 Y: k1 g, a 配置USER KEY作为击键
0 `( v6 N; Y4 K5 r+ h 编写USART3通讯函数. {1 ]7 H6 e" D, h* W, u) R
 轮询USER KEY是否按下# d8 e! b( ^8 z) ~! x8 n
 根据需求去配置USER KEY按下后发出的AT command
: `* n* r4 e/ hb) BT端
! r7 S: B; o' S% @  Q: b7 V 将HOGP的Profile加入database
) ]6 r( c) D* J% T( m 编写应用层与GATT之间的界面0 R* p  s: n5 p3 [3 D
 在应用层中轮询AT command
( U$ s/ K: |; @* d8 Q4 p* T7 u  H 透过HOGP将不同的key function发给host端9 |# _( m& C( T- R, \
2) 代码介绍
- A8 I7 @- k) t( i  M8 ]* G MCU端
% B/ w! i/ f: S% Q, A main函数代码描述, w: S4 n, w) i5 J% h. ]+ u1 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();
  • ...., T1 }( [& @: D- Q# h

9 [7 ~2 k. X% p+ o0 T' ? BT端8 a- ^% s) l6 M5 A
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可
; b+ Z4 `! O' X6 t7 J 初始化HOGP装置变量
* |6 I6 `% a/ z3 A6 d/ ?7 r  W
  • 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);
  • }* Z+ ?' t/ l% D( b- r

# q: _+ E# N5 }  R1 T8 Q9 x 将HOGP加入database- g0 ~; C* K, T. F4 P7 l& f% y
  • 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;
  • ....
    8 q& i" i# p' B5 @7 f" A1 A

# c3 N0 K! k" ~. X) S在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。8 k& w, ]2 P6 A. O
 解析AT command并执行对应的程序0 R  i) o6 A2 S) i* N( l( F
  • 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();
  • }
  • ....0 @( d1 @; a. `6 v0 }. |
# k9 W$ {0 C) M
2.4 实验效果
$ q# C9 R# t# I1 Z* e2 @' X/ }6 D$ \ 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页
1 D/ z2 a( R% _% W' ^0 \ 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
# M% p! G/ A( [ 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)$ `9 Y) }+ H9 g: P0 D5 O" y
" U' @- J$ i6 p: F
2.5 按键定义
" K9 |9 H+ v: G5 Y% A本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:0 x5 @; C' b* g5 D1 L
! g2 F; q7 I& [9 l0 P7 h5 y+ |
 多媒体按键值定义
4 B+ g# a- i- A. 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
  • ....' \/ W: i3 n& p; h, b' Q/ G& q
, }% K6 k' z8 c4 ]. D
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report0 G* t+ s1 J) j2 Q3 ~
这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
; v5 t4 t& G5 D( k! w降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个0 a  t6 O5 j( l- X
数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。( }; A0 K- |1 X
1 ]/ J8 ~8 D9 ~9 f, D
2.6 HOGP 相关 AT command0 P. \$ C" |/ k' k6 ~, J% {: V( p
本应用指南中,已经建立部分的AT command ,: F! m4 K4 e7 V8 `" ~1 u

3 K: S0 A. K8 @" r0 E% h用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在: L$ j  d: Z+ O* h; ^) {. @6 W
at_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT* F" I3 [% X/ A3 O8 e+ Z
command 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可0 V0 H" Y0 P6 L" n7 m2 V, F
能会不正常。
! b. B. M: e" B5 J$ B+ N

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

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

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

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