fix: 修复OTG gadget重建后HID后端未重载导致键鼠失效

当MSD或OTG网络配置变更导致gadget被重建时,新的/dev/hidg*设备
被创建但HID后端因'配置未变'跳过了reload,导致仍持有已删除设备
的旧文件描述符,键鼠操作无效。

修复: 在apply_usb_config中检测gadget是否因MSD/网络变更被重建,
若是且HID后端为OTG,强制reload HID以打开新的/dev/hidg*设备。

同时为MsdConfig添加PartialEq derive以支持变更检测。
This commit is contained in:
arounyf
2026-07-22 04:54:18 +00:00
parent d60ddb21dc
commit 4e32b05124
2 changed files with 18 additions and 1 deletions

View File

@@ -44,7 +44,7 @@ impl Default for VideoConfig {
}
#[typeshare]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(default)]
pub struct MsdConfig {
pub enabled: bool,

View File

@@ -365,6 +365,10 @@ pub async fn apply_usb_config(
let transitioning_away_from_otg =
old_config.hid.backend == HidBackend::Otg && new_config.hid.backend != HidBackend::Otg;
let hid_unchanged = old_config.hid == new_config.hid;
let otg_gadget_rebuilt =
old_config.msd != new_config.msd || old_config.otg_network != new_config.otg_network;
if transitioning_away_from_otg {
apply_hid_config(
state,
@@ -394,6 +398,19 @@ pub async fn apply_usb_config(
.await?;
}
// When the OTG gadget was rebuilt due to MSD or network config changes
// while HID config stayed the same, the /dev/hidg* devices are new and
// the HID backend must be reloaded to reopen them.
if hid_unchanged && otg_gadget_rebuilt && new_config.hid.backend == HidBackend::Otg {
tracing::info!("OTG gadget rebuilt, reloading HID backend for new devices");
let hid_backend = hid_backend_type(&new_config.hid);
state
.hid
.reload(hid_backend)
.await
.map_err(|e| AppError::Config(format!("HID reload after gadget rebuild failed: {}", e)))?;
}
apply_msd_config(
state,
&old_config.msd,