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

Solution: Multimode HID Demo

1 功能概述

此项目演示使用单线程(main主线while循环)方式演示USB,2.4G以及BLE方式鼠标方案。该demo演示功能较为简单,主要是提供相关API接口。

  • BLE模式提供功能如下:

    • 实现进入配对状态广播和重连广播。

    • 实现多ID配对模式,并且每个ID只能配对一个。

    • 通过按键可以切换不同的ID。

2 环境要求

  • board: pan108xxb5_evb

  • uart (option): 显示串口log

3 编译和烧录

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

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

4 演示说明

4.1 BLE模式说明

  1. 通过按键WKUP切换不同的工作模式,切到换BLE模式,工作log如下:

[11:05:12.730]ÊÕ¡û¡ôTry to load HW calibration data..
WARNING: Cannot find valid calib data in current chip!
*** Booting Zephyr OS build zephyr-v2.7.0-1066-g9ce20188a0fe  ***
*** llcontroller-v1.0.0-03fd6983 ***

[11:05:13.733]ÊÕ¡û¡ôaddr:000ef000
ble mode
err[0]:0
err[1]:1
err[2]:2
err[3]:3
err[4]:4
controller initializing....

[11:05:13.859]ÊÕ¡û¡ôNo peer addr founded, id[0]
api start pair adv

