Skip to content

Commit b57ce91

Browse files
committed
lib_video: avoid deleting /dev/media* nodes during v4l refresh
video_clean_and_refresh_v4l() now only triggers udev and recreates missing nodes from sysfs. Existing /dev/media* and /dev/video* entries are left untouched to avoid disrupting libcamera enumeration. Signed-off-by: Srikanth Muppandam <smuppand@qti.qualcomm.com>
1 parent 4ae00ad commit b57ce91

1 file changed

Lines changed: 59 additions & 18 deletions

File tree

Runner/utils/lib_video.sh

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,32 +1137,73 @@ video_block_upstream_strict() {
11371137
# udev refresh + prune stale /dev/video* and /dev/media* nodes
11381138
# -----------------------------------------------------------------------------
11391139
video_clean_and_refresh_v4l() {
1140+
# Refresh udev-managed nodes (best-effort). Do NOT prune/delete anything.
11401141
if video_exist_cmd udevadm; then
11411142
log_info "udev trigger: video4linux/media"
11421143
udevadm trigger --subsystem-match=video4linux --action=change 2>/dev/null || true
11431144
udevadm trigger --subsystem-match=media --action=change 2>/dev/null || true
11441145
udevadm settle 2>/dev/null || true
11451146
fi
1146-
1147-
for n in /dev/video*; do
1148-
[ -e "$n" ] || continue
1149-
bn=$(basename "$n")
1150-
if [ ! -e "/sys/class/video4linux/$bn" ]; then
1151-
log_info "Pruning stale node: $n"
1152-
rm -f "$n" 2>/dev/null || true
1153-
fi
1154-
done
1155-
1156-
for n in /dev/media*; do
1157-
[ -e "$n" ] || continue
1158-
bn=$(basename "$n")
1159-
if [ ! -e "/sys/class/media/$bn" ]; then
1160-
log_info "Pruning stale node: $n"
1161-
rm -f "$n" 2>/dev/null || true
1162-
fi
1147+
1148+
# Recreate missing /dev nodes using /sys/dev/char mapping.
1149+
# Additive-only: never modify existing nodes (no chmod/chgrp on existing).
1150+
for sysdev in /sys/dev/char/*; do
1151+
[ -e "$sysdev" ] || continue
1152+
1153+
majmin=$(basename "$sysdev")
1154+
case "$majmin" in
1155+
*:*)
1156+
major=${majmin%:*}
1157+
minor=${majmin#*:}
1158+
;;
1159+
*)
1160+
continue
1161+
;;
1162+
esac
1163+
1164+
case "$major" in ''|*[!0-9]*) continue ;; esac
1165+
case "$minor" in ''|*[!0-9]*) continue ;; esac
1166+
1167+
tgt=$(readlink -f "$sysdev" 2>/dev/null || true)
1168+
[ -n "$tgt" ] || continue
1169+
1170+
# Media controller nodes
1171+
case "$tgt" in
1172+
*/media[0-9]*)
1173+
bn=$(basename "$tgt") # e.g. media0
1174+
devnode="/dev/$bn"
1175+
1176+
# Never touch if it already exists
1177+
if [ -e "$devnode" ]; then
1178+
continue
1179+
fi
1180+
1181+
log_info "Recreating missing node: $devnode (c $major $minor)"
1182+
mknod "$devnode" c "$major" "$minor" 2>/dev/null || true
1183+
chgrp video "$devnode" 2>/dev/null || true
1184+
chmod 660 "$devnode" 2>/dev/null || true
1185+
;;
1186+
esac
1187+
1188+
# V4L2 video nodes
1189+
case "$tgt" in
1190+
*/video4linux/video[0-9]*)
1191+
bn=$(basename "$tgt") # e.g. video0
1192+
devnode="/dev/$bn"
1193+
1194+
# Never touch if it already exists
1195+
if [ -e "$devnode" ]; then
1196+
continue
1197+
fi
1198+
1199+
log_info "Recreating missing node: $devnode (c $major $minor)"
1200+
mknod "$devnode" c "$major" "$minor" 2>/dev/null || true
1201+
chgrp video "$devnode" 2>/dev/null || true
1202+
chmod 660 "$devnode" 2>/dev/null || true
1203+
;;
1204+
esac
11631205
done
11641206
}
1165-
11661207
# -----------------------------------------------------------------------------
11671208
# DMESG triage
11681209
# -----------------------------------------------------------------------------

0 commit comments

Comments
 (0)