当前文档版本为 v1.2.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

11.71

4.52

44(80)

44(80)

11.21

鼠标B

2000

8.61

3.00

44(80)

44(80)

8.39

鼠标B

1000

4.18

2.97

44(80)

44(80)

3.8

鼠标B

500

3.64

2.93

44(80)

44(80)

3.26

鼠标B

125

3.17

2.88

44(80)

44(80)

2.79

状态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.62

2.77

290

45(90)

4.27

状态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

28

3500-4000

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

133580 B

152 KB

85.82%

SRAM

47752 B

50 KB

93.27%