星期日, 20 12月 2020 13:30

基于 NXP QN9080 蓝牙键盘开发

蓝牙键盘是 HID ( Human Interface Device ) 设备的一种,即人机交互设备,开发需遵循 HOGP (HID Over GATT Profile) 规范,HOGP 规范改编于 USB HID Protocol,本文将基于 NXP QN9080 IC 介绍如何使用 HOGP 规范开发蓝牙键盘。

一、        概述
蓝牙键盘是 HID ( Human Interface Device ) 设备的一种,即人机交互设备,开发需遵循 HOGP (HID Over GATT Profile) 规范,HOGP 规范改编于 USB HID Protocol,本文将基于 NXP QN9080 IC 介绍如何使用 HOGP 规范开发蓝牙键盘

二、        环境搭建

2.2 硬件
本文基于 QN9080 DK 板进行开发,DK 板如图 2.2 所示

图 2.2

2.3 开发软件

SDK 支持 IAR、Keil、MCUXpreeso IDE 三种开发软件、本文以 IAR 为开发环境作为介绍

三、        工程移植

在 SDK_2.2.0_QN908XCDK\boards\qn908xcdk\wireless_examples\bluetooth\hid_device 目录下的工程已经实现蓝牙鼠标的功能,我们可参考此工程实现蓝牙键盘

       蓝牙应用由多个 Profile 组成,Profile 由 Service 和 Characteristic 组成,所以我们需要修改 Service 及 Characteristic 来完成键盘的开发

在工程 gatt_db.h 文件可以看到已经创建好了GATT、GAP、Battery、Device Information、HID Service 的 Service 和 Characteristic,其中 GATT 及 Battery 与 Mouse 工程相同,无须修改,其它修改步骤如下:

3.1 GAP 修改

GAP,Generic Access Profile,即通用访问配置文件,在 GAP Service 中定义了设备的类型及命名,我们需要将设备 Mouse 修改为 Keyboard,如图 3.1 所示

图 3.1

3.2 Device Information 修改

Device Information 中描述了 HID 设备的一些信息,我们只需将 Mouse 的信息修改为 Keyboard,其它内容介绍可通过蓝牙 HOGP 规范了解,修改如图 3.2 所示

图 3.2

3.3 HID Service 修改

HID Service 是定义了人机接口的服务,UUID 是 0x1812,其应用包括鼠标、键盘、手柄等,我们需要将鼠标修改为键盘,可通过修改 Report Map Characteristic、Report Characteristic、Boot Report Characteristic 来实现

3.3.1 Report Map 修改

标准的鼠标数据包括 X,Y 坐标、左右键值及滚轮键值,而键盘数据为 0-9,A-Z 及一些功能键,控制键,我们需要将鼠标 Report Map 修改成键盘的 Report Map,参考 HID 协议,键盘 Report Map 如图 3.3.1.1 所示

图 3.3.1.1

Report Map 共定义了三个 Input 共 8 Byte,二个 Output 共 8 Byte

  • Report Map 定义 8 Byte 的 Input Report,具体数据格式如下

Byte 0:特殊键

Byte 1:保留常量

Byte 2-7:普通按键

  • Report Map定义 8 Bit 的 Output Report,具体数据格式如下

Bit 0:Num Lock

Bit 1:Cap Lock

Bit 2:Scroll Lock

Bit 3-7:Constant

在 gatt_db.h 文件中将 Mouse Report Map 修改为 Keyboard Report Map,如图 3.3.1.2 所示

图 3.3.1.2

3.3.2 Report Characteristic 修改

在 gatt_db.h 文件中将 Mouse 数据量改为 Keyboard 数据量,由 Keyboard Report Map 可知 Input Report 为 8 Byte,将数据量改为 8,如图 3.3.2 所示


图 3.3.2

3.3.3 Boot Report Characteristic 修改

在 gatt_db.h 文件中将 Mouse 数据量改为 Keyboard 数据量,由 Keyboard Report Map 可知 Input Report 为 8 Byte,将 Boot Report Characteristic UUID 修改为 Keyboard UUID 0x2A22,由 HOGP 规范可知键盘 Boot Report Characteristic UUID 为 0x2A22,修改如图 3.3.3 所示

图 3.3.3

3.4 修改发送格式

在蓝牙鼠标例程中,通过 400ms Timer 定时发送鼠标数据,我们需要在 hid_device.c 中将鼠标数据改为键盘数据,由 Report Map 可知,Input Report 为 8 Byte ,格式修改后如图 3.4.1 所示:

图 3.4.1

实验测试使用 400ms Timer 一直发送字母 a,a 按下的 Keycode 为 0x04,松开 keycode 为0x00,在 hid_device.c 修改发送函数,具体修改如图 3.4.2 所示

图 3.4.2

3.5 测试结果

上电按 SW1 进行广播,与电脑连接后输入密钥 999999,连接成功后就可看到在电脑上一直输入 a 字母,如图 3.5 所示


  

图 3.5

四、        总结

本文实现了一个简单的键盘,实际键盘产品开发还有很多功能需要完成,如低功耗、OTA 升级、以及安卓,MAC ,Windows 各版本系统兼容性问题,更多资料可关注大联大世平编写的《基于 NXP QN9080 低功耗移植》、《基于 NXP QN9080 蓝牙 OTA 移植》等文档介绍

查看 11763
麻喆

专栏编辑

 
Please support our site by viewing this advertisement.

Please support our site by viewing this advertisement

Free Content