当前文档版本为 v1.1.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Solution: Multimode Mouse 8k

重要

此例程仅存在于特殊版本的SDK中,如有需要请联系Panchip。

1 功能概述

此sample为pan108xxa3(48pin芯片)在实体鼠标板下的应用

此solution为USB模式下最大上报率8000;2.4G模式下 需要配合4k Dongle使用,4K Dongle端包含了一颗透传高速USB芯片(CH32V30x);蓝牙模式默认133HZ(7.5ms interval)

基于1k鼠标,8k鼠标提高了TRX转换时间,去除了部分线程操作等延时操作,应用层使用高速的底层接口以加快收发包速度,并对payload长度有一定限制

基于4k鼠标,8k鼠标硬件电路有一定修改(ADC 模式检测部分,动态切换运行和休眠电路,IO修改,并增加了透传高速USB芯片(CH32V30x)),软件部分基于4k优化了软件逻辑,修改了USB上报率切换个数为7档以及其他配合部分更新

具体支持的feature如下:

  • 通用功能:

    1. 光电传感:通过sensor进行鼠标基础坐标获取,可以通过dpi按键进行切换Sensor DPI切换(PAW3325 400(红)-800(绿)-1600(蓝)-3200(紫)-4800(橙))

    2. QDEC滚轮模块:支持去抖的正交解码器,反馈鼠标滚轮变化情况

    3. 按键模块:

      a. 基础按键左中右侧边按键key 4 5,底部按键 rpt dpi

      b. rpt按键在usb和2.4G模式下,第一下按键显示当前上报率,3s内第二次按下切换上报率

      • USB模式:8000(红)- 6000(绿)- 4000(蓝)- 2000(紫)-1000(橙)- 500(青)- 125(白)

      • 2.4G模式:4000(红)- 2000(绿)-1000(蓝)- 500(紫)- 125(橙)

      • 蓝牙模式切换设备对应顶部灯效:设备0(紫) - 设备1(绿) - 设备2(青)

    4. LED模块:

      1. 包括顶部rgb灯及底部两个rgb灯,顶部显示状态

      2. 2.4G未对码/强制对码快闪白灯,已存储配对信息慢闪白灯,已连接呼吸灯白色

      3. USB模式显示蓝灯

      4. BLE模式根据不同设备显示 紫 绿 青色配对快闪灯或者连接呼吸灯

      5. 底部按键关闭,USB连接电源充电时,充电时红灯慢闪,充满后显示彩虹灯

      6. 无线模式下,电量低于3.6V时红灯慢闪,低于3.3V休眠

    5. 电量检测:ADC采集电量信息及模式检测

    6. 供电及模式切换:

      ​ a. 电池供电:底部按键可以切换2.4G模式与蓝牙模式,开关拨到中间中间为断电状态,USB接入PC时为优先级最高的USB模式

      ​ b. USB仅供电:底部按键可以切换2.4G模式与蓝牙模式,中间为保电状态

      ​ c. USB插入PC:USB接入PC时为优先级最高的USB模式

    7. 休眠逻辑:休眠逻辑参考6.1章节说明

  • 2.4G模式(PRF增强型模式)

    1. 跳频:在信号质量不好(连续FREQ_HOP_NOACK_THREHOLD=30个ack未收到)/对码前在8个频点进行跳频

    2. 对码:上电跳频找到dongle端的频点后,通信互发对端的MAC地址后2字节,之后切换到私有地址进行通信

    3. 重传:丢包时会进行重传,以最快速度进行重传直到收到对端回复

    4. ACK:可解析的ACK,配合工具MouseDeviceTool可以开发自定义回传消息

    5. 4k性能:默认上报率4000的情况下,近距离稳定在3900包以上,6米稳定在3800包以上

    6. 测试模式(可选)(组合键):自动画圈;关闭PWM灯测试功耗;ACK测试

  • BLE模式

    1. 蓝牙白名单(未用),切换不同设备

    2. 配对,保存

    3. 连接,重连功能

    4. OTA(未使能):与mcuboot配合通过NRF工具进行升级

    5. 性能:133HZ上报率

    6. 性能:兼容性

  • USB模式

    1. 性能:配合高速USB芯片透传,USB2.0最高速率8000hz

    2. 电脑的休眠唤醒

    3. 升级:与mcuboot配合通过USB工具进行升级

  • EMI测试

  • 产线工具设置USB信息及发送单载波

