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模式说明¶
通过按键
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
此时默认工作在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
通过按键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
如果当前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如下图所示:
2、鼠标端发送2.4g数据然后接收ack并将数据打印出来。
3、dongle端打印的log如下图所示:
4、dongle端收到数据后打印当前数据包的rssi值,并回复ack。
5 Demo API 接口说明¶
5.1 BLE API接口说明¶
ble_evt_connected
ble连接事件:是否连接成功需要在该函数中判断是否存在err, 该连接事件在连接过程处于第一位置。ble_evt_security_changed
ble配对加密完成事件:表示连接配对加密状态已经完成,该连接事件在连接过程处于第二位置。ble_evt_auth_pairing_complete
ble配对绑定完成:在第一次配对绑定时,会调用该函数。在该示例中用ble_flash_save_peer_addr。ble_evt_disconnected
ble断连事件。ble_start_pair_adv
启动配对广播,此时会进入强制配对状态。如果该ID mac未进行过配对,不需要进入强制配对状态也是可以进行配对的。如果该ID有配对数据,则配对成功后覆盖,否则不覆盖。强制配对会使用
enable_pair_overwrite
该变量来打开配对数据可覆盖开关,在绑定(bonded)完成后再次关闭,防止其他设备误触发覆盖配对。ble_start_reconnect_adv
启动重连广播,启动广播参数包含ID,自己地址,对端地址。ble_conn_disconnect
主动断链,如果处于连接态,主动退出连接。ble_stop_adv
停止蓝牙广播ble_startup_adv
[测试使用]上电启动广播函数ble_report_value
[需要实现]上报蓝牙数据ble_is_connected
[测试使用]检测当前蓝牙是否处于连接态ble_flash_load_peer_addr
[测试使用]flash读取配对对端地址ble_conn_disconnect_with_adv
[测试使用]蓝牙连接断连后启动广播,此时ID未变。ble_conn_disconnect_no_adv
[测试使用]蓝牙连接断后不启动广播,此时可以改变ID,然后再次启动其他ID广播。
6 RAM/Flash资源使用情况¶
Memory region Used Size Region Size %age Used
FLASH: 116288 B 384 KB 29.57%
SRAM: 38662 B 50 KB 75.51%
7 EVB板注意实现¶
PAN1080_XXA3在EVB板上的跳线顺序
串口跳线顺序: P30 -> P00,注意此处P00指P00对端的串口芯片IO,不是直接连到P00 P31 -> P01,注意此处P00指P00对端的串口芯片IO,不是直接连到P00
按键跳线顺序: P04 -> P34 P05 ->P35