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

AT32 HOGP开发指南

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Terran 于 2022-10-20 10:02 编辑 7 {% f, b+ N) R8 }: ?3 G

! b- C& a! M, GAT32 HOGP开发指南2 A0 h: m' ~5 N. H

0 u! K" M' G' t. s6 r8 _# ^% K前言
, v: K5 u0 i( c0 e人机接口设备(Human InteRFace Devices, HID)的主要目的是基于USB实现者论坛所维护的规格书,提供用户与计算器之间的接口。HID涵盖了显示器、键盘、网络摄影机和鼠标甚至到VR耳机、游戏手把和触控屏幕的各种装置。HID传统上通过USB接口连接到计算器,然而,HID设备也可以通过使用无线技术与计算器连接。通过使用HID规范,可以开发出符合通用标准的计算器外设,从而与大多数装置兼容。
# K' `, `  ~$ c4 z& u( m/ E支持型号 列表:
* Y$ f) H& E* r+ QAT32WB415: j1 l) x1 N. x6 |% q

# A- o1 g2 t& @9 Q' v3 Y1 HOGP概述
3 r& I) |4 ?9 L9 B, zHOGP(HID over GATT)是由Bluetooth SIG维护的蓝牙配置文件规范,通过低功耗蓝牙实现HID的配置文件并作为与计算器之间的接口,消除HID中对电线或物理连接的需求。( B2 i$ l7 }, e: N! I# n; k

