修改设备树支持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模式切换
| 写的内容 | 实际模式 |
|---|---|
host | Host(主机) |
device | Device/Peripheral(设备) |
otg | OTG(自动识别) |
# 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