[11:05:14.462]ÊÕ¡û¡ô[00:00:01.018,000] [0m<inf> fs_nvs: 8 Sectors of 4096 bytes[0m
[00:00:01.018,000] [0m<inf> fs_nvs: alloc wra: 0, fd0[0m
[00:00:01.018,000] [0m<inf> fs_nvs: data wra: 0, 20[0m
[00:00:01.114,000] [0m<inf> bt_hci_core: Identity[0]: F9:E8:41:0C:00:32 (random)[0m
[00:00:01.114,000] [0m<inf> bt_hci_core: Identity[1]: F9:E8:41:0C:01:32 (random)[0m
[00:00:01.115,000] [0m<inf> bt_hci_core: Identity[2]: F9:E8:41:0C:02:32 (random)[0m
[00:00:01.116,000] [0m<inf> bt_hci_core: Identity[3]: F9:E8:41:0C:03:32 (random)[0m
[00:00:01.116,000] [0m<inf> bt_hci_core: Identity[4]: F9:E8:41:0C:04:32 (random)[0m
[00:00:01.117,000] [0m<inf> bt_hci_core: HCI: version 5.1 (0x0a) revision 0x0003, manufacturer 0x07d1[0m
[00:00:01.117,000] [0m<inf> bt_hci_core: LMP: version 5.1 (0x0a) subver 0x0000[0m
[00:00:01.131,000] [0m<inf> bt_adv: Start Advertising as F9:E8:41:0C:00:32 (random)
[0m

  1. 此时默认工作在ID0状态,该demo支持配对5个不同主机设备,默认是从ID0~ID4。此时可以通手机或者笔记本电脑设备连接当前ID蓝牙。

    
    [11:13:49.485]收←◆ble_evt_connected
    Connected 42:6B:D8:56:A1:FD (random)
    
    [11:13:52.106]收←◆Security changed: 42:6B:D8:56:A1:FD (random) level 2
    
    [11:13:52.169]收←◆Save peer addr ok, id[0]
    Bonded with 50:AF:4D:34:49:07 (public)
    
    [11:13:54.887]收←◆keyboard_ccc_notify_enable: 1
    media_ccc_notify_enable: 1
    
    [11:13:54.929]收←◆power_ccc_notify_enable: 1
    bit_kb_ccc_notify_enable: 1
    
    [11:13:54.977]收←◆mouse_ccc_notify_enable: 1
    vendor_ccc_notify_enable: 1
    
    [11:13:55.022]收←◆boot_keyboard_ccc_notify_enable: 1
    boot_mouse_ccc_notify_enable: 1
    
    [11:13:55.135]收←◆Led:1 len:1 offset:0
    
    
  2. 通过按键KEY1进行切换ID,默认为递增循环方式,比如原来是ID是0,按键后ID是1,一直到4后会再次切到0。 切换后如果默认没有配对过则会进入配对广播模式,如果已经配对则发起重连广播。

当前步骤演示从ID0切换到ID1,通过EVB板按键KEY1,切换完成后可以进一步配对:

[11:15:51.449]收←◆Disconnect BLE, err = 0
change id in conn state
button k1 pressed
keyboard_ccc_notify_enable: 0
media_ccc_notify_enable: 0
power_ccc_notify_enable: 0
bit_kb_ccc_notify_enable: 0
mouse_ccc_notify_enable: 0
vendor_ccc_notify_enable: 0
boot_keyboard_ccc_notify_enable: 0
boot_mouse_ccc_notify_enable: 0
Disconnected from 50:AF:4D:34:49:07 (public) (reason 0x16)
No peer addr founded, id[1]
api start pair adv

[11:15:52.483]收←◆[00:02:10.240,000] [0m<inf> bt_adv: Start Advertising as F9:E8:41:0C:01:32 (random)
[0m

[11:16:22.141]收←◆ble_evt_connected
Connected 42:6B:D8:56:A1:FD (random)

[11:16:23.488]收←◆Security changed: 42:6B:D8:56:A1:FD (random) level 2

[11:16:23.551]收←◆Save peer addr ok, id[1]
Bonded with 50:AF:4D:34:49:07 (public)

[11:16:26.505]收←◆keyboard_ccc_notify_enable: 1

[11:16:26.566]收←◆media_ccc_notify_enable: 1

[11:16:26.652]收←◆power_ccc_notify_enable: 1

[11:16:26.715]收←◆bit_kb_ccc_notify_enable: 1

[11:16:26.774]收←◆mouse_ccc_notify_enable: 1

[11:16:26.836]收←◆vendor_ccc_notify_enable: 1

[11:16:26.896]收←◆boot_keyboard_ccc_notify_enable: 1

[11:16:26.955]收←◆boot_mouse_ccc_notify_enable: 1

[11:16:27.045]收←◆Led:1 len:1 offset:0
  1. 如果当前ID需要强制重新配对,可以通过按键KEY2触发 (注意:因为当前的ID mac地址并未做重新生成处理,会被之前配对过的设备重新连接,所以此处需要把之前该ID配对过的设备删除配对或者关闭它的蓝牙),然后找一个新的设备进行连接配对。这个重新配对如果失败,之前的配对信息仍然存在,只有配对成功才会覆盖之前的配对信息。

[11:21:13.723]收←◆button k2 pressed
Advertising successfully stopped
forced pair in adv state
api start pair adv

[11:21:14.729]收←◆[00:03:23.343,000] [0m<inf> bt_adv: Start Advertising as F9:E8:41:0C:01:32 (random)
[0m

[11:21:16.832]收←◆ble_evt_connected
Connected 50:AF:4D:34:49:07 (public)
keyboard_ccc_notify_enable: 1
media_ccc_notify_enable: 1
power_ccc_notify_enable: 1
bit_kb_ccc_notify_enable: 1
mouse_ccc_notify_enable: 1
vendor_ccc_notify_enable: 1
boot_keyboard_ccc_notify_enable: 1
boot_mouse_ccc_notify_enable: 1

[11:21:18.635]收←◆Security changed: 50:AF:4D:34:49:07 (public) level 2

[11:21:18.696]收←◆Save peer addr ok, id[1]
Bonded with 50:AF:4D:34:49:07 (public)

[11:21:21.361]收←◆Led:1 len:1 offset:0

4.2 2.4G模式说明

1、鼠标端”WKUP”按键切到2.4g模式,切到2.4g模式的log如下图所示:

image

mouse端

2、鼠标端发送2.4g数据然后接收ack并将数据打印出来。

3、dongle端打印的log如下图所示:

image

dongle端

4、dongle端收到数据后打印当前数据包的rssi值,并回复ack。

5 Demo API 接口说明

5.1 BLE API接口说明

  1. ble_evt_connected ble连接事件:是否连接成功需要在该函数中判断是否存在err, 该连接事件在连接过程处于第一位置。

  2. ble_evt_security_changed ble配对加密完成事件:表示连接配对加密状态已经完成,该连接事件在连接过程处于第二位置。

  3. ble_evt_auth_pairing_complete ble配对绑定完成:在第一次配对绑定时,会调用该函数。在该示例中用ble_flash_save_peer_addr。

  4. ble_evt_disconnected ble断连事件。

  5. ble_start_pair_adv 启动配对广播,此时会进入强制配对状态。如果该ID mac未进行过配对,不需要进入强制配对状态也是可以进行配对的。如果该ID有配对数据,则配对成功后覆盖,否则不覆盖。

  6. 强制配对会使用enable_pair_overwrite该变量来打开配对数据可覆盖开关,在绑定(bonded)完成后再次关闭,防止其他设备误触发覆盖配对。

  7. ble_start_reconnect_adv 启动重连广播,启动广播参数包含ID,自己地址,对端地址。

  8. ble_conn_disconnect 主动断链,如果处于连接态,主动退出连接。

  9. ble_stop_adv 停止蓝牙广播

  10. ble_startup_adv [测试使用]上电启动广播函数

  11. ble_report_value [需要实现]上报蓝牙数据

  12. ble_is_connected [测试使用]检测当前蓝牙是否处于连接态

  13. ble_flash_load_peer_addr [测试使用]flash读取配对对端地址

  14. ble_conn_disconnect_with_adv [测试使用]蓝牙连接断连后启动广播,此时ID未变。

  15. ble_conn_disconnect_no_adv [测试使用]蓝牙连接断后不启动广播,此时可以改变ID,然后再次启动其他ID广播。

5.2 2.4G API接口说明

2.4G的API接口参考2.4G应用指南

6 RAM/Flash资源使用情况

Memory region         Used Size  Region Size  %age Used
FLASH:      137832 B       256 KB     52.58%
SRAM:       40724 B        50 KB     79.54%

7 EVB板注意实现

  1. PAN1080_XXA3在EVB板上的跳线顺序

串口跳线顺序: P30 -> P00,注意此处P00指P00对端的串口芯片IO,不是直接连到P00 P31 -> P01,注意此处P00指P00对端的串口芯片IO,不是直接连到P00

按键跳线顺序: P04 -> P34 P05 ->P35