24. USB¶
本章配套视频介绍:

《26-鲁班猫USB-OTG功能切换》
https://www.bilibili.com/video/BV1Cs4y1e7Bc
下表为LubanCat-RK3562/RK3566/RK3568系列板卡的usb
板卡名 |
USB3.0 |
USB2.0 |
USB2.0-OTG |
---|---|---|---|
LubanCat-Zero系列 |
无 |
Type-C x 1 |
Type-C x 1 |
LubanCat-1 |
Type-A x 1 |
Type-A x 3 |
Type-C x 1 |
LubanCat-1N |
Type-A x 1 |
Type-A x 1 |
Type-C x 1 |
LubanCat-2 |
Type-A x 1 |
Type-A x 2 |
Type-C x 1 |
24.1. USB-OTG功能切换¶
usb设备是区分主从的,其中host是主设备 device是从设备。USB-otg则能够进行主从切换。
从设备,比如u盘,他只能被控制,不能主动去控制别的usb设备。而电脑的usb接口则作为主设备,可以控制从设备。
具有硬件切换电路:鲁班猫2 鲁班猫2N.
鲁班猫0/1系列未配备自动切换电路,是因为鲁班猫0/1系列的usb口和电源接口复用。使用电源供电时,不具备usb功能。使用电脑供电时,默认作为device设备。
24.1.1. 鲁班猫2系列手动切换¶
1 2 3 4 5 6 7 8 | #Force host mode 主机
echo host > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
#Force device mode 从机
echo peripheral > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
#Force otg mode 根据硬件识别自动切换
echo otg > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
|
24.1.2. 鲁班猫0/1系列手动切换¶
1 2 3 4 5 6 7 | #Force host mode 主机
echo host > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
#Force device mode 从机
echo peripheral > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
或
echo otg > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
|
24.1.3. 鲁班猫0/1系列otg使用host模式提示¶
鲁班猫0/1系列,鲁班猫0想要作为host主设备使用,可以手动切换。 但是一般来说从设备都是不带供电的,比如鼠标,键盘,U盘,都是要主设备去供电。 我们就需要解决鲁班猫的供电问题。
有两个供电方案:
是使用鲁班猫的40PIN排针的供电引脚对鲁班猫进行供电。(仅支持鲁班猫0/1系列)
使用type-c接口供电的同时,还可以使usb从设备连接到鲁班猫,具体实现方式如下
使用带独立供电的转接板或魔改usb线,使用外部电源同时给鲁班猫和usb从设备供电(魔改有风险,请慎重考虑)。
使用usbhub连接鲁班猫,然后给usbhub供电。usbhub是一个从设备(有些usbhub可能不支持该功能)。
24.2. USB-OTG配置功能(usb gadget)¶
24.2.1. 配置文件及参数¶
/etc/init.d/.usb_config 默认配置文件,系统启动时调用
/tmp/.usb_config 默认配置文件的复制文件,系统启动后优先级高于默认配置文件,重启后失效
/usr/bin/usbdevice 服务配置脚本,使用调用
/usr/bin/usbdevice {start|stop|restart}
24.2.2. 功能配置¶
可配置的功能
usb_adb_en - ADB 调试
usb_rndis_en - RNDIS USB模拟以太网
usb_acm_en - ACM USB虚拟串口
usb_ums_en - UMS 虚拟存储设备
usb_uac1_en - UAC 虚拟声卡
usb_uac2_en - UAC 虚拟声卡
24.2.3. ADB 调试¶
1 2 3 4 5 | #配置功能
echo usb_adb_en > /etc/init.d/.usb_config
#应用功能(使用下面的指令或者重启)
/usr/bin/usbdevice restart
|
24.2.4. RNDIS USB模拟以太网¶
24.2.4.1. 临时配置(重启后功能消失)¶
1 2 3 4 5 | #配置功能
echo usb_rndis_en > /tmp/.usb_config
#应用功能
/usr/bin/usbdevice restart
|
24.2.4.2. 永久配置¶
1 2 3 4 5 | #配置功能
echo usb_rndis_en > /etc/init.d/.usb_config
#应用功能(使用下面的指令或者重启)
/usr/bin/usbdevice restart
|
24.2.5. ACM USB虚拟串口¶
使能ACM后,可以在Device上看到/dev/ttyGS0设备,PC上看到/dev/ttyACM0设备
24.2.5.1. 临时配置(重启后功能消失)¶
1 2 3 4 5 | #配置功能
echo usb_acm_en > /tmp/.usb_config
#应用功能
/usr/bin/usbdevice restart
|
24.2.5.2. 永久配置¶
1 2 3 4 5 | #配置功能
echo usb_acm_en > /etc/init.d/.usb_config
#应用功能-使用下面的指令或者重启
/usr/bin/usbdevice restart
|
24.2.6. UMS 虚拟存储设备¶
将板卡文件系统中的一个分区或一个img镜像挂载到PC上
推荐使用img镜像挂载,使用以下配置自动生成img文件
1 2 3 4 5 6 7 8 9 | echo usb_ums_en > /tmp/.usb_config
# 配置挂载的镜像文件地址
echo "ums_block=/ums_shared.img" >> /tmp/.usb_config
# 设置镜像文件大小,单位为MB
echo "ums_block_size=8" >> /tmp/.usb_config
# 设置文件系统格式为fat
echo "ums_block_type=fat" >> /tmp/.usb_config
# 设置断开UMS后自动挂载到/mnt/ums目录
echo "ums_block_auto_mount=on" >> /tmp/.usb_config
|
24.2.6.1. 永久配置¶
1 2 3 4 5 6 7 8 9 | #配置功能
echo usb_ums_en > /etc/init.d/.usb_config
echo "ums_block=/ums_shared.img" >> /etc/init.d/.usb_config
echo "ums_block_size=8" >> /etc/init.d/.usb_config
echo "ums_block_type=fat" >> /etc/init.d/.usb_config
echo "ums_block_auto_mount=on" >> /etc/init.d/.usb_config
#应用功能(使用下面的指令或者重启)
/usr/bin/usbdevice restart
|
24.2.7. UAC 虚拟声卡¶
UAC通过USB虚拟标准PCM接口给Host设备,实现Device和Host之间音频互传功能。
UAC分为UAC1和UAC2,UAC2和UAC1有以下区别: UAC2比UAC1具有更高的带宽(各平台实现略有不同,以实测为准) Windows 7及部分Windows 10系统默认不支持UAC2,需要手动安装驱动,但都支持UAC1
24.2.7.1. 临时配置(重启后功能消失)¶
1 2 3 4 5 6 7 8 | #配置功能
echo usb_uac1_en > /tmp/.usb_config
#或
echo usb_uac2_en > /tmp/.usb_config
#应用功能
/usr/bin/usbdevice restart
|
24.2.7.2. 永久配置¶
1 2 3 4 5 6 7 8 | #配置功能
echo usb_uac1_en > /etc/init.d/.usb_config
#或
echo usb_uac2_en > /etc/init.d/.usb_config
#应用功能(使用下面的指令或者重启)
/usr/bin/usbdevice restart
|
24.2.8. UVC 图传¶
usb otg口实现UVC gadget,作为usb camara向windows传输图像,也即将usb uvc摄像头接到板卡usb接口,可以不通过网络推流,而是通过usb传输图像到电脑。
1、安装环境:
1 2 3 4 | sudo apt-get update
sudo apt-get install build-essential git python3-pip
sudo pip3 install meson==0.63
sudo pip3 install ninja
|
2、获取uvc-gadget源码并编译源码:
1 2 3 4 5 6 7 8 9 10 11 12 | #获取源码
git clone https://git.ideasonboard.org/uvc-gadget.git
#进入源码目录
cd uvc-gadget
#最新0.3.0版本依赖libcamara,回退到0.1.0版本
git checkout v0.1.0
#编译源码
meson build
ninja -C build
|
3、修改源码uvc-gadget/scripts/uvc-gadget.sh脚本,在脚本的180行添加以下内容:
如下图所示:

