feat: 添加USB HID模块支持

- 添加usb_hid_event事件定义和实现,用于管理USB HID状态
- 添加usb_hid_module模块,实现USB HID协议栈的完整生命周期管理
- 在CMakeLists.txt中注册新的事件和模块源文件
- 在设备树overlay中配置三个HID设备:HID_BOOT、HID_NKRO、HID_RAW
- 在prj.conf中启用USB设备栈相关配置选项
- 修复电池模块和模式切换模块中的重复挂起问题
- 改进蓝牙绑定模块的错误处理和日志记录
- 在app.overlay中启用usbd节点并添加PMIC配置调整
This commit is contained in:
2026-03-14 12:13:25 +08:00
parent 81846a870f
commit e893ddded6
9 changed files with 765 additions and 14 deletions

View File

@@ -1,5 +1,6 @@
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/settings/settings.h>
#include <errno.h>
#include <app_event_manager.h>
@@ -46,6 +47,20 @@ static bool bt_stack_id_lut_valid;
static uint8_t cur_ble_peer_id;
static bool cur_peer_id_valid;
static const char *state_name(enum state s)
{
switch (s) {
case STATE_DISABLED:
return "DISABLED";
case STATE_IDLE:
return "IDLE";
case STATE_STANDBY:
return "STANDBY";
default:
return "UNKNOWN";
}
}
static uint8_t get_bt_stack_peer_id(uint8_t app_id)
{
__ASSERT_NO_MSG(app_id < APP_PEER_COUNT);
@@ -87,16 +102,22 @@ static void init_bt_stack_id_lut(void)
static bool storage_data_is_valid(void)
{
if (!cur_peer_id_valid || !bt_stack_id_lut_valid) {
LOG_WRN("Stored data invalid: peer_valid=%d lut_valid=%d",
cur_peer_id_valid, bt_stack_id_lut_valid);
return false;
}
if (cur_ble_peer_id >= APP_PEER_COUNT) {
LOG_WRN("Stored peer id out of range: peer_id=%u max=%u",
cur_ble_peer_id, APP_PEER_COUNT - 1);
return false;
}
for (size_t i = 0; i < ARRAY_SIZE(bt_stack_id_lut); i++) {
if ((bt_stack_id_lut[i] == BT_ID_DEFAULT) ||
(bt_stack_id_lut[i] >= CONFIG_BT_ID_MAX)) {
LOG_WRN("Stored LUT invalid at idx=%u value=%u",
(uint32_t)i, bt_stack_id_lut[i]);
return false;
}
}
@@ -111,20 +132,30 @@ static int settings_set(const char *key, size_t len_rd,
if (!strcmp(key, PEER_ID_KEY)) {
if (len_rd != sizeof(cur_ble_peer_id)) {
LOG_WRN("Settings '%s' size mismatch: got=%u expect=%u",
PEER_ID_KEY, (uint32_t)len_rd, sizeof(cur_ble_peer_id));
cur_peer_id_valid = false;
return 0;
}
rc = read_cb(cb_arg, &cur_ble_peer_id, sizeof(cur_ble_peer_id));
cur_peer_id_valid = (rc == sizeof(cur_ble_peer_id));
if (!cur_peer_id_valid) {
LOG_WRN("Settings '%s' read failed: rc=%d", PEER_ID_KEY, (int)rc);
}
} else if (!strcmp(key, BT_LUT_KEY)) {
if (len_rd != sizeof(bt_stack_id_lut)) {
LOG_WRN("Settings '%s' size mismatch: got=%u expect=%u",
BT_LUT_KEY, (uint32_t)len_rd, sizeof(bt_stack_id_lut));
bt_stack_id_lut_valid = false;
return 0;
}
rc = read_cb(cb_arg, bt_stack_id_lut, sizeof(bt_stack_id_lut));
bt_stack_id_lut_valid = (rc == sizeof(bt_stack_id_lut));
if (!bt_stack_id_lut_valid) {
LOG_WRN("Settings '%s' read failed: rc=%d", BT_LUT_KEY, (int)rc);
}
}
return 0;
@@ -132,21 +163,24 @@ static int settings_set(const char *key, size_t len_rd,
SETTINGS_STATIC_HANDLER_DEFINE(ble_bond, MODULE_NAME, NULL, settings_set, NULL, NULL);
static void load_identities(void)
static int load_identities(void)
{
bt_addr_le_t addrs[CONFIG_BT_ID_MAX];
size_t count = ARRAY_SIZE(addrs);
bt_id_get(addrs, &count);
LOG_INF("Identity count before ensure: %u / %u", (uint32_t)count, CONFIG_BT_ID_MAX);
for (; count < CONFIG_BT_ID_MAX; count++) {
int err = bt_id_create(NULL, NULL);
if (err < 0) {
LOG_ERR("Cannot create identity (err:%d)", err);
module_set_state(MODULE_STATE_ERROR);
return;
return err;
}
LOG_INF("Created identity idx=%u", (uint32_t)count);
}
return 0;
}
static int erase_peer(uint8_t app_id)
@@ -258,21 +292,33 @@ static bool handle_config_event(const struct config_event *event)
static int init_after_settings_loaded(void)
{
load_identities();
if (state == STATE_DISABLED) {
return -EFAULT;
int err = load_identities();
if (err) {
LOG_ERR("Identity initialization failed: %d", err);
return err;
}
if (!storage_data_is_valid()) {
LOG_WRN("Stored BLE bond data invalid, reinitializing defaults");
cur_ble_peer_id = 0;
init_bt_stack_id_lut();
if (store_peer_id(cur_ble_peer_id) || store_bt_stack_id_lut()) {
err = store_peer_id(cur_ble_peer_id);
if (err) {
LOG_ERR("Failed to store peer_id=%u (err:%d)", cur_ble_peer_id, err);
return -EIO;
}
err = store_bt_stack_id_lut();
if (err) {
LOG_ERR("Failed to store bt_stack_id_lut (err:%d)", err);
return -EIO;
}
}
state = STATE_IDLE;
LOG_INF("ble_bond init done: state=%s peer_id=%u stack_id=%u",
state_name(state), cur_ble_peer_id, get_bt_stack_peer_id(cur_ble_peer_id));
submit_peer_op_event(PEER_OPERATION_SELECTED, cur_ble_peer_id);
module_set_state(MODULE_STATE_READY);
@@ -286,7 +332,11 @@ static bool app_event_handler(const struct app_event_header *aeh)
if (check_state(event, MODULE_ID(settings_loader), MODULE_STATE_READY) &&
(state == STATE_DISABLED)) {
if (init_after_settings_loaded()) {
LOG_INF("settings_loader ready, starting ble_bond init");
int err = init_after_settings_loaded();
if (err) {
LOG_ERR("ble_bond init failed (err:%d), state=%s",
err, state_name(state));
module_set_state(MODULE_STATE_ERROR);
}
}