0 o( F. ?: S$ c; I& W. z1 l1.1 HID 角色$ Y% p. C4 |6 [, t# p9 {' j) \
在HID 中,以及在 HOGP 的延伸中,定义了两个角色,这些角色是 HID 主机和 HID 设备。 HID 设备
- d: ~4 R- \/ F一次只能主动连接到单个 HID 主机;然而一个 HID 主机可以连接到多个 HID 设备。有关主机和设备
; G5 \3 |1 f2 u& y! O  A# l" x如何交互的细节,请参阅 HOGP 规范 中的第 3 章 HID 设备需求和第 4 章 HID 主机需求和行为。
1 Y3 `- [0 I" |9 C7 O/ a
3 D3 \6 I; e& ~1.2 HID 主机
) T  b  `4 p* u; w/ |+ X. eHID主机实现蓝牙 GAP 中的中心 ( 角色,接收输入讯息并使用提供的数据进行更进一步的处
' S  L8 j5 z% y- s+ l9 n! G* Q理。例如,计算器会是 HID 主机,因为这是接收 HID 数据的设备。 HID 主机对 HID 功能的正确执行6 a5 l, \, `6 B
有许多责任与需求,但在此开发指南中所提供的范例仅实现了 HID 设备,因此本文檔不涉及这些内
0 z/ f5 K) h5 ]! Y容。想要了解 HID 主机的职责和需求,请参阅 HOGP 规范中的第 2 章配置、第 4 章 HID 主机需求和
: ^4 `' l6 t2 S# c' A; X: L行为、第 5 章连线建立。9 \% H9 U6 I/ a$ f" x
. R3 F0 w1 C" c' j& a$ P
1.3 HID 设备
2 c! e" l* v3 H6 Z7 w3 EHID设备实现蓝牙 GAP 中的外设 ( 角色,负责将输入信息传输到中央计算器。例如,鼠标1 z! ^# e# z3 ?; s# _9 Y( h, }
或键盘会是 HID 设备,因为它们将输入数据发送到计算器设备。1 o& @3 ]" d5 c. ~% G2 ~
* ?# c! Q; x% B

: ]% u: S  j$ `6 Q& L/ q& y2 例 蓝牙键盘实做$ Y/ }4 d0 L% I3 X( ?
HOGP工程是一个在 AT32WB415 上实现 HOGP 规范的低功耗蓝牙工程,该工程使用 HOGP 规范 指, U% X  _  F8 F8 |2 i& n# o
定的 蓝牙 外设角色,演示了 HOGP 的键盘。通过使用通知 ( 和 GATT 配置文件,该项目能
4 A: P) c$ w, U够通过低功耗蓝牙 HID 装置并与 HID 主机正确连接。 HOGP 工程中有几个复杂的部份,在本文档中
! S: v4 ?6 ^! H6 f6 e进行了讨论,这些部份组合在一起以实现整体功能。8 _6 u/ Z! P/ n0 g3 G) T) C; X
) }0 E5 [- B/ N
2.1 报告映射讨论0 D6 t4 b1 `* [  b* H7 X
HOGP工程依赖于报告映像,报告映射是 HOGP 用于实现低功耗蓝牙 HID 功能的结构。报告映像用
% ]. m* [4 }5 |6 P6 R8 f& |' c于告诉主机许要从 HID 设备获得什么功能和什么样的数据,在原始的 HID USB 规范中,报告映射称# T; B/ l5 |% b$ o& t2 V
为报告描述符,报告映射和报告描述符是相同的,它们之间唯一的区别是报告映射用于 HOGP, 报告/ A+ x: k$ L3 f: k6 V' [
描述符用于 HID USB 。
% L  d: |) A. q% ]1 X- [该工程使用的报告映像可以在) T0 Y( o5 i7 b- T% U8 {+ O0 e
app_hid.c 文件中找到,并且包含在 gHIDReportDescriptor 变量中,此
1 K' V4 E) }$ E工程中的报告映像包含键盘的输入信息。该结构分为多个部份,应用程序以及 HID 主机能够通过使用0 T  e% @& j4 n5 Q7 P1 W
报告 ID 字段找到所需的部份。可以轻松修改报告映像以包含不同的输入或修改已经存在的输入,
. f  q# @% |: z, X5 `USB 实现者论坛的设备工作组有一个报告描述符建构器工具,可以用于轻松创建报告映射。 图 3 显
4 \, m' s2 O" X  ^9 C示了报告映像结构的片段,所有字段都有标签,可以轻松修改。例如,如果需要不同数量的键盘按
5 R# F4 g" F* C) o键,则可以轻松修改相关字段。# r- d5 r  p& _0 r0 y: ~+ x5 @: T6 j
6 e( f( @0 `1 n- v: ~' x
2.2 资源准备
% R9 C- o% T9 u  B1) 硬件环境:
! j  a* I4 u$ ~3 U  K3 E1 V: c对应产品型号的AT-START BOARD9 a0 U* |, @- `! R
2) 软件环境. H: ~: j9 m! Z, X8 P
wb415_hogp_bt_demo\projects\ble_app_remote9 J. W* {' }. `( |) X
wb415_hogp_mcu_demo\utilities\wb415_hogp_mcu_demo\mdk_v55 H* g+ E* J% ]

& q# {9 X- P7 y! _0 C2.3 软件设计
% @5 A' K, O5 |3 D1) 配置流程  y3 K5 o! X4 P) e
a) MCU端$ W3 j5 d8 w1 e
 配置USER KEY作为击键
8 i. ]4 P2 S* A8 x5 b 编写USART3通讯函数8 B- K- M) f+ x/ S/ }
 轮询USER KEY是否按下
4 W4 K2 M8 f' ^2 Z 根据需求去配置USER KEY按下后发出的AT command
1 N- n: ?' Y: N# d# }0 hb) BT端
8 b8 _1 H' X4 x" b/ K 将HOGP的Profile加入database. T" S! E0 X0 c6 d. E; ?" w2 C
 编写应用层与GATT之间的界面