也即添加以下内容:
1 2 | umount /sys/kernel/config
mount -t configfs none /sys/kernel/config
|
修改源码uvc-gadget/scripts/uvc-gadget.sh脚本,第121行位置,调整摄像头分辨率,以下测试640*480分辨率,可根据实际修改:

uncompressed为未压缩图像分辨率,mjpeg为压缩图像分辨率。
提示
如果是运行后面步骤程序后想再修改分辨率,需修改后重启板卡才能重新设置分辨率。
4、接入USB UVC摄像头并查看摄像头编号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #查看摄像头设备
v4l2-ctl --list-devices
#信息输出如下
root@lubancat:~/uvc-gadget# v4l2-ctl --list-devices
rkisp-statistics (platform: rkisp):
/dev/video8
/dev/video9
rkisp_mainpath (platform:rkisp-vir0):
/dev/video0
/dev/video1
/dev/video2
/dev/video3
/dev/video4
/dev/video5
/dev/video6
/dev/video7
/dev/media0
USB camera: USB camera (usb-fd800000.usb-1):
/dev/video10
/dev/video11
/dev/media1
|
从以上信息输出可以看到,此处USB camera为/dev/video10
5、运行测试
运行前确认usb otg口通过usb线和电脑连接,usb uvc摄像头正确接入板卡和识别,以下摄像头编号需根据实际确定。
1 2 3 4 5 6 7 | #停止当前usbdevice的配置,避免冲突
/usr/bin/usbdevice stop
#进入uvc-gadget源码目录并运行
cd uvc-gadget
./scripts/uvc-gadget.sh start
./build/src/uvc-gadget -c /dev/video10 &
|
如果配置正常,相关信息输出如下图所示:

电脑端打开设备管理器找到照相机可以看到识别出UVC Camara设备,可以通过OBS或者AMCap等软件打开设备。
