基于 NXP QN9080 三模鼠标开发 —— ReportRate 修改

一、概述

        在电竞鼠标当中,不单单需要一个高的回报率,如果在平时的使用中,低回报率相对而言会使用得更多,低回报率意味着我上报数据的次数将会降低,这样相对于高回报率功耗也会降低。那么怎么样才能实现回报率的切换呢,下面我给大家讲解一下。

二、环境搭建

2.1 SDK 下载

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

2.2 硬件

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

 


                                                                                                                                                                                        图 2.2

2.3 开发软件

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

三、工程介绍

        在 SDK_2.2.0_QN908XCDK\boards\qn908xcdk\usb_examples\usb_device_hid_mouse 目录下的工程是一个 USB 鼠标的例程,由于改变回报率的方式无论在哪个模式都是一样的,因此直接使用 USB Mouse 的例程进行解说。

3.1  修改USB 传输速率

        其实降低回报率也就是降低数据的发送,也可以理解为降低数据获取的次数。我们在一个项目中不会允许鼠标在没有数据的时候仍然一直上报数据给电脑端,因此我们只需要降低获取数据的次数就行了。在 USB 中,我们需要先将自己需要的最大回报率设置成 USB 通道传输的最大速率。在本例程中我们最高的回报率使用 1K,因此先将 USB 通道设置成 1K。下面是修改的方法,具体可参考图 3.1 -1。

 
                                           

                                                                                                                                                                                        图 3.1 – 1

 

        如图 3.1 -1,FS_HID_MOUSE_INTERRUPT_IN_INTERVAL(X) 中 X 的值与 USB 传输速率的关系是: 传输速率 =  1K / X。

3.2  移植定时器

        设置好 USB 传输速率之后,我们需要根据自己的需求去限制获取数据的次数,最简单的方式是通过定时器去限制。所以我们需要先将定时器移植到鼠标的例程当中,具体的定时器例程我们可以参考SDK_2.2.2_QN908XCDK\boards\qn908xcdk\driver_examples\ctimer\simple_match_interrupt。

        ① 将定时器的初始化以及回调函数等移植到 USB Mouse 例程中,并调用该初始化函数,初始化函数具体可参考图 2 – 1。

        ② 在 Driver 中添加文件 c 以及 fsl_ctimer.h 两个文件,具体可参考图 3.2 – 2。


                                           


                                                                                                                                                                                        图 3.2 – 1

 

        图 3.2 – 1 是定时器的初始化,我们需要将定时器的时间间隔设置好,本例中设置的是 1ms 进入一次 CallBack 函数。

 
                                         

                                                                                                                                                                                        图 3.2 – 2

 

        图 3.2 – 2 是定时器需要用到的一些函数,需要从 SDK_2.2.2_QN908XCDK \devices\QN908XC\drivers 中进行添加。

3.3  限制数据获取

        在移植完定时器之后,我们需要做的是利用定时器去限制我们获取数据的次数,具体做法可以分为以下两步:

        ① 在定时器回调函数中进行计数,并置位标志位(计数目的在于计算多久去获取一次数据),具体可参考图 3 – 1。

        ② 判断标志位进行获取画框数据,并且在获取数据前将数据清 0,具体可参考图 3 – 2。

 

        注意:本例程中由于没有限制有数据才能进行发送,因此在没数据时仍然会一直发送 0x00,大家有需要可以自行添加。

 
                                         

                                                                                                                                                                                        图 3.3 – 1

 

        图 3.3 – 1是定时器的回调函数,每 1ms 进入一次,计算 TimeCount 的次数, NUM 是需要的 ReportRate(NUM = 1K / ReportRate),当计数达到时将 sendFlag 标志位置为 true,表示可以进行数据获取。


                                         

                                                                                                                                                                                        图 3.3 – 2

 

        图 3.3 – 2 是鼠标获取画框数据,我们添加 sendFlag 的标志位判断,只有标志位为 true 才能进行获取数据,但是由于本例程只是为了模拟改变 ReportRate,因此没有将数据发送进行限制,所以在获取数据前我们先将 Buffer 清 0,不然尽管没有进入获取数据,仍然会发送上一次保留的数据。

3.4  效果展示

        ① 实现 125 ReportRate,将 NUM 定义为 8。具体修改可参考图 3.4 – 1,具体效果可参考 3.4 – 2。

 


                                         

                                                                                                                                                                                        图 3.4 – 1

 
                                         

                                                                                                                                                                                        图 3.4 – 2

 

        ② 实现 250 ReportRate,将 NUM 定义为 4。具体修改可参考图 3.4 – 3,具体效果可参考 3.4 – 4。

 
                                         

                                                                                                                                                                                        图 3.4 – 3

 

                                         


                                                                                                                                                                                        图 3.4 – 4

 

        ③ 实现 500 ReportRate,将 NUM 定义为 2。具体修改可参考图 3.4 – 5,具体效果可参考 3.4 – 6。


                                         

                                                                                                                                                                                        图 3.4 – 5


                                         
 

                                                                                                                                                                                        图 3.4 – 6

 

        ④ 实现 1K ReportRate,将 NUM 定义为 1。具体修改可参考图 3.4 – 7,具体效果可参考 3.4 – 8。


                                         

                                                                                                                                                                                        图 3.4 – 7


                                         
 

                                                                                                                                                                                        图 3.4 – 8

 

        至此,我们已经实现鼠标之中如何实现自定义 ReportRate,相信大家也知道如何进行修改了,后面将会有更加精彩的内容会给大家讲解,希望大家可以继续关注。

 

四、参考资料

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

 

 

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

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

评论