清理了一些没有用到的vlm_detect文件
This commit is contained in:
@@ -1,101 +1,172 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# 退出码说明
|
||||
# 0 - 成功
|
||||
# 1 - 错误:等待TTY设备就绪超时
|
||||
# 2 - 错误:未找到CH343驱动
|
||||
# 3 - 错误:雷达端口上未找到CH34x设备
|
||||
# 4 - 错误:未从cdc_acm找到雷达接口
|
||||
# 5 - 错误:解绑cdc_acm驱动失败
|
||||
# 6 - 错误:绑定usb_ch343驱动失败
|
||||
# Physical USB ports on the RDKx5 carrier.
|
||||
RADAR_PORT="1-1.4"
|
||||
IMU_PORT="1-1.1"
|
||||
|
||||
# ── 配置 ────────────────────────────────────────────
|
||||
TTY_DEVICE="/dev/ttyACM*"
|
||||
CDC_ACM_PATH="/sys/bus/usb/drivers/cdc_acm"
|
||||
USB_CH343_PATH="/sys/bus/usb/drivers/usb_ch343"
|
||||
RADAR_USB_PORT="1-1.4" # 雷达 CH34x 的 USB 物理端口(固定不变)
|
||||
CHECK_INTERVAL=1
|
||||
MAX_WAIT_SECONDS=30
|
||||
# RADAR -> usb_ch343, IMU -> cdc_acm.
|
||||
RADAR_DRIVER="usb_ch343"
|
||||
IMU_DRIVER="cdc_acm"
|
||||
|
||||
# ── 初始化 ──────────────────────────────────────────
|
||||
start_time=$(cut -d. -f1 /proc/uptime)
|
||||
DRIVER_ROOT="/sys/bus/usb/drivers"
|
||||
MAX_WAIT_SECONDS="${MAX_WAIT_SECONDS:-30}"
|
||||
WAIT_INTERVAL_SECONDS="${WAIT_INTERVAL_SECONDS:-1}"
|
||||
INTERFACES=()
|
||||
|
||||
# ── 1. 等待 TTY 设备就绪 ────────────────────────────
|
||||
while true; do
|
||||
for dev in /dev/ttyACM*; do
|
||||
[ -e "$dev" ] || continue
|
||||
if [ -c "$dev" ] && [ -r "$dev" ] && [ -w "$dev" ]; then
|
||||
echo "[雷达驱动自动切换程序] 设备 $dev 已就绪!" > /dev/kmsg
|
||||
TTY_DEVICE="$dev"
|
||||
break 2
|
||||
log() {
|
||||
local message="[radar-driver-switch] $*"
|
||||
if [ -w /dev/kmsg ]; then
|
||||
printf '%s\n' "$message" > /dev/kmsg
|
||||
else
|
||||
printf '%s\n' "$message"
|
||||
fi
|
||||
}
|
||||
|
||||
load_driver() {
|
||||
local driver="$1"
|
||||
case "$driver" in
|
||||
cdc_acm)
|
||||
modprobe cdc_acm 2>/dev/null || true
|
||||
;;
|
||||
usb_ch343)
|
||||
modprobe ch343 2>/dev/null || true
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
driver_path() {
|
||||
printf '%s/%s\n' "$DRIVER_ROOT" "$1"
|
||||
}
|
||||
|
||||
require_driver() {
|
||||
local driver="$1"
|
||||
local path
|
||||
path="$(driver_path "$driver")"
|
||||
if [ ! -d "$path" ]; then
|
||||
log "error: driver path missing: $path"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
collect_interfaces() {
|
||||
local port="$1"
|
||||
shopt -s nullglob
|
||||
INTERFACES=(/sys/bus/usb/devices/"${port}":*)
|
||||
shopt -u nullglob
|
||||
[ "${#INTERFACES[@]}" -gt 0 ]
|
||||
}
|
||||
|
||||
wait_for_interfaces() {
|
||||
local label="$1"
|
||||
local port="$2"
|
||||
local attempt=0
|
||||
while [ "$attempt" -le "$MAX_WAIT_SECONDS" ]; do
|
||||
if collect_interfaces "$port"; then
|
||||
return 0
|
||||
fi
|
||||
log "waiting for $label port $port interfaces (${attempt}s)"
|
||||
sleep "$WAIT_INTERVAL_SECONDS"
|
||||
attempt=$((attempt + WAIT_INTERVAL_SECONDS))
|
||||
done
|
||||
log "error: timed out waiting for $label port $port interfaces"
|
||||
exit 1
|
||||
}
|
||||
|
||||
current_driver() {
|
||||
local iface="$1"
|
||||
local target
|
||||
target="$(readlink -f "$iface/driver" 2>/dev/null || true)"
|
||||
if [ -n "$target" ]; then
|
||||
basename "$target"
|
||||
fi
|
||||
}
|
||||
|
||||
unbind_from_current_driver() {
|
||||
local iface="$1"
|
||||
local iface_name
|
||||
local driver
|
||||
iface_name="$(basename "$iface")"
|
||||
driver="$(current_driver "$iface")"
|
||||
if [ -z "$driver" ]; then
|
||||
return 0
|
||||
fi
|
||||
if [ ! -w "$(driver_path "$driver")/unbind" ]; then
|
||||
log "error: cannot unbind $iface_name from $driver"
|
||||
exit 5
|
||||
fi
|
||||
printf '%s\n' "$iface_name" > "$(driver_path "$driver")/unbind"
|
||||
log "unbound $iface_name from $driver"
|
||||
}
|
||||
|
||||
bind_to_driver() {
|
||||
local iface="$1"
|
||||
local driver="$2"
|
||||
local iface_name
|
||||
local bind_path
|
||||
iface_name="$(basename "$iface")"
|
||||
bind_path="$(driver_path "$driver")/bind"
|
||||
if [ ! -w "$bind_path" ]; then
|
||||
log "error: cannot bind $iface_name to $driver"
|
||||
exit 6
|
||||
fi
|
||||
if printf '%s\n' "$iface_name" > "$bind_path" 2>/dev/null; then
|
||||
log "bound $iface_name to $driver"
|
||||
else
|
||||
log "warning: $iface_name did not bind to $driver"
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_port_bound() {
|
||||
local label="$1"
|
||||
local port="$2"
|
||||
local desired_driver="$3"
|
||||
local iface
|
||||
local iface_name
|
||||
local driver
|
||||
local bound_count=0
|
||||
|
||||
wait_for_interfaces "$label" "$port"
|
||||
|
||||
for iface in "${INTERFACES[@]}"; do
|
||||
iface_name="$(basename "$iface")"
|
||||
driver="$(current_driver "$iface")"
|
||||
if [ "$driver" = "$desired_driver" ]; then
|
||||
log "$label $iface_name already uses $desired_driver"
|
||||
bound_count=$((bound_count + 1))
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ -n "$driver" ]; then
|
||||
unbind_from_current_driver "$iface"
|
||||
sleep 0.2
|
||||
fi
|
||||
|
||||
bind_to_driver "$iface" "$desired_driver"
|
||||
sleep 0.2
|
||||
driver="$(current_driver "$iface")"
|
||||
if [ "$driver" = "$desired_driver" ]; then
|
||||
bound_count=$((bound_count + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${MAX_WAIT_SECONDS} -gt 0 ]; then
|
||||
current_time=$(cut -d. -f1 /proc/uptime)
|
||||
elapsed_seconds=$((current_time - start_time))
|
||||
if [ ${elapsed_seconds} -ge ${MAX_WAIT_SECONDS} ]; then
|
||||
echo "[雷达驱动自动切换程序] 错误:等待 ${TTY_DEVICE} 超时(${MAX_WAIT_SECONDS}秒)!" > /dev/kmsg
|
||||
exit 1
|
||||
fi
|
||||
echo "[雷达驱动自动切换程序] 仍在等待${TTY_DEVICE}(已等待${elapsed_seconds}秒)..." > /dev/kmsg
|
||||
if [ "$bound_count" -eq 0 ]; then
|
||||
log "error: no $label interface on $port is bound to $desired_driver"
|
||||
exit 7
|
||||
fi
|
||||
sleep ${CHECK_INTERVAL}
|
||||
done
|
||||
}
|
||||
|
||||
# ── 2. 确认 CH343 驱动已加载 ────────────────────────
|
||||
if [ -d "${USB_CH343_PATH}" ]; then
|
||||
echo "[雷达驱动自动切换程序] CH343驱动已加载,继续..." > /dev/kmsg
|
||||
else
|
||||
echo "[雷达驱动自动切换程序] 错误:未找到CH343驱动!" > /dev/kmsg
|
||||
exit 2
|
||||
fi
|
||||
main() {
|
||||
load_driver "$RADAR_DRIVER"
|
||||
load_driver "$IMU_DRIVER"
|
||||
require_driver "$RADAR_DRIVER"
|
||||
require_driver "$IMU_DRIVER"
|
||||
|
||||
# ── 3. 通过物理端口定位雷达 CH34x ───────────────────
|
||||
radar_sysfs="/sys/bus/usb/devices/${RADAR_USB_PORT}"
|
||||
ensure_port_bound "RADAR" "$RADAR_PORT" "$RADAR_DRIVER"
|
||||
ensure_port_bound "IMU" "$IMU_PORT" "$IMU_DRIVER"
|
||||
|
||||
if [ ! -d "${radar_sysfs}" ]; then
|
||||
echo "[雷达驱动自动切换程序] 错误:端口 ${RADAR_USB_PORT} 上无设备!" > /dev/kmsg
|
||||
exit 3
|
||||
fi
|
||||
udevadm settle --timeout=5 2>/dev/null || true
|
||||
log "done; serial devices: $(ls /dev/ttyACM* /dev/ttyCH343USB* 2>/dev/null | tr '\n' ' ')"
|
||||
}
|
||||
|
||||
vendor_id=$(cat "${radar_sysfs}/idVendor" 2>/dev/null)
|
||||
product_id=$(cat "${radar_sysfs}/idProduct" 2>/dev/null)
|
||||
|
||||
if [ "${vendor_id}" != "1a86" ] || [ "${product_id}" != "55d4" ]; then
|
||||
echo "[雷达驱动自动切换程序] 错误:端口 ${RADAR_USB_PORT} 上 VID:PID=${vendor_id}:${product_id},非雷达CH34x!" > /dev/kmsg
|
||||
exit 3
|
||||
fi
|
||||
|
||||
echo "[雷达驱动自动切换程序] 雷达确认位于端口 ${RADAR_USB_PORT},VID:PID=${vendor_id}:${product_id}" > /dev/kmsg
|
||||
|
||||
# ── 4. 查找 cdc_acm 下雷达的接口 ────────────────────
|
||||
cdc_acm_sub_addr=$(ls "${CDC_ACM_PATH}" 2>/dev/null | grep "^${RADAR_USB_PORT}:" | head -n 1)
|
||||
|
||||
if [ -z "${cdc_acm_sub_addr}" ]; then
|
||||
echo "[雷达驱动自动切换程序] 错误:cdc_acm驱动中未找到端口 ${RADAR_USB_PORT} 的接口" > /dev/kmsg
|
||||
exit 4
|
||||
fi
|
||||
|
||||
echo "[雷达驱动自动切换程序] 雷达 cdc_acm 接口:${cdc_acm_sub_addr}" > /dev/kmsg
|
||||
|
||||
# ── 5. 解绑 cdc_acm ─────────────────────────────────
|
||||
echo "${cdc_acm_sub_addr}" | sudo tee "${CDC_ACM_PATH}/unbind" > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "[雷达驱动自动切换程序] 已解绑 cdc_acm:${cdc_acm_sub_addr}" > /dev/kmsg
|
||||
else
|
||||
echo "[雷达驱动自动切换程序] 错误:解绑 cdc_acm 失败" > /dev/kmsg
|
||||
exit 5
|
||||
fi
|
||||
|
||||
# ── 6. 绑定 ch343 ───────────────────────────────────
|
||||
echo "${cdc_acm_sub_addr}" | sudo tee "${USB_CH343_PATH}/bind" > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "[雷达驱动自动切换程序] 已绑定 usb_ch343:${cdc_acm_sub_addr}" > /dev/kmsg
|
||||
else
|
||||
echo "[雷达驱动自动切换程序] 错误:绑定 usb_ch343 失败" > /dev/kmsg
|
||||
exit 6
|
||||
fi
|
||||
|
||||
echo "[雷达驱动自动切换程序] 雷达驱动切换完毕!" > /dev/kmsg
|
||||
exit 0
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user