计划

#!/bin/sh

HUB_GPIO=0
PHY_MODE=/sys/devices/platform/ff3e0000.usb2-phy/otg_mode
DWC3_MODE=/sys/kernel/debug/usb/ffb00000.usb/mode

mount_debugfs() {
	mountpoint -q /sys/kernel/debug 2>/dev/null && return 0
	mount -t debugfs none /sys/kernel/debug 2>/dev/null
}

set_host() {
	echo "设置 USB Host 模式..."

	mount_debugfs

	# 导出 Hub GPIO
	[ ! -d /sys/class/gpio/gpio${HUB_GPIO} ] && echo "$HUB_GPIO" > /sys/class/gpio/export 2>/dev/null
	echo out > /sys/class/gpio/gpio${HUB_GPIO}/direction 2>/dev/null

	# 断开 Hub 防止切换期间毛刺
	echo 0 > /sys/class/gpio/gpio${HUB_GPIO}/value 2>/dev/null
	sleep 1

	# PHY → host
	[ -e "$PHY_MODE" ] && echo host > "$PHY_MODE" 2>/dev/null

	# DWC3 控制器 → host
	[ -e "$DWC3_MODE" ] && echo host > "$DWC3_MODE" 2>/dev/null

	# 轮询等待 xHCI 控制器就绪(替代 sleep 3)
	for i in 1 2 3 4 5 6 7 8 9 10; do
		[ -d /sys/bus/usb/devices/usb1 ] && break
		sleep 1
	done

	# 接通 Camera Hub,USB 设备开始枚举
	echo 1 > /sys/class/gpio/gpio${HUB_GPIO}/value 2>/dev/null
	echo "Hub 已接通,USB 枚举开始"
}

case "$1" in
	start)  set_host ;;
	stop)   ;;
	restart|reload)  set_host ;;
	*) echo "Usage: $0 {start|stop|restart}"
	   exit 1 ;;
esac
exit 0

  1. 精简 S98lvgld(删除冗余 USB 切换代码,保留 UVC 等待)
#!/bin/sh

APP="/usr/lvgl_demo"
APP_NAME="lvgl_demo"

start() {
    chmod 755 "$APP" 2>/dev/null

    # 导出 GPIO(应用启动前一次性导出,后续直接操作 /sys/class/gpio/gpioN/value)
    for gpio in 2 4 40 97; do
        [ -d "/sys/class/gpio/gpio$gpio" ] || echo "$gpio" > /sys/class/gpio/export 2>/dev/null
    done

    # 修复被展平的软链接(构建系统产物)
    for lib in librockchip_mpp.so.1 librockit_full.so librockit.so; do
        [ -f "/usr/$lib" ] && [ ! -L "/usr/$lib" ] && rm -f "/usr/$lib"
    done

    # oem 分区库优先
    LD_LIBRARY_PATH="/oem/usr/lib:${LD_LIBRARY_PATH}"
    export LD_LIBRARY_PATH

    # 触发一次 DRM lastclose,将 fbdev 模式提交到硬件 CRTC
    : < /dev/dri/card0 2>/dev/null

    echo "Starting ${APP_NAME}..."
    cd /usr
    "$APP" &
}

stop() {
    PID=$(pidof "$APP_NAME" 2>/dev/null)
    if [ -n "$PID" ]; then
        echo "Stopping ${APP_NAME} (pid $PID)..."
        kill $PID 2>/dev/null
        sleep 1
        REMAINING=$(pidof "$APP_NAME" 2>/dev/null)
        [ -n "$REMAINING" ] && kill -9 $REMAINING 2>/dev/null || true
    fi
    echo "${APP_NAME} stopped"
}

status() {
    PID=$(pidof "$APP_NAME" 2>/dev/null)
    if [ -n "$PID" ]; then
        echo "${APP_NAME} is running (pid $PID)"
        return 0
    fi
    echo "${APP_NAME} is not running"
    return 1
}

case "$1" in
    start)   start   ;;
    stop)    stop    ;;
    restart) stop; sleep 1; start ;;
    status)  status  ;;
    *) echo "Usage: $0 {start|stop|restart|status}"; exit 1 ;;
esac