星期日, 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 移植》等文档介绍

查看 5631
麻喆

专栏编辑