" W. e; p' F' @. A- ` 在应用层中轮询AT command
7 M) A7 h% d  R 透过HOGP将不同的key function发给host端. }! J8 w, x4 i6 x
2) 代码介绍! ]2 O% M& {1 U, r$ l$ T
 MCU端9 s  f7 G* P8 ^
 main函数代码描述% l3 O3 Y7 ?" S: m( H: c, d* l
  • 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();
  • ..... o5 @# D; n4 ~4 F/ q) {# {( F9 j

( q: ?( t- Q6 H7 _ BT端+ X7 j' e6 e! m. J) z
原则上不需要去修改Profile层的内容,由APP层去设定HID装置的内容即可
0 T6 A7 T2 b( _) x% q0 b( i. z# h 初始化HOGP装置变量
  X+ {9 r. A4 T
  • 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);
  • }
    8 Z4 q- }- Z& D& r7 I3 Y

9 F4 x! R) j: M+ M, \ 将HOGP加入database
) V+ d4 W# v& c6 ]6 B5 j) q
  • 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;
  • ....6 ]3 G( W  ^( H9 b  `9 u& X5 V

3 ^6 g  t0 k% T% @9 f6 b1 D! W在main函数之中的while loop不断轮询app_user_entry()来确认有无收到AT command,如果收到有收到AT command则执行该命令的内容。
9 ?! f* _" i! b* X5 H2 \$ ]$ C# m 解析AT command并执行对应的程序% U9 ]( t# g$ [, `# ?2 p
  • 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();
  • }
  • ....5 y5 h1 I. j7 T- t- {' R! k

& O' T' C3 @) y& k: D2.4 实验效果
, |! O" a- c/ c8 ?" e' b& J3 ?& L' J$ Y! l 按下AT-START板上的USER KEY发送www back按键,则浏览器页面返回上一页: ?2 }: l* a5 @, e4 P" `( J* \" m
 按下AT-START板上的USER KEY发送volume up按键,则音量提高(需要修改AT command)
9 @- M& P7 b8 N; g2 P" {( J1 |' A- b 按下AT-START板上的USER KEY发送volume down按键,则音量降低(需要修改AT command)
9 `/ T& V: B  r0 y0 S% G0 w
6 n5 F: c0 w2 U! @/ c2.5 按键定义! f1 L8 ?% Y0 D( V6 g
本应用指南以多媒体按键为例,在代码中定义了多媒体按键值的数组,用户可以在app_key.c 中找到以下代码:
  K; P; B4 Z" t. F  Y. b/ N) t6 O/ e. Y1 s, \5 h) M
 多媒体按键值定义; Q$ O) b* o( L+ t
  • 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
  • ....
    7 w% s5 f+ _9 E' x
) q5 N) u/ S  J
在app.c 中的 app_user_entry 函数,每当添加一个新的按键实例,必须透过 app_hid_send_report
8 B- ~8 [  m# Q这个函数,将按键值及长度发送给主机端,主机才能根据按键值做出对应的行为; 举例来说,要发出
" g, c0 w  W6 W. X降低音量的按键功能,从上面的注释可以看到 volume down 对应到第九列,是整个数组的第 18 个
; a/ ~: k) y$ m5 Q7 J/ ^数,因此调用发送函数时写成 app_hid_send_report(&key_copy[18], 2) 2),其他按键也是如此使用。
/ C7 r) y$ M$ Q" f; r5 T% K* X8 ?. F3 a# D
2.6 HOGP 相关 AT command
" b1 F$ [& ], `8 _+ t1 A本应用指南中,已经建立部分的AT command ,
. r- e" `3 I- H' I# l" g% ~, j, q- l) h1 B' x* [/ O' Q8 F
用户自行添加 AT command 时,需要在 MCU 端及 BT 端同时增加对应的实例; MCU 端要在
4 P, R% ^3 E0 N# g6 R  fat_cmd.h 中新增 AT command 的请求及期待的响应; BT 端要在 app.h 中新增要解析的 AT! I" l) V6 h, h0 [6 {4 f$ i! @/ N
command 字符串、 command 的枚举以及回复的枚举,数量上如果对不上的话则发出的按键功能可' Y* g. J* J+ L; R
能会不正常。
9 G5 K5 a" M5 z  P" L& [! D6 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-13 22:32 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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