fix: 修复设备识别问题 #286

This commit is contained in:
mofeng-git
2026-07-27 15:12:54 +08:00
parent 4f770a1eea
commit e0bddc2faa

View File

@@ -1172,7 +1172,34 @@ fn sysfs_maybe_capture(path: &Path) -> bool {
.to_lowercase(); .to_lowercase();
let driver = extract_uevent_value(&uevent, "driver"); let driver = extract_uevent_value(&uevent, "driver");
let mut maybe_capture = false; sysfs_identity_maybe_capture(&sysfs_name, driver.as_deref())
}
fn sysfs_identity_maybe_capture(sysfs_name: &str, driver: Option<&str>) -> bool {
// rkisp mainpath/selfpath are real frame-capture queues even though their
// names contain the generic "isp" skip hint below. Keep the allow-list
// narrow: rkisp also registers metadata and raw read/write nodes that
// must not be probed as ordinary frame-capture devices.
let is_rkisp_capture = sysfs_name.contains("rkisp")
&& (sysfs_name.contains("mainpath") || sysfs_name.contains("selfpath"));
let is_rkisp_non_capture = [
"rkisp1_stats",
"rkisp1_params",
"rkisp_stats",
"rkisp_params",
"rkisp-statistics",
"rkisp-input-params",
"rkisp_rawrd",
"rkisp_rawwr",
]
.iter()
.any(|hint| sysfs_name.contains(hint));
if is_rkisp_non_capture {
return false;
}
let mut maybe_capture = is_rkisp_capture;
let capture_hints = [ let capture_hints = [
"capture", "capture",
"hdmi", "hdmi",
@@ -1190,7 +1217,7 @@ fn sysfs_maybe_capture(path: &Path) -> bool {
if capture_hints.iter().any(|hint| sysfs_name.contains(hint)) { if capture_hints.iter().any(|hint| sysfs_name.contains(hint)) {
maybe_capture = true; maybe_capture = true;
} }
if let Some(driver) = &driver { if let Some(driver) = driver {
if driver.contains("uvcvideo") if driver.contains("uvcvideo")
|| driver.contains("tc358743") || driver.contains("tc358743")
|| driver.contains("rkcif") || driver.contains("rkcif")
@@ -1214,28 +1241,15 @@ fn sysfs_maybe_capture(path: &Path) -> bool {
"mpp_", "mpp_",
"rockchip-vpu", "rockchip-vpu",
]; ];
if let Some(driver) = &driver { if let Some(driver) = driver {
if driver_skip.iter().any(|hint| driver.contains(hint)) { if driver_skip.iter().any(|hint| driver.contains(hint)) {
return false; return false;
} }
} }
let skip_hints = [ let skip_hints = [
"codec", "codec", "decoder", "encoder", "isp", "mem2mem", "m2m", "vbi", "radio", "metadata",
"decoder",
"encoder",
"isp",
"mem2mem",
"m2m",
"vbi",
"radio",
"metadata",
"output", "output",
// rkisp sub-nodes that are not video capture queues
"rkisp-statistics",
"rkisp-input-params",
"rkisp_rawrd",
"rkisp_rawwr",
]; ];
if skip_hints.iter().any(|hint| sysfs_name.contains(hint)) && !maybe_capture { if skip_hints.iter().any(|hint| sysfs_name.contains(hint)) && !maybe_capture {
return false; return false;
@@ -1379,6 +1393,39 @@ mod tests {
assert!(res.is_valid()); assert!(res.is_valid());
} }
#[test]
fn sysfs_filter_keeps_rkisp_frame_capture_nodes() {
assert!(sysfs_identity_maybe_capture(
"rkisp1_mainpath",
Some("rkisp1")
));
assert!(sysfs_identity_maybe_capture(
"rkisp1_selfpath",
Some("rkisp1")
));
assert!(sysfs_identity_maybe_capture(
"rkisp_mainpath",
Some("rkisp1_v0")
));
}
#[test]
fn sysfs_filter_rejects_rkisp_non_frame_nodes() {
for name in [
"rkisp1_stats",
"rkisp1_params",
"rkisp-statistics",
"rkisp-input-params",
"rkisp_rawrd0",
"rkisp_rawwr0",
] {
assert!(
!sysfs_identity_maybe_capture(name, Some("rkisp1")),
"{name} must not be treated as a frame-capture node"
);
}
}
#[test] #[test]
fn recovery_selection_prefers_original_path() { fn recovery_selection_prefers_original_path() {
let original = test_device( let original = test_device(