根据需求,以下是区分USB连接类型并自动切换模式的解决方案:
通过USB角色或电源状态判断当前连接的是电脑(数据连接)还是电源(仅充电)。
确定USB角色节点
检查是否存在 /sys/class/usb_role/ 下的节点,例如:
cat /sys/class/usb_role/usb-role-switch/role若输出 device 表示作为USB设备(连接电脑),host 表示作为主机(连接电源或外设)。
编写udev规则监控角色变化
创建文件 /etc/udev/rules.d/99-usb-role.rules:
ACTION=="change", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", RUN+="/path/to/detect_usb_mode.sh"然后编写脚本 detect_usb_mode.sh:
#!/bin/bash
ROLE=$(cat /sys/class/usb_role/usb-role-switch/role)
if [ "$ROLE" = "device" ]; then
# 连接到电脑,启动UVC
/canaan-camera.sh start otg0
elif [ "$ROLE" = "host" ]; then
# 检查是否仅充电(无数据设备)
if [ $(cat /sys/class/power_supply/usb/online) -eq 1 ]; then
# 启动显示屏播放
echo "Starting display..."
fi
fiupower 或检查 /sys/class/power_supply/ 下的节点判断是否充电。同时检查是否有新USB设备接入:# 检查是否充电
if grep -q "Charging" /sys/class/power_supply/battery/status; then
# 进一步检查是否有数据设备
if ! lsusb | grep -q "Device"; then
# 仅充电,启动显示屏
else
# 数据连接,切换为Device模式
fi
fi手动切换模式
连接到电脑时需运行脚本切换为Device模式:
./canaan-camera.sh start otg0 # 启动UVC摄像头断开后恢复Host模式可能需要运行:
./canaan-camera.sh stop otg0 # 停止UVC服务自动化建议
创建systemd服务或使用cron监控USB状态,自动执行上述脚本。
/sys/class/usb_role/)判断当前模式。通过上述方法,可以实现插入电脑时自动启用UVC摄像头,插入电源时使用显示屏播放。
举报
更多回帖