2 环境要求

  • board: pan108xxa3(芯片型号)8k鼠标板

  • uart (option):overlay中默认P24显示串口log

  • USB升级工具:量产烧录工具\Panchip DFU Tool

  • EMI测试工具:键鼠专用工具\PAN108x工具\PAN108xMouseRFTool

  • USB配置工具及自定义开发消息工具:键鼠专用工具\PAN108x工具\MouseDeviceTool

  • 高速鼠标测试工具:05_TOOLS\键鼠专用工具\第三方工具\鼠标测试工具\Polling Rate Tester App_v1.02.00.exe

3 编译和烧录

例程位置:zephyr\samples_panchip\solutions\multimode_mouse_8K

使用 ZAL 工具可以对其进行编译、烧录、打开 VS Code 调试等操作。关于 ZAL 工具的详细介绍请参考:Zephyr APP Launcher 工具介绍

4 演示说明

芯片全部擦除还原默认状态,准备好烧录multimode_mouse_dongle_4K的接收器

4.1 电池供电模式

  1. 电池上电,鼠标端默认中键关闭状态

  2. 鼠标端开关拨到左边为2.4G模式,白色灯快闪,插入接收器至PC,白色灯变为白色呼吸灯,可以测试鼠标基础功能,最大上报率近距离达到4000,远距离6m达到3800+,通过按DPI键切换DPI,通过RPT键切换上报率

  3. 鼠标端开关拨到右边为蓝牙模式,通过RPT键切换dev ID,根据dev ID显示紫/绿/浅蓝灯效,可以在开启蓝牙的PC端搜索到名为Pan_Mouse00/01/02的蓝牙设备,连接后进行控制,最大可以达到133hz左右

  4. 拔出dongle,鼠标端通过拨动模式切换键再次进入2.4G模式,白色灯慢闪,插入dongle变为呼吸灯,鼠标功能恢复

  5. 鼠标端通过拨动模式切换键再次进入BLE模式,等待蓝牙重新连接至PC,鼠标功能恢复

  6. 不拔出dongle,鼠标端再次通过拨动模式切换键进入2.4G模式,白色灯慢闪,随后变为呼吸灯,鼠标功能恢复

  7. 长按左中右3键3s,白色灯快闪,进入强制对码模式,此时重新复位dongle,鼠标对码成功呼吸灯启动,鼠标功能恢复

4.2 USB仅供电模式

​ USB供电与鼠标供电区别在于模式切换键在中间档位不断电,灯的状态暂时未固定,验证非断电模式切换正常即可

​ 模式切换键在中间状态下,插入USB供电,参考电池步骤5.6,测试2.4G与蓝牙下鼠标功能恢复

4.3 USB模式(USB插入PC)

​ 在以上任何情况下(电池供电下任何模式或者关闭/电池未供电),插入USB,鼠标变为USB功能,深蓝色灯效,拔出USB退出到插入之前的状态

​ USB模式下,维护单独的灯效及上报率切换。最大支持8k上报率

4.4 测试模式

4.4.1 组合按键测试

按键线程每50ms扫描一次键值

#define KEY_SCAN_INTERVAL_MS                    50

void key_analysis(void)
{
	uint8_t key_value = 0;

	key_get_value(&key_value);
	#if EVB64_TEST
	evb_test_key();
	#endif
	if (mouse_work_mode == mouse_prf_mode) {
		combo_key_detect(key_value);
		unpair_key_detect(key_value);
		report_rate_key_detect(key_value);
	} else if (mouse_work_mode == mouse_usb_mode) {
		combo_key_detect(key_value);
		report_rate_key_detect(key_value);
	} else if (mouse_work_mode == mouse_ble_mode) {
		combo_key_detect(key_value);
		unpair_key_detect(key_value);
		ble_multi_dev_detect(key_value);
	}
	dpi_key_detect(key_value);
	long_press_key_detect(key_value);
    active_key_detect(key_value);
}

