基于 NXP QN9080 三模鼠标开发 —— BLE 模式

一、概述

      继上一篇 USB 模式的鼠标功能实现,我们接下来将会教大家如何基于 QN9080 的 SDK 去实现三模鼠标的第二个模式 —— BLE 模式。

二、环境搭建

2.1 SDK 下载

      本文基于 NXP QN9080 IC,SDK 可在NXP 官网 https://mcuxpresso.nxp.com 下载。

2.2 硬件

      本文基于 QN9080 DK 板进行开发,DK 板如图 2.2 所示。
https://edit.wpgdadawant.com/uploads/news_file/blog/2021/3277/tinymce/1.jpg

                                                                                                                                           图 2.2

2.3 开发软件

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

三、工程移植

      在 SDK_2.2.0_QN908XCDK\boards\qn908xcdk\wireless_examples\bluetooth\hid_device 目录下的工程已经实现蓝牙鼠标的功能,我们可参考此工程进行相对应的修改,使其能成为我们所需要的一个鼠标。

由于例程中已经有简单的 BLE 鼠标功能,所以本文将会着重于如何进行 BLE 的广播和回连功能的修改,以及数据格式和传输部分。

3.1  BLE 广播开启

        在原始的 SDK 中,如果直接进行编译烧录是可以进行蓝牙广播,但是当 PC 设备去搜索并且尝试连接的时候会发现 PC 设备显示连接被拒绝,导致连接失败,这时候需要将 app_preinclude.h 里面的 gAppUsePairing_d 改成 “1”,使得鼠标设备可以被连接。具体修改如图 3.1 - 1。

                                          https://edit.wpgdadawant.com/uploads/news_file/blog/2021/3277/tinymce/1.jpg

                                                                                                                                           图 3.1 - 1

 

        经过修改后,我们使用手机进行测试,测试结果如图 3.1 – 2


                                          https://edit.wpgdadawant.com/uploads/news_file/blog/2021/3277/tinymce/1.jpg
                                          


                                                                                                                                           图 3.1 - 2

 

3.2  BLE 回连功能开启

3.2.1 蓝牙非定向性回连修改

      蓝牙模式下如果想在鼠标设备每次重新上电之后都能直接连接到最后连接的 PC 设备上,就需要使用回连功能,回连功能有分两种情况,一种是非定向回连,另一种是定向回连。非定向回连可以实现回连功能,主要的特性为:回连速度较慢但是可以向全部设备发射回连信号。这种回连功能的修改只需要将 app_preinclude.h 里面的 gAppUseBonding_d 以及 gAppUseNvm_d 两个宏都改成 “1” 就可以实现了,具体修改如图 3.2.1 - 1 以及图 3.2.1 - 2。


                                          

                                                                                                                                           图 3.2.1 - 1

                                          

                                                                                                                                           图 3.2.1 – 2

 

      非定向回连的测试结果如图 3.2.1 – 3,在手机与 Mouse 断开连接后,将 Mouse 的广播打开,就可以等待 Mouse 与手机成功连接。并且其他手机是可以搜索得到该 Mouse 的广播信号。


                                                                                                                


                                                                                                                                           图 3.2.1 – 3

 

3.2.2 蓝牙定向性回连修改

      定向性回连主要的特性为:回连速度快但是只能针对一台设备发射回连信号。

      由于鼠标设备连接成功后会将 PC 设备的地址保存在 NVDS 中,所以在广播时可以将需要定向的设备地址从 NVDS 中读取并赋值给广播参数 peerAddress,并将非定向广播参数设置为定向广播参数,就可以采用定向广播的方式进行定向性回连了,当然这一切都需要在可以实现非定向回连实现了的基础上才能完成。

      具体操作如图 3.2.2 - 1,图 3.2.2 - 2,图 3.2.2 - 3。

                                          

                                                                                                                                           图 3.2.2 - 1

 

      图 3.2.2 - 1 中的 ① 表示的是广播的方向性,SDK 中的默认设置为非定向性的,所以需要将这个值修改为图 3.2.2 - 2 中的值 gAdvDirectedHighDutyCycle_c。

      图中的 ② 表示的是已经配对连接成功的 PC 设备的地址,② 显示的是默认为全是 “0” 地址值,这个地址会存储于 NVDS 中。


                                          

                                                                                                                                           图 3.2.2 - 2


                                          

                                                                                                                                          图 3.2.2 - 3

 

      如图 3.2.2 - 3 所示,在 fastWhiteListAdvState_c 这个 case 中会重新赋值广播类型的值以及广播地址的值,我们可以在这个地方将图 3.2.2 - 1 的 ① 赋值为图 3.2.2 - 2 所示的 gAdvDirectedHighDutyCycle_c 以及从 NVDS 中获取已经绑定的地址并赋值给图 3.2.2 - 1 的 ②,这样就可以实现只针对你最后连接的 PC 设备进行定向性广播回连,并且定向性回连的速度会比非定向性回连快。

      定向回连的手机测试结果如图 3.2.2 – 4,在手机与 Mouse 断开连接后,将 Mouse 的广播打开,等待 Mouse 与手机成功连接。并且其他手机是搜索不到该 Mouse 的广播信号。

                                          

                                                                                                                                           图 3.2.2 – 4

