mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-09-12 10:34:24 +08:00
fix: 修复设备识别问题 #286
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user