void thread_key(void *dummy1, void *dummy2, void *dummy3)
{
	printk("T key %d\n", KEY_THREAD_PRIORITY);
	while (1) {
		k_msleep(KEY_SCAN_INTERVAL_MS);
		key_analysis();

		if (low_power_stat == deep_sleep_v1_stat) {
			printk("key detect deepsleep\n");
			sleep();
			data_idle_cnt = 0;
			low_power_stat = active_stat;
		}
	}
}
状态进入按键

按键

检测时间
0代表短按

2.4G模式

USB模式

蓝牙模式

DPI

0

切换传感器灵敏度

切换传感器灵敏度

切换传感器灵敏度

DPI + L

0

Reboot

Reboot

Reboot

DPI + M

0

显示电压

更新USB VID,PID

显示电压

DPI + R

0

擦除配对 + Reboot

擦除配对 + Reboot

L + M + R

3

擦除配对 + Reboot

不重启重新配对

M + R

3

自动画圈

自动画圈

自动画圈

M + L

3

关闭灯效

关闭灯效

关闭灯效

R + 5

3

切换彩虹灯效

空闲进入Deepsleep
会影响灯效

RPT

0

切换上报率4000-2000-1000-500-125

切换上报率8000-6000-4000-2000-1000-500-125

切换蓝牙多设备

实时监测按键

按下某些键状态下,会进行部分监测

按键

2.4G模式

USB模式

蓝牙模式

M

显示电压

显示电压

显示电压

R

打印回包数及传感器采集到非0数据个数

4.4.2 EMI测试(RF测试模式)

环境要求:

  • PAN1080 鼠标板

  • USB TYPE-C线

  • PAN1080 ToolBox下载

测试说明:

  • TX模式,如下图所示:

    image

    RF TEST TX模式

    发包数必须设为0,当前不支持发包数的设置

  • RX模式,如下图所示:

    image

    RF TEST RX模式

  • TX单载波模式,如下图所示:

    image

    RF TEST 单载波模式

4.5 USB升级(DFU)

USB DFU升级操作可以参考 05_TOOLS\量产烧录工具\Panchip DFU Tool 最新版本的帮助内容内的操作说明,以下说明升级需要注意的点及原理

关于boot的文档可以参考https://docs.panchip.com/pan1080dk-doc/latest/docs-zdk/04_dev_guides/zephyr_bootloader_guidance.html

4.5.1 升级原理

SDK 1.0.2 之前的版本,升级通过App程序区的USB EP3端点进行消息交互,联同上位机进行升级流程,可以升级鼠标和dongle程序,但是需要注意识别过程需要正确写入芯片VID PID扫描到已有设备,为保证升级兼容性,rebuild编译后的工程强烈建议app区和controller区同时升级,并且进行app升级进行controller升级

SDK 1.0.2 包括之后的版本,灵活开放了boot区的编译,并默认提供了一种方式,程序区先写入flash flag确保进入强制升级,未退出强制升级之前,芯片重新上电始终会停留在boot区域,确认好固件正确性后可以退出强制升级

SDK 1.1.0 包括之后的版本,编译了两种特殊mcuboot固件(存放于01_SDK\modules\hal\panchip\panplat\pan1080\bootloader),支持boot内DFU升级

  1. bootdfu_for_mouse:支持xxa1编译所有鼠标工程及键盘dongle工程,支持boot内usb升级,支持boot内4k dongle或者8k鼠标的spi透传升级

  2. bootdfu_for_keyboard:支持xxb1编译的keyboard工程,支持boot内usb升级

通过应用层宏CONFIG_MCUBOOT_IMAGE_TYPE可以直接控制编译链接的特殊mcuboot固件,值对应上述固件类型

4.5.2 boot自定义编译说明

如果需要自定义更新mcuboot固件,需要注意以下对应关系,建议操作步骤如下

编译mcuboot,注意控制好相关的宏(CONFIG_MCUBOOT_PAN_USB_DFU或者CONFIG_MCUBOOT_PAN_USB_SPI)开启及编译board的选择

以自定义编译鼠标固件为例

ZAL工具编译mcuboot工程,编译board选择xxa1,提前修改01_SDK\bootloader\mcuboot\boot\zephyr\prj,conf内的宏,之后进行编译,编译后的mcuboot固件会自动替换原有的默认mcuboot固件(不包含任何升级功能)01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images