3.3  删除 BLE 连接密码

      在 SDK 中进行蓝牙连接时 PC 设备显示需要进行密码输入,此时需要输入 999999 才能进行连接,具体的密码更改如图 3.3 - 1,你可以将密码修改为任意的 6 位数。




                                          

                                                                                                                                           图 3.3 - 1

      当然,对于一个鼠标,很多用户都不想在蓝牙连接的时候进行密码输入,那么如何将输入密码这部分删除了呢,我们可以根据以下的步骤进行操作,就可以删除密码的输入了。


                                          

                                                                                                                                           图 3.3 - 2

 

      图 3.3 - 2 中的 ① 是安全级别,我们需要改成 gSecurityMode_1_Level_1_c(No Security 模式),具体每一个级别代表什么含义,可以参照图 3.3 - 3。

 
                                          

                                                                                                                                           图 3.3 - 3                        

 

      图 3.3 - 2 中的 ② 是 SMP 定义的 I/O 的功能,我们需要改成 gIoNone_c,具体每一个功能代表什么含义,可以参照图 3.3 - 4。


                                          

                                                                                                                                           图 3.3 - 4

 

      另外还需要将相对应的一些代码进行修改,具体操作如图 3.3 - 5

 
                                          

                                                                                                                                            图 3.3 – 5

 

      删除密码之后的测试结果如图 3.3 – 6,在搜索到 Mouse 的广播信号后,直接点击就可以直接进行连接,不再需要输入密码。

                                          

                                                                                                                                           图 3.3 – 6

 

3.4  BLE 数据发送说明

3.4.1 HID Service 修改

      HID Service 是定义了人机接口的服务,可以通过修改 Report Map Characteristic、 Report Characteristic、 Boot Report Characteristic 来实现你需要的 HID 设备的功能,由于 SDK 例程本身为鼠标,因此我们对于 HID Service 的修改并不多,接下来我们一步一步去进行修改。

 1. 修改 Report Map

      由于 BLE 模式与 USB 模式使用的同样都是 HID 协议,因此在这部分与 USB 的描述符部分是一致的,因此在此就不再详细说明(若是有不懂的读者们可以查找上一篇文章《基于 NXP QN9080 三模鼠标开发 —— USB 模式》进行解读)。修改 BLE 的 Report Map 只需要在 gatt_db.h 中找到 Report Map 的设定,并进行修改就行了,具体修改如图 3.4.1 - 1。

 

                                           

                                                                                                                                           图 3.4.1 - 1

 

      图中的 ① 代表的是总数量,② 与 USB 中的描述符是一致的。

 2. 修改 Report Characteristic

      在 gatt_db.h 文件中将 Mouse 数据量根据 Report Map 中的 Input Report 进行相应的修改,本例中的 Mouse 需要进行 7 Byte 的数据发送,因此修改如图 3.4.1 - 2。

 

                                           

                                                                                                                                           图 3.4.1 - 2

 3. 修改 Boot Report Characteristic

      在 gatt_db.h 文件中将 Mouse 数据量根据 Report Map 中的 Input Report 进行相应的修改,修改如图 3.4.1 - 3。

 

                                           

                                                                                                                                           图 3.4.1 - 3

 

3.4.2 BLE数据发送

      SDK 中的数据发送只有 3 个 Byte,所采用的数据结构体如下:

      typedef struct mouseHidReport_tag{

      uint8_t buttonStatus;   // 按键

      uint8_t xAxis;         //  X 值

      uint8_t yAxis;         //  Y 值

      }mouseHidReport_t;

      但是由于 Gaming Mouse 需要发送的数据不止这三个,并且 X,Y 两个值也将随着 Optical Navigation Sensor 的寄存器值进行修改,因此本例中的数据结构体将进行修改:

      typedef struct mouseHidReport_tag{  

      uint8_t ID;              // ID

      uint8_t buttonStatus;     // 按键状态

      uint8_t x_L;             // X 值的低位

      uint8_t x_H;            // X 值的高位

      uint8_t y_L;            // Y 值的低位

      uint8_t y_H;            // Y 值的高位

      uint8_t wheel_state_BLE;   // 滚轮值      

      }mouseHidReport_t;

 

      接下来就只需要针对结构体的各个成员进行赋值就可以将整个结构体的值进行上报了,这样 PC 设备就能收到 Mouse 的数据了。

四、总结

      经过前面的解析说明,相信大家都能够基于 QN9080 SDK 进行 BLE 模式电竞鼠标功能相对应功能的实现了,后面我们将会进行最后一个模式 —— 2.4G 模式的实现教学,欢迎大家继续观看。

 

五、参考资料

      [1] Device Class Definition for Human Interface Devices (HID)

 

 

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论