修改设备树支持usb

# /delete-node/ vcc5v0-usb; 注释这个 “删除节点”
#/delete-node/ usb;
# 恢复 USB 引脚控制
&pinctrl {
	usb {
		usb_pwren: usb-pwren {
			rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
};
#恢复 VBUS 供电到 USB PHY
&u2phy_otg {
	vbus-supply = <&vcc5v0_usb>;
	status = "okay";
};
#USB 为 otg 模式
&usbdrd_dwc3 {
	dr_mode = "otg";
};

内核-开启UVC驱动支持

# 开启 USB Video Class 驱动(连接 UVC 摄像头)
CONFIG_MEDIA_SUPPORT=y
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_VIDEO_CLASS=y
CONFIG_V4L_PLATFORM_DRIVERS=y

# 如果需要其他 USB HID 设备(键盘鼠标)
CONFIG_USB_HID=y
CONFIG_HID_GENERIC=y

查看测试

由于外接了usb切换芯片,一路usb转成两路。

引脚:GPIO0_A0_z

echo 0 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio0/direction
echo 1 > /sys/class/gpio/gpio0/value
  • usb移除测试
# ls /sys/bus/usb/devices/udhcpc: sending discover
2-0:1.0  1-1:1.0  usb2     1-0:1.0  1-1      1-1:1.1  usb1

# echo 0 > /sys/class/gpio/gpio0/value
# [  284.664998] usb 1-1: USB disconnect, device number 2

  • 查看v4l2设备
# 列出所有 video 设备
ls -la /dev/video*

# 查看 v4l2 设备
cat /sys/class/video4linux/*/name
# ls -la /dev/video*
crw-rw----    1 root     video      81,  24 /dev/video21
crw-rw----    1 root     video      81,  20 /dev/video20

# cat /sys/class/video4linux/*/name
HikCamera: UVC Camera
HikCamera: UVC Camera
  • 查看连接的usb设备
# ls /sys/bus/usb/devices
2-0:1.0  1-1:1.0  usb2     1-0:1.0  1-1      1-1:1.1  usb1

USB模式切换

写的内容实际模式
hostHost(主机)
deviceDevice/Peripheral(设备)
otgOTG(自动识别)
# find /sys -name "mode" -path "*usb*" 2>/dev/null
/sys/kernel/debug/usb/ffb00000.usb/mode
echo device /sys/kernel/debug/usb/ffb00000.usb/mode
echo host /sys/kernel/debug/usb/ffb00000.usb/mode

切换为host模式(主机模式)

  • 方式一:lvgl程序自动切换

  • 方式二:

    # 1. 导出GPIO 0
    echo 0 > /sys/class/gpio/export
    # 2. 设置GPIO方向为输出
    echo out > /sys/class/gpio/gpio0/direction
    
    # 正确的 USB → Host 切换顺序:
    # ★ 先切 PHY # 再切 DWC3  # 最后切路由
    echo host > /sys/devices/platform/ff3e0000.usb2-phy/otg_mode
    echo host > /sys/kernel/debug/usb/ffb00000.usb/mode
    echo 0 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio0/direction
    echo 1 > /sys/class/gpio/gpio0/value
    
    # 切换摄像头(可以同步执行)
    echo 1 > /sys/class/gpio/gpio0/value
    echo host > /sys/devices/platform/ff3e0000.usb2-phy/otg_mode
    echo host > /sys/kernel/debug/usb/ffb00000.usb/mode
    

切换为device模式(设备模式)

  • 方式一:lvgl程序自动切换

  • 方式二:

    # 1. 导出GPIO 0
    echo 0 > /sys/class/gpio/export
    # 2. 设置GPIO方向为输出
    echo out > /sys/class/gpio/gpio0/direction
    
    #切换adb功能(分开下执行,要一定间隔)
    echo 0 > /sys/class/gpio/gpio0/value
     #分开执行
    echo device > /sys/kernel/debug/usb/ffb00000.usb/mode
    #分开执行
    echo "" > /sys/kernel/config/usb_gadget/rockchip/UDC 2>/dev/null
    UDC=$(ls /sys/class/udc/)
    echo $UDC > /sys/kernel/config/usb_gadget/rockchip/UDC
    
    
  • 方式三:

    使用 S50usbdevice脚本(sdk的adb功能开启后自带)

    #usb hub切换到外置usb
    echo 0 > /sys/class/gpio/gpio0/value
    #模式切换
    echo device > /sys/kernel/debug/usb/ffb00000.usb/mode
    /etc/init.d/S50usbdevice stop     #报错也没事,甚至可以
    /etc/init.d/S50usbdevice start
    
    
    echo 0 > /sys/class/gpio/gpio0/value && echo device > /sys/kernel/debug/usb/ffb00000.usb/mode && /etc/init.d/S50usbdevice stop && /etc/init.d/S50usbdevice start
    

S50脚本改版后

echo "usb_adb_en" >> /tmp/.usb_config

echo 0 > /sys/class/gpio/gpio0/value

echo "usb_ums_en" >> /tmp/.usb_config
/etc/init.d/S50usbdevice restart

UMS模式

# 1. 停止自动恢复服务
killall usbd 2>/dev/null
killall adbd 2>/dev/null

# 2. 切 Device 模式
echo device > /sys/kernel/debug/usb/ffb00000.usb/mode

# 3. 解绑当前 Gadget
echo "" > /sys/kernel/config/usb_gadget/rockchip/UDC

# 4. 清理旧 Function
rm -f /sys/kernel/config/usb_gadget/rockchip/configs/c.1/f1
rm -f /sys/kernel/config/usb_gadget/rockchip/configs/c.1/f2

# 5. 创建 mass_storage 目录
mkdir -p /sys/kernel/config/usb_gadget/rockchip/functions/mass_storage.0/lun.0

# 6. 关键:先清空旧绑定(解决 Device or resource busy)
echo "" > /sys/kernel/config/usb_gadget/rockchip/functions/mass_storage.0/lun.0/file

# 7. 绑定 SD 卡
echo /dev/mmcblk1p1 > /sys/kernel/config/usb_gadget/rockchip/functions/mass_storage.0/lun.0/file

# 8. 设置可读写
echo 0 > /sys/kernel/config/usb_gadget/rockchip/functions/mass_storage.0/lun.0/ro

# 9. 链接到配置
ln -s /sys/kernel/config/usb_gadget/rockchip/functions/mass_storage.0 /sys/kernel/config/usb_gadget/rockchip/configs/c.1/f1

# 10. 激活(ffb00000.usb 从日志确认)
echo ffb00000.usb > /sys/kernel/config/usb_gadget/rockchip/UDC