此时如果需要使用此编译固件,可以将APP工程内的CONFIG_MCUBOOT_IMAGE_TYPE宏屏蔽,使用默认的值即会使用被替换掉的mcuboot(也可以灵活处理保存到特殊文件夹通过扩展宏自己控制)

4.5.3 注意事项

使用具有保护功能的boot时,boot的VID为0x046D,PID为0xC055,usb name 为 boot dfu

通过上位机工具量产烧录工具\Panchip DFU Tool升级时,可以参考工具内文档说明的步骤进行升级,注意选择支持强制升级的版本

PS

​ 程序run在boot区时,点击重启芯片可以跳转到app区域,程序升级正常之前,重新上电即可继续升级正确固件

4.6 DeviceTool使用

配合上位机工具键鼠专用工具\PAN108x工具\MouseDeviceTool可以进行产线USB信息测试及单载波测试,具体操作可以参考工具内说明文档

默认界面支持自定义消息开发

显示界面可以切换到USB设置测试功能界面

5 开发说明

5.1 架构说明

multimode_mouse_8k基于zephyr架构,进行多线程编程,线程静态初始化后,根据优先级进行先后初始化,之后各个线程运行至while(1)等待相应的信号量,以此通过控制信号量控制各个线程的调度关系

架构中应用层主要包含

  • 4个线程

    • 监测线程(包含WDT喂狗,按键监测,模式监测,电量监测)

    • 蓝牙线程(监测蓝牙状态)

    • 组包线程(配合蓝牙组包发送,仅蓝牙模式使用)

    • EMI线程(根据emi flag处理定时发包等逻辑)

  • 3个中断

    • TIMER0中断(根据上报率确定的timer0,2.4G模式处理发包组包逻辑,usb模式处理spi透传逻辑)

    • TIMER1中断(1ms刷新灯效)

    • PRF中断

    • SPI DMA中断(获取spi rx数据)

  • 3个重要接口

    • BLE接口(Zephyr API):FRAME组包后通过调用蓝牙接口进入HOST层进行发包,非阻塞接口,会为ble host填充最多6包数据

      /** @brief Notify attribute value change no wait.
       *
       *  Send notification of attribute value change, if connection is NULL notify
       *  all peer that have notification enabled via CCC otherwise do a direct
       *  notification only the given connection.
       *
       *  The attribute object on the parameters can be the so called Characteristic
       *  Declaration, which is usually declared with BT_GATT_CHARACTERISTIC followed
       *  by BT_GATT_CCC, or the Characteristic Value Declaration which is
       *  automatically created after the Characteristic Declaration when using
       *  BT_GATT_CHARACTERISTIC.
       *
       *  @param conn Connection object.
       *  @param attr Characteristic or Characteristic Value attribute.
       *  @param data Pointer to Attribute data.
       *  @param len Attribute value length.
       *
       *  @return 0 in case of success or negative value in case of error.
       */
      static inline int bt_gatt_notify_no_wait(struct bt_conn *conn,
      				 const struct bt_gatt_attr *attr,
      				 const void *data, uint16_t len)
      
    • spi接口(VENDOR DFU):通过spi tx透传数据,通过spi rx进行USB消息收取从而进行DFU升级,EMI测试,鼠标配置

      __ramfunc void spi_transfer(uint8_t *data, uint32_t data_len)
      
    • 低功耗接口

      • 应用进入低功耗宏(长时间静止后进入Deepsleep)

        CONFIG_PM_MOUSE=y
        
      • 系统空闲进入Deepsleep宏,注意程序默认开启了CONFIG_PM=y,如果不用系统Deepsleep,需要以下四个宏一起屏蔽,蓝牙模式下生效

        开启 系统空闲进入Deepsleep 模式
        ### open CONFIG_PM ###
        CONFIG_PM=y
        #Clock Source is RCL
        CONFIG_BT_CTLR_SLEEP_CLOCK_SOURCE=1
        #Accuracy is 2000ppm
        CONFIG_BT_CTLR_SLEEP_TIMER_ACCURACY=2000
        #Enable RCL Force CALIBRATION
        CONFIG_SOC_FORCE_CALIB_RCL_CLK=y
        ### open CONFIG_PM ###
        
        关闭 系统空闲进入Deepsleep 模式
        ### not open CONFIG_PM ###
        # CONFIG_PM=y
        # #Clock Source is RCL
        # CONFIG_BT_CTLR_SLEEP_CLOCK_SOURCE=1
        # #Accuracy is 2000ppm
        # CONFIG_BT_CTLR_SLEEP_TIMER_ACCURACY=2000
        # #Enable RCL Force CALIBRATION
        # CONFIG_SOC_FORCE_CALIB_RCL_CLK=y
        ### not open CONFIG_PM ###
        

