fix(server): discover HDMI connector during install
This commit is contained in:
parent
bbd239bfd0
commit
9d61f855e6
@ -30,24 +30,51 @@ is_attached_state() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
normalize_hdmi_connector() {
|
||||||
|
local name="$1"
|
||||||
|
if [[ $name =~ (HDMI-A-[0-9]+)$ ]]; then
|
||||||
|
printf '%s\n' "${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
printf '%s\n' "$name"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
read_existing_hdmi_connector() {
|
||||||
|
local line value
|
||||||
|
line=$(grep -E '^LESAVKA_HDMI_CONNECTOR=' /etc/lesavka/server.env 2>/dev/null | tail -n1 || true)
|
||||||
|
[[ -n $line ]] || return 0
|
||||||
|
value=${line#*=}
|
||||||
|
value=${value%\"}
|
||||||
|
value=${value#\"}
|
||||||
|
value=${value%\'}
|
||||||
|
value=${value#\'}
|
||||||
|
normalize_hdmi_connector "$value"
|
||||||
|
}
|
||||||
|
|
||||||
|
describe_hdmi_connectors() {
|
||||||
|
local dev name status id
|
||||||
|
for dev in /sys/class/drm/card*-HDMI-A-*; do
|
||||||
|
[[ -e $dev/status ]] || continue
|
||||||
|
name=$(basename "$dev")
|
||||||
|
status=$(cat "$dev/status" 2>/dev/null || true)
|
||||||
|
id=$(cat "$dev/connector_id" 2>/dev/null || true)
|
||||||
|
printf ' %s (%s): %s\n' "$(normalize_hdmi_connector "$name")" "${id:-no-id}" "${status:-unknown}" >&2
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
detect_connected_hdmi_connector() {
|
detect_connected_hdmi_connector() {
|
||||||
local dev name stable_name status score suffix
|
local dev name stable_name status score
|
||||||
local best="" best_score=0 best_suffix=0
|
local best="" best_score=0 best_count=0
|
||||||
declare -A scores=()
|
declare -A scores=()
|
||||||
|
|
||||||
# HDMI status can briefly flap during gadget/display bring-up. Sample a few
|
# HDMI status can briefly flap during gadget/display bring-up, so sample a
|
||||||
# times and prefer the connector that stays connected; ties prefer HDMI-A-2,
|
# few times. Store the logical connector suffix, not the DRM card prefix, so
|
||||||
# which is the dedicated downstream capture leg on the current Pi layout.
|
# this stays valid if Linux renumbers cardN across boots.
|
||||||
# Store the logical connector suffix, not the DRM card prefix, so this stays
|
|
||||||
# valid if Linux renumbers cardN across boots.
|
|
||||||
for _ in 1 2 3 4 5; do
|
for _ in 1 2 3 4 5; do
|
||||||
for dev in /sys/class/drm/card*-HDMI-A-*; do
|
for dev in /sys/class/drm/card*-HDMI-A-*; do
|
||||||
[[ -e $dev/status ]] || continue
|
[[ -e $dev/status ]] || continue
|
||||||
name=$(basename "$dev")
|
name=$(basename "$dev")
|
||||||
stable_name=$name
|
stable_name=$(normalize_hdmi_connector "$name")
|
||||||
if [[ $name =~ (HDMI-A-[0-9]+)$ ]]; then
|
|
||||||
stable_name=${BASH_REMATCH[1]}
|
|
||||||
fi
|
|
||||||
status=$(cat "$dev/status" 2>/dev/null || true)
|
status=$(cat "$dev/status" 2>/dev/null || true)
|
||||||
if [[ $status == connected ]]; then
|
if [[ $status == connected ]]; then
|
||||||
scores[$stable_name]=$(( ${scores[$stable_name]:-0} + 1 ))
|
scores[$stable_name]=$(( ${scores[$stable_name]:-0} + 1 ))
|
||||||
@ -58,15 +85,51 @@ detect_connected_hdmi_connector() {
|
|||||||
|
|
||||||
for name in "${!scores[@]}"; do
|
for name in "${!scores[@]}"; do
|
||||||
score=${scores[$name]}
|
score=${scores[$name]}
|
||||||
suffix=${name##*-}
|
if (( score > best_score )); then
|
||||||
if (( score > best_score || (score == best_score && suffix > best_suffix) )); then
|
|
||||||
best=$name
|
best=$name
|
||||||
best_score=$score
|
best_score=$score
|
||||||
best_suffix=$suffix
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
printf '%s\n' "$best"
|
(( best_score > 0 )) || return 0
|
||||||
|
|
||||||
|
for name in "${!scores[@]}"; do
|
||||||
|
if (( scores[$name] == best_score )); then
|
||||||
|
best_count=$((best_count + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if (( best_count == 1 )); then
|
||||||
|
printf '%s\n' "$best"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "❌ multiple HDMI connectors are equally connected; refusing to guess." >&2
|
||||||
|
describe_hdmi_connectors
|
||||||
|
echo " Disconnect the non-target HDMI output or run once with LESAVKA_HDMI_CONNECTOR=HDMI-A-N." >&2
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve_hdmi_connector() {
|
||||||
|
local detected existing
|
||||||
|
if [[ -n ${LESAVKA_HDMI_CONNECTOR:-} ]]; then
|
||||||
|
normalize_hdmi_connector "$LESAVKA_HDMI_CONNECTOR"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! detected=$(detect_connected_hdmi_connector); then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ -n $detected ]]; then
|
||||||
|
printf '%s\n' "$detected"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
existing=$(read_existing_hdmi_connector)
|
||||||
|
if [[ -n $existing ]]; then
|
||||||
|
echo "⚠️ no connected HDMI connector detected; preserving existing LESAVKA_HDMI_CONNECTOR=$existing." >&2
|
||||||
|
printf '%s\n' "$existing"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
run_as_user() {
|
run_as_user() {
|
||||||
@ -232,7 +295,7 @@ sudo install -Dm755 "$SRC_DIR/scripts/daemon/lesavka-uvc.sh" /usr/local/b
|
|||||||
|
|
||||||
echo "==> 5b. Runtime environment defaults"
|
echo "==> 5b. Runtime environment defaults"
|
||||||
sudo install -d -m 0755 /etc/lesavka
|
sudo install -d -m 0755 /etc/lesavka
|
||||||
HDMI_CONNECTOR=${LESAVKA_HDMI_CONNECTOR:-$(detect_connected_hdmi_connector)}
|
HDMI_CONNECTOR=$(resolve_hdmi_connector)
|
||||||
if [[ -n $HDMI_CONNECTOR ]]; then
|
if [[ -n $HDMI_CONNECTOR ]]; then
|
||||||
echo " ↪ HDMI connector: $HDMI_CONNECTOR"
|
echo " ↪ HDMI connector: $HDMI_CONNECTOR"
|
||||||
else
|
else
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user