5.2 线程说明

线程定义方式如下,选用静态线程的方式,由于包含多种reboot操作,实际单模式生效可对其他无用线程进行中止操作,线程之间通过信号量进行切换或者挂起

/**
 * @brief Statically define and initialize a thread.
 *
 * The thread may be scheduled for immediate execution or a delayed start.
 *
 * Thread options are architecture-specific, and can include K_ESSENTIAL,
 * K_FP_REGS, and K_SSE_REGS. Multiple options may be specified by separating
 * them using "|" (the logical OR operator).
 *
 * The ID of the thread can be accessed using:
 *
 * @code extern const k_tid_t <name>; @endcode
 *
 * @param name Name of the thread.
 * @param stack_size Stack size in bytes.
 * @param entry Thread entry function.
 * @param p1 1st entry point parameter.
 * @param p2 2nd entry point parameter.
 * @param p3 3rd entry point parameter.
 * @param prio Thread priority.
 * @param options Thread options.
 * @param delay Scheduling delay (in milliseconds), zero for no delay.
 *
 *
 * @internal It has been observed that the x86 compiler by default aligns
 * these _static_thread_data structures to 32-byte boundaries, thereby
 * wasting space. To work around this, force a 4-byte alignment.
 *
 */
#define K_THREAD_DEFINE(name, stack_size,                                \
			entry, p1, p2, p3,                               \
			prio, options, delay)                            \
	K_THREAD_STACK_DEFINE(_k_thread_stack_##name, stack_size);	 \
	struct k_thread _k_thread_obj_##name;				 \
	STRUCT_SECTION_ITERABLE(_static_thread_data, _k_thread_data_##name) = \
		Z_THREAD_INITIALIZER(&_k_thread_obj_##name,		 \
				    _k_thread_stack_##name, stack_size,  \
				entry, p1, p2, p3, prio, options, delay, \
				NULL, name);				 	 \
	const k_tid_t name = (k_tid_t)&_k_thread_obj_##name

根据线程定义,定义了如下几个线程,并在common.h统一管理线程优先级及栈大小

#define EMI_THREAD_PRIORITY                         2
#define EMI_THREAD_STACKSIZE                        512

#define FRAME_PACK_THREAD_PRIORITY                  2
#define FRAME_PACK_THREAD_STACKSIZE                 1024

#define BLE_MONITOR_THREAD_PRIORITY                 3
#define BLE_MONITOR_THREAD_STACKSIZE                512

#define KEY_THREAD_PRIORITY                         8
#define KEY_THREAD_STACKSIZE                        1024

5.2.1 EMI线程

通过TIMER0触发EMI测试中发包相关逻辑

5.2.2 FRAME线程

蓝牙组包线程

5.2.3 BLE监测线程

监测蓝牙连接状态并处理进入关灯切换空闲deepsleep并更新latency相关逻辑

5.2.4 KEY线程

包括以下功能,可以适当裁剪

  • 按键监测功能,处理组合键等逻辑

  • 配对前进行喂狗(配对后timer喂狗)

  • 模式及电量监测

5.3 中断说明

5.3.1 RF中断

鼠标端为PRF TX端,增强型模式会在TX后自动转入RX

中断中处理跳频相关逻辑

5.3.2 TIMER中断

TIMER中断产生多线程的控制信号量,并且根据不同上报率切换timer中断间隔

5.4 主要数据结构说明

5.4.1 枚举状态

5.4.1.1 配对状态
enum prf_pair_stat_t {
	prf_pair_start,
	prf_pair_comm,
	prf_pair_addr,
	prf_pair_end,
	prf_paired_private,
	prf_paired_public,
};
5.4.1.2.连接状态
enum ble_connect_stat_t {
	ble_disconnect_stat,
	ble_connect_stat,
};
5.4.1.3 工作模式
enum mouse_work_mode_t {
	mouse_null_mode,
	mouse_usb_mode,
	mouse_prf_mode,
	mouse_ble_mode,
};
5.4.1.4 2.4G RF状态
enum prf_trx_stat_t {
	prf_idle_stat,
	prf_tx_done_stat,
	prf_rx_done_stat,
	prf_rx_timeout_stat,
	prf_rx_crc_err_stat,
	prf_rx_pid_err_stat,
};
5.4.1.5 跳频状态
enum prf_freq_hop_stat_t {
	freq_hop_disconnect_stat,
	freq_hop_connecting_stat,
	freq_hop_done_stat,
};
5.4.1.6 USB状态
enum usb_plug_mode_t {
	usb_plug_in,
	usb_plug_out,
};
5.4.1.7 灯状态
enum mouse_led_stat_t {
	led_unpair_stat,
	led_paired_stat,
	led_low_batt_stat,
	led_prf_connected,
	led_key_stat,
};
5.4.1.8 休眠唤醒低功耗状态
enum mouse_low_power_stat_t {
	active_stat,
	prf_off_stat,
	deep_sleep_v1_stat,
	deep_sleep_v2_stat,
	standby_stat,
};

5.4.2 全局结构

5.4.2.1 组包ring_buf(zephyr)
/**
 * @brief A structure to represent a ring buffer
 */
struct ring_buf {
	uint32_t head;	 /**< Index in buf for the head element */
	uint32_t tail;	 /**< Index in buf for the tail element */
	union ring_buf_misc {
		struct ring_buf_misc_item_mode {
			uint32_t dropped_put_count; /**< Running tally of the
						     * number of failed put
						     * attempts.
						     */
		} item_mode;
		struct ring_buf_misc_byte_mode {
			uint32_t tmp_tail;
			uint32_t tmp_head;
		} byte_mode;
	} misc;
	uint32_t size;   /**< Size of buf in 32-bit chunks */

	union ring_buf_buffer {
		uint32_t *buf32; /**< Memory region for stored entries */
		uint8_t *buf8;
	} buf;
	uint32_t mask;   /**< Modulo mask if size is a power of 2 */

	struct k_spinlock lock;
};
5.4.2.2 传感器结构体
struct sensor_data_t {
	uint8_t motion;
	uint8_t observation;
	uint8_t x_delta_l;
	uint8_t x_delta_h;
	uint8_t y_delta_l;
	uint8_t y_delta_h;
};
5.4.2.3 packet格式结构体

鼠标发送的2.4G帧格式如下

前导码

接入地址

signal

payload

crc

3B

5B

10bit

10B

2B

0x550f71

固定的

增强型的字段

鼠标数据包

16bit crc

其中鼠标Payload为用户可以修改的数据段,Payload 10B格式如下

Type

sequence num

reserved

key

x_value

y_value

roll_value

1B

1B

1B

1B

2B

2B

2B

鼠标包 0x40

己端MAC地址后两个字节

预留位

按键值

传感器x变化量

传感器y变化量

滚轮数据

4k鼠标长时间解析超过2B的ACK情况下不能保证上报率,但支持配合dongle进行固定头为0x5a上报长包ACK,最多测试35B数据的解析测试,长包ACK由dongle端CH32 USB OUT端点获取,鼠标端会打印显示数据

5.4.2.4 收包计数结构体
struct prf_pkt_cnt_t {
	uint32_t tx_cnt;
	uint32_t rx_cnt;
	uint8_t prf_repeat_cnt;
};
5.4.2.5 配对信息结构体
struct pair_ctrl_t {
	enum prf_pair_stat_t prf_pair_stat;
	uint32_t prf_pair_timeout;
	uint8_t pair_own_addr[2];
	uint8_t pair_peer_addr[2];
	bool paired_flag;
};

5.5 主要逻辑图示

5.5.1 鼠标端多线程流程图

高速鼠标已裁剪大部分基础线程,以下流程配合保留线程仅供参考

5.5.1.1 模式检测及中断、低功耗接口流程图
image

鼠标主框架流程图

5.5.1.2 其他线程流程图
image

其他线程流程图

5.5.2 2.4G对码重传跳频

5.5.2.1 对码逻辑
image

对码逻辑

5.5.2.2 重传逻辑
image

重传逻辑

5.5.2.3 跳频逻辑

跳频基础逻辑同1k鼠标,鼠标端跳频逻辑阈值增加,30包未收到后进行跳频,配合dongle端timeout 10ms逻辑

/* mouse */
#define ACK_HOP_CNT          30
/* dongle */
panchip_prf_rx_timeout(10000); /*rx lost cnt hop 10ms*/
image

跳频逻辑

6 补充说明

补充说明当前功耗测试情况,支持中遇到的问题(供参考)及已知仍可能存在的问题

6.1 功耗说明

功耗测试时,左键加中键长按3s关闭灯效进入关灯测试

8K鼠标优化了硬件,2.4G模式运行时电源和传感器电路模式均为DCDC供电,休眠时为LDO供电(降低了休眠功耗)

BLE模式运行时电源和传感器电路模式均为DCDC供电,idle deepsleep状态和休眠时为LDO模式(降低了休眠功耗)

功耗相关配置

ADC采样配置:No Buffer 模式,100ms,空闲关闭

apb1/2 div分频系数:4/1

2.4G功耗

划线停止10s后(10s内功耗3~5mA(不同上报率不同)),进入一级休眠(<60uA),10s后进入二级休眠(<60uA);一、二级休眠状态均可随时移动/按键唤醒(2级休眠逻辑上多了LP TIMER唤醒);

设备

上报率

状态1(mA)

状态2 (mA)

状态3 (uA)

状态4 (uA)

自动画圈(mA)

鼠标B

4000

12.23

4.91

44/49

44/49

12.23

鼠标B

2000

9.55

3.38

44/49

44/49

9.52

鼠标B

1000

4.89

3.14

44/49

44/49

4.54

鼠标B

500

4.09

3.1

44/49

44/49

3.67

鼠标B

125

3.52

3.05

44/49

44/49

3.15

状态1:关灯,手滑

状态2:移动停止500ms后,关闭RF

状态3:10s后deepsleep ,传感器唤醒,rcl唤醒

状态4:10s后deepsleep,传感器唤醒

蓝牙功耗

划线停止后(此状态维持30s,关闭灯效情况下,空闲进入deepsleep,interval保持7.5mS,功耗3mA左右),进入保持蓝牙连接的一级休眠(方便测试目前设置维持30s,目前300uA+,latency 120mS),10min后进入断开蓝牙连接的二级休眠(进入standby,移动可以唤醒,功耗40uA左右); 一、二级休眠状态均可随时移动/按键唤醒;(一级相当于idle deepsleep,二级为standby),二级休眠唤醒后蓝牙自动重连时间低于500ms;

设备

上报率

状态1(mA)

状态2 (mA)

状态3 (uA)

状态4(uA)

自动画圈(mA)

鼠标B

133

4.99

3.17

306

36

4.6

状态1:关灯,手滑

状态2:不移动 持续BLE_LED_OFF_S(30)s

状态3:关灯,修改latency(120ms),idle deepsleep状态,持续到BLE_IDLE_SLEEP(60)s,保持连接,移动按键唤醒

状态4:BLE_IDLE_SLEEP(60)s后断链 进入standby移动按键唤醒

6.2 蓝牙启动时间说明

2.4G和蓝牙启动需要对controller进行初始化,controller初始化时间可以由log观测,目前测试启动时间为66ms

6.3 距离测试

主机

从机

距离(m)

上报率

8k Mouse

4k Dongle

0

3900

8k Mouse

4k Dongle

5

3800

8k Mouse

4k Dongle

10

3600

7 RAM/Flash资源使用情况

FLASH部分包含蓝牙controller固定资源120K,不包含初始位置开始的60K MCUBOOT程序,FLASH资源由于mcuboot内已支持升级功能,实际可用大小可以扩展152K

默认开启了调试log(flash占用11K左右),并且需要CONFIG_SPEED_OPTIMIZATIONS=y及中断ramfunc处理,会消耗一定资源

Memory region

Used Size

Region Size

%age Used

FLASH

146052 B

152 KB

93.83%

SRAM

47912 B

50 KB

93.58%