4.3.18. USB/USB Gadget调试指南
4.3.18.1. 概述
X5 内置
USB 2.0 OTG
支持 Host 模式
和 Device 模式 兼容性
标准: USB 通用 串行总线 规范 (USB Specification Revision 2.0) 支持
高速 (HS), 全速 (FS), 和 低速 (LS) 模式 支持 LS 模式
下 的 Keep-Alive 特性,以及 HS/FS 模式 下 使用 (micro-)SOF (Start of Frame) 信号 硬件
支持 总线 级 和 数据包 级 的 错误处理
USB 3.0 OTG
支持 Host 模式
和 Device 模式 兼容性
标准: USB 通用 串行总线 规范 (USB Specification Revision 3.0) 支持
超高速 (SS), 高速 (HS), 全速 (FS), 和 低速 (LS) 模式 支持 PIPE3 PHY (125/250/500 MHz)
支持 LS 模式
下 的 Keep-Alive 特性,以及 HS/FS 模式 下 使用 (micro-)SOF (Start of Frame) 信号 硬件
支持 总线 级 和 数据包 级 的 错误处理
相关术语
| 术语 | 说明 |
|---|---|
| USB | Universal Serial Bus, 通用 |
| Gadget | 配件 |
| HCD | Host Controller Driver,主机 |
| UDC | USB Device Controller, USB 设备 |
| HCI | Host Controller Interface,主机 |
| EHCI | Enhanced Host Controller Interface,增强型 |
| OHCI | Open Host Controller Interface,开放式 |
| ADB | Android Debug Bridge,Android 调试 |
| HID | Human Interface Device,人机接口 |
| Rndis | Remote NDIS,远程 NDIS |
| ECM | Ethernet Networking Control Model |
| ACM | Abstract Control Model |
| MSD | Mass Storage Device,大容量 |
| UVC | USB video class |
| UAC | USB Audio class |
4.3.18.2. 功能描述
典型应用
USB Gadget 是
USB Gadget 的
总之,USB Gadget 提供
功能原理
USB Gadget 驱动

在 USB Gadget 框架
USB Function Driver
USB Function Driver 负责实现 设备 的 具体 功能。它 定义 了 USB 设备 在 连接 到 主机 时 的 行为 和 功能,例如 虚拟 串口、USB 存储、网络适配器 等。每个 USB Gadget 设备 通常 会 有 一个 或 多个 功能 驱动,表示 设备 所 支持 的 不同 功能。 configfs
configfs 是一个 用户 空间 接口,通过 文件系统 的 方式 让 用户 动态 配置 USB 设备。configfs 提供 了 一个 非常灵活 的 方式 来 设置 USB Gadget 设备 的 各种 参数,包括 设备 描述符、配置、接口 以及 功能。 UDC Driver
UDC 驱动(USB Device Controller Driver)是与 硬件 USB 控制器 交互 的 驱动程序,负责管理 USB 设备 的 物理 连接 和 数据传输。它 充当 USB 控制器 的 底层 接口,与 USB 设备 的 硬件 层面 交互。
4.3.18.3. 代码分析
USB Gadget 驱动
内核选项
内核
CONFIG_USB_GADGET
CONFIG_USB_CONFIGFS
USB Gadget 功能
CONFIG_USB_CONFIGFS_SERIAL
CONFIG_USB_CONFIGFS_ACM
CONFIG_USB_CONFIGFS_OBEX
CONFIG_USB_CONFIGFS_NCM
CONFIG_USB_CONFIGFS_ECM
CONFIG_USB_CONFIGFS_ECM_SUBSET
CONFIG_USB_CONFIGFS_RNDIS
CONFIG_USB_CONFIGFS_EEM
CONFIG_USB_CONFIGFS_MASS_STORAGE
CONFIG_USB_CONFIGFS_F_LB_SS
CONFIG_USB_CONFIGFS_F_FS
CONFIG_USB_CONFIGFS_F_UAC1
CONFIG_USB_CONFIGFS_F_UAC2
CONFIG_USB_CONFIGFS_F_HID
CONFIG_USB_CONFIGFS_F_UVC
驱动代码
USB 驱动
.
├── Kconfig
├── Makefile
├── core // USB 子系统核心代码
├── dwc3 // USB 控制器 dwc3 驱动程序
└── gadget // gadget 目录包含了与 USB gadget 相关驱动,实现了 USB Gadge 功能(如存储设备、串口、网络适配器等)
├── Kconfig
├── Makefile
├── composite.c // 创建和管理 USB 复合设备
├── config.c
├── configfs.c // configfs 文件系统源码
├── configfs.h
├── function // USB 设备端功能驱动程序,实现不同类型的 USB 设备功能
│ ├── Makefile
│ ├── f_acm.c
│ ├── f_ecm.c
│ ├── f_eem.c
│ ├── f_fs.c
│ ├── f_hid.c
│ ├── f_loopback.c
│ ├── f_mass_storage.c
│ ├── f_mass_storage.h
│ ├── f_midi.c
│ ├── f_ncm.c
│ ├── f_obex.c
│ ├── f_phonet.c
│ ├── f_printer.c
│ ├── f_rndis.c
│ ├── f_serial.c
│ ├── f_sourcesink.c
│ ├── f_subset.c
│ ├── f_tcm.c
│ ├── f_uac1.c
│ ├── f_uac1_legacy.c
│ ├── f_uac2.c
│ ├── f_uvc.c
│ ├── f_uvc.h
│ ├── g_zero.h
│ ├── ndis.h
│ ├── rndis.c
│ ├── rndis.h
│ ├── storage_common.c
│ ├── storage_common.h
│ ├── tcm.h
│ ├── u_audio.c
│ ├── u_audio.h
│ ├── u_ecm.h
│ ├── u_eem.h
│ ├── u_ether.c
│ ├── u_ether.h
│ ├── u_ether_configfs.h
│ ├── u_fs.h
│ ├── u_gether.h
│ ├── u_hid.h
│ ├── u_midi.h
│ ├── u_ncm.h
│ ├── u_phonet.h
│ ├── u_printer.h
│ ├── u_rndis.h
│ ├── u_serial.c
│ ├── u_serial.h
│ ├── u_tcm.h
│ ├── u_uac1.h
│ ├── u_uac1_legacy.c
│ ├── u_uac1_legacy.h
│ ├── u_uac2.h
│ ├── u_uvc.h
│ ├── uac_common.h
│ ├── uvc.h
│ ├── uvc_configfs.c
│ ├── uvc_configfs.h
│ ├── uvc_queue.c
│ ├── uvc_queue.h
│ ├── uvc_v4l2.c
│ ├── uvc_v4l2.h
│ ├── uvc_video.c
│ └── uvc_video.h
├── functions.c // 创建和管理 USB Function
├── udc // UDC 驱动程序
└── usbstring.c // 创建和管理 USB 设备字符串描述符
USB Gadget 脚本
usb-gadget.sh脚本配置流程
usb-gadget.sh 脚本/etc/init.d/usb-gadget.sh,主要
根据
预设 的 USB 配置文件,初始化 USB Gadget 驱动 配置 USB 复合
设备 的 功能 描述符,并 通过 CONFIGFS 接口 将 这些 配置 应用 到 系统 中 启用 USB 复合
设备 功能
usb-gadget.sh 的
USB 单一
设备,包括 ADB / Rndis / ECM / HID / ACM /MSD / UVC / UAC USB 复合
设备,即 通过 同一 USB 设备 同时 支持 多种 设备 功能
Usage: /etc/init.d/usb-gadget.sh {start|stop|restart} [options]
options:
detail gadget-composite config, using .usb/.default-config in default
adb launch adbd
msd run as gadget mass storage device
msd-ram run as gadget mass storage device(with ddr storage)
hid run as hid gadget
rndis run as rndis gadget
ecm run as cdc ether gadget
uvc run as uvc gadget
uac1 usb audio class specification 1
uac2 usb audio class specification 2
uvc-hid uvc + hid composite gadget
uvc-uac1 uvc + uac1 composite gadget
uvc-uac2 uvc + uac2 composite gadget
uvc-hid-uac1 uvc + hid + uac1 composite gadget
uvc-hid-uac2 uvc + hid + uac2 composite gadget
uvc-rndis uvc + rndis composite gadget
uvc-ecm uvc + cdc ether composite gadget
uvc-acm uvc + acm(serial) composite gadget
uvc-rndis-uac1 uvc + rndis + uac1 composite gadget
uvc-rndis-uac2 uvc + rndis + uac2 composite gadget
uvc-ecm-uac1 uvc + ecm + uac1 composite gadget
uvc-ecm-uac2 uvc + ecm + uac2 composite gadget
rndis-hid rndis + hid composite gadget
rndis-uac1 rndis + uac1 composite gadget
msd-uac1 msd + uac1 composite gadget
hid-uac1 hid + uac1 composite gadget
uvc-adb uvc + adb composite gadget
usb-gadget.sh 脚本
挂载 configfs,configfs 提供
了 一个 用户 空间 接口,用于 配置 USB 复合 设备 创建 USB Gadget 目录:实例
化 一个 新 的 USB Gadget 设备。 配置 USB Gadget 信息:设置 USB 设备
的 配置,包括 厂商 ID (VID)、产品 ID (PID)、设备 描述符 等 基本 信息 创建
并 配置 USB 功能:根据 所 需 的 设备 功能(如 虚拟 串口、存储、网络 等),创建 并 配置 相应 的 USB 功能 绑定 USB 配置
与 功能:将 配置文件 和 功能 进行 关联,完成 设备 功能 配置 启用 USB 控制器:启动
并 使 能 USB 控制器,开始 与 主机 进行 通信
start_usb_gadget()
{
echo "Creating the USB gadget"
# 加载 libcomposite 驱动,usb gadget 依赖 libcomposite 模块
echo "Loading composite module"
modprobe libcomposite
# 挂载 configfs
echo "Mount ConfigFS and create Gadget"
CONFIGFS_MOUNT_POINT=$(mount | grep configfs | awk '{ print $3 }')
echo "configfs mount point: " ${CONFIGFS_MOUNT_POINT}
if [[ -n ${CONFIGFS_MOUNT_POINT} ]]; then
echo "Configfs already mounted..."
else
mount -t configfs none /sys/kernel/config
fi
# 创建 USB Gadget
echo "Creating gadget directory g_comp"
mkdir -p $USB_CONFIGFS
cd $USB_CONFIGFS
if [ $? -ne 0 ]; then
echo "Error creating usb gadget in configfs"
exit 1
else
echo "OK"
fi
# 创建并配置 USB Gadget configuration
echo "init configfs..."
configfs_init
# 配置 USB Function
echo "Init functions..."
function_init
echo "OK"
# 将 USB configuration 与 Function 绑定
echo "Bind functions..."
bind_functions
# 加载 USB Function 所需的后台程序
echo "Pre run userspace daemons(eg. adb)..."
pre_run_binary
# just with userspace daemon, needs to wait some time.
echo "waiting"
for i in `seq 0 $?`
do
echo "."
sleep 0.1
done
echo "OK"
# 使能 UDC
echo "Binding USB Device Controller"
echo $UDC > UDC
echo peripheral > $UDC_ROLE
cat $UDC_ROLE
echo "OK"
echo "Run some userspace daemons(eg. usb_camera)..."
run_binary
}
通过 configfs_init() 配置 USB Gadget 设备
configfs_init()
{
# 配置 USB PID/VID
echo "Setting Vendor and Product ID's"
echo $USB_VID > idVendor
echo $USB_PID > idProduct
echo "OK"
if $USE_RNDIS; then
echo 0100 > bcdDevice # v1.0.0, otherwise win10 rndis couldn't install
fi
# 配置 USB 设备类
if $IS_MULTI_FUNC; then
echo "Setting Multi-func Gadget for Windows"
echo 0xEF > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
elif $USE_UAC1; then
echo 0xEF > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
else
echo "single function gadget"
if $USE_RNDIS; then
echo 0x02 > bDeviceClass # same with legacy/ether.c
fi
fi
# 配置 USB 字符串描述符
echo "Setting English strings"
mkdir -p strings/0x409
echo $SERIAL > strings/0x409/serialnumber # 序列号
echo $MANUF > strings/0x409/manufacturer # 产商
echo $PRODUCT > strings/0x409/product # 设备型号
echo "OK"
# 创建 USB 配置
echo "Creating Config"
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
echo "Conf 1" > configs/c.1/strings/0x409/configuration
echo 0xC0 > configs/c.1/bmAttributes
echo 0x01 > configs/c.1/MaxPower
}
4.3.18.4. USB Gadget 功能使用
ADB (Android Debug Bridge)
ADB(Android Debug Bridge) 是
代码分析
通过 create_adb() 函数
create_adb()
{
CONFIG=$1
FUNCTION=$2
echo "Creating ADB gadget functionality"
mkdir functions/$FUNCTION
ln -s functions/$FUNCTION configs/c.1
}
USB ADB 功能
mkdir -p /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb # 挂载 FunctionFS 文件系统
start-stop-daemon -S -b -q -n adbd -a /usr/bin/adbd # 启动 ADBD 后台服务
使用方法
板端
/etc/init.d/usb-gadget.sh restart adb
USB ADB 使用
Rndis 网卡
RNDIS(Remote Network Driver Interface Specification) 是
代码分析
通过 create_rndis() 创建 USB Rndis Function
create_rndis configs/c.1 rndis.0
create_rndis()
{
CONFIG=$1
FUNCTION=$2
echo "Creating RNDIS gadget functionality"
mkdir functions/$FUNCTION # 创建 USB Rndis Function 目录
mkdir -p os_desc
echo 1 > os_desc/use
echo 0xcd > os_desc/b_vendor_code
echo MSFT100 > os_desc/qw_sign
mkdir -p functions/$FUNCTION/os_desc/interface.rndis # 创建 Rndis 目录,用于存储 Rndis 相关的设备描述信息
echo RNDIS > functions/$FUNCTION/os_desc/interface.rndis/compatible_id # 写入 Rndis 协议标识符
echo 5162001 > functions/$FUNCTION/os_desc/interface.rndis/sub_compatible_id # 设置 Rndis 兼容ID与设备版本
ln -s functions/$FUNCTION configs/c.1 # 将 Rndis Function 与 config 绑定一起
ln -s configs/c.1/ os_desc
}
其他
dev_addr 设置
网卡 MAC 地址
例如:echo "00:11:22:33:44:55" > functions/$FUNCTION/dev_addr
使用方法
板端
/etc/init.d/usb-gadget.sh restart rndis
USB Rndis 使用
ECM 网卡
ECM(Ethernet Control Model) 是
代码分析
通过 create_ecm() 创建 USB ECM Function
create_ecm()
{
CONFIG=$1
FUNCTION=$2
echo "Creating CDC ECM gadget functionality"
mkdir functions/$FUNCTION # 创建 USB ECM Function 目录
ln -s functions/$FUNCTION configs/c.1 # 将 ECM Function 与 config 绑定一起
}
使用方法
板端
/etc/init.d/usb-gadget.sh restart ecm
USB ECM 使用
MSD (Mass Storage Device)
MSD(Mass Storage Device)是
代码分析
MSD 需要
BSP源码$MSD_FILE 和 $MSD_BLOCK_SIZE。
使用
文件系统 镜像 作为 存储 源
| 镜像 |
镜像 |
挂载 |
文件系统 |
|---|---|---|---|
/userdata/mass_storage.img |
128M | /media/mass_storage |
FAT32 |
执行命令
/etc/init.d/usb-gadget.sh restart msd
使用 ramfs 镜像
作为 存储 源
| 镜像 |
镜像 |
挂载 |
文件系统 |
|---|---|---|---|
/dev/shm/msd_ram.img |
512M | /media/mass_storage |
FAT32 |
执行命令
/etc/init.d/usb-gadget.sh restart msd-ram
使用方法
Host 端

对比
源目录
root@buildroot:/media/mass_storage# ls -al
total 11282
drwxr-xr-x 3 root root 16384 Jan 1 00:00 .
drwxrwxrwt 3 root root 60 Jan 1 00:00 ..
-rwxr-xr-x 1 root root 0 Jan 1 1980 file1
-rwxr-xr-x 1 root root 1048576 Jan 1 1980 file2
-rwxr-xr-x 1 root root 10485760 Jan 1 1980 file3
drwxr-xr-x 2 root root 2048 Jan 1 1980 folder
Host 端

HID (Human Interface Device)
USB HID(Human Interface Device) 是 USB 协议
代码分析
HID 设备/etc/init.d/hid_report_desc.bin,用户
报告
create_hid()
{
CONFIG=$1
FUNCTION=$2
echo "Creating HID gadget functionality"
mkdir functions/$FUNCTION
echo 1 > functions/$FUNCTION/protocol
echo 1 > functions/$FUNCTION/subclass
echo 1024 > functions/$FUNCTION/report_length # 设置 HID report 长度
cat $HID_REPORT_DESC > functions/$FUNCTION/report_desc # 设置 HID 报告描述符,用于设置 HID report 格式
ln -s functions/$FUNCTION configs/c.1
echo "OK"
}
使用方法
板端
/etc/init.d/usb-gadget.sh restart hid
Host 端

ACM 串口
ACM (Abstract Control Model) 是USB通信
代码分析
create_acm()
{
CONFIG=$1
FUNCTION=$2
echo "Creating ACM gadget functionality"
mkdir functions/$FUNCTION # 创建 USB ACM Function 目录
ln -s functions/$FUNCTION configs/c.1 # 创建 USB ACM Function 目录
}
使用方法
板端
/etc/init.d/usb-gadget.sh restart acm
板端/dev/ttyGS0
Host 端

以下
ACM 通路
测试 - 方向 Device->Host
板端执行 测试 命令
echo "USB ACM Test: Device -> Host." > /dev/ttyGS0
Host 打开

ACM 通路
测试 - 方向 Host -> Device
Host 打开对应 的 虚拟 串口 (本 示例 为 COM4,默认 波特率9600),并 发送 字符串

板端
root@buildroot:/userdata# cat /dev/ttyGS0
USB ACM Test: Host -> Device.
UAC (USB Audio Class)
UAC(USB Audio Class) 是 USB 设备
代码分析
usb-gadget.sh 脚本create_uac1() 配置 UAC 参数
create_uac1()
{
CONFIG=$1
FUNCTION=$2
echo "Creating UAC1 gadget functionality : $FUNCTION"
mkdir functions/$FUNCTION
echo 0x3 > functions/$FUNCTION/p_chmask # 使能声卡放音左右声道
echo 48000 > functions/$FUNCTION/c_srate # 设置采样率,示例 48K
echo 0x3 > functions/$FUNCTION/c_chmask # 使能声卡录音左右声道
ln -s functions/$FUNCTION configs/c.1 # 绑定 UAC Function 到 config
echo "OK"
}
常用
p_srate, c_srate: 采样率,支持
多 采样率 配置,采样率 之间 用 逗号 隔开,例如 echo 8000,16000,32000 > c_sratec_chmask, p_chmask: 声道
掩码,支持 多声道 或 删除 对应 声道 p_ssize, c_ssize: 数据位
宽,例如: 16bit 位宽值 为2
使用方法
板端
/etc/init.d/usb-gadget.sh restart uac1
板端
生成 UAC1 声卡
查看 UAC1 声卡的 方法
root@buildroot:~# cat /proc/asound/cards
0 [guaaudio ]: gua-audio - gua-audio
gua-audio
1 [UAC1Gadget ]: UAC1_Gadget - UAC1_Gadget
UAC1_Gadget 0
root@buildroot:~# ls -al /proc/asound/card1
total 0
dr-xr-xr-x 5 root root 0 Jan 1 00:06 .
dr-xr-xr-x 11 root root 0 Jan 1 00:04 ..
-r--r--r-- 1 root root 0 Jan 1 00:06 id
dr-xr-xr-x 4 root root 0 Jan 1 00:06 pcm0c
dr-xr-xr-x 4 root root 0 Jan 1 00:06 pcm0p
root@buildroot:~# ls /dev/snd/pcmC1D0*
/dev/snd/pcmC1D0c /dev/snd/pcmC1D0p
可以
Host 端
显示 音频设备 接入

测试 UAC1 放音
功能
注意: 由于 X5 EVB 主板并 没有 音频 播放 设备,所以 采用 录制 音频文件 方式 验证 UAC1 放音 功能。
Host端打开 音频 播放器,并 选择 UAC1 对应 的 放音 设备。
以 Audacity 为例,选择一段 测试 音频,并 选择 UAC1 的 放音 设备(本 示例 为 2-AC Interface),点击 播放。

板端
arecord -f dat -t wav -r 48000 -c 2 -D hw:1,0 /userdata/rec.wav
以上/userdata/rec.wav
测试 UAC1 录音
功能
注意: 由于 X5 EVB 主板并 没有 麦克风,所以 采用 播放 音频文件 方式 验证 UAC1 录音 功能。
使用 Windows 的录音 侦听 功能,实时 播放 录音 的 音频,方法 如下:
Host端打开 声音设置 -> 声音控制面板 -> 录制 -> 属性 -> 侦听,勾选侦听 此 设备(本 示例 为 2-AC Interface),并 选择 Host 端 可 用于 播放 的 扬声器。

板端
aplay /userdata/play.wav -c 2 -r 48000 -D hw:1,0
以上
UVC (USB Video Class)
UVC(USB Video Class) 是 USB 设备
代码分析
当前 X5 UVC 支持
| 格式 | 分辨率 |
|---|---|
| YUV | 1280 x 720 |
| H264 | 640 x 480 1088 x 1280 1280 x 720 1920 x 1080 |
| MJPEG | 1280 x 720 1920 x 1080 |
UVC 分辨率
通过 usb-gadget.sh 的
create_frame()函数添加
create_uvc() {
CONFIG=$1
FUNCTION=$2
echo " Creating UVC gadget functionality : $FUNCTION"
mkdir functions/$FUNCTION
# 添加分辨率与格式到支持列表
create_frame $FUNCTION 1280 720 uncompressed u
create_frame $FUNCTION 640 480 uncompressed f h264
create_frame $FUNCTION 1088 1280 uncompressed f h264
create_frame $FUNCTION 1280 720 uncompressed f h264
create_frame $FUNCTION 1920 1080 uncompressed f h264
create_frame $FUNCTION 1280 720 mjpeg m
create_frame $FUNCTION 1920 1080 mjpeg m
mkdir functions/$FUNCTION/streaming/header/h
cd functions/$FUNCTION/streaming/header/h
ln -s ../../uncompressed/u
ln -s ../../uncompressed/f
ln -s ../../mjpeg/m
cd ../../class/fs
ln -s ../../header/h
cd ../../class/hs
ln -s ../../header/h
cd ../../class/ss
ln -s ../../header/h
cd ../../../control
mkdir header/h
ln -s header/h class/fs
ln -s header/h class/ss
cd ../../../
# Set the packet size: uvc gadget max size is 3k...
echo 3072 > functions/$FUNCTION/streaming_maxpacket
echo 2048 > functions/$FUNCTION/streaming_maxpacket
echo 1024 > functions/$FUNCTION/streaming_maxpacket
# use usb2.0 isoc max bandwidth, using 3072 max packet size
echo 3072 > functions/$FUNCTION/streaming_maxpacket
ln -s functions/$FUNCTION configs/c.1
}
通过 libguvc 源码
添加
路径app/samples/platform_samples/sample_usb/gadget/libguvc/src/uvc_gadget.c
// YUV 格式分辨率列表
static struct uvc_frame_info uvc_frames_yuyv[] = {
{ 1280, 720, { 333333, 0 }, 3072 }, /* Note: 720p */
{ 0, 0, { 0, }, 0},
};
// MJPEG 格式分辨率列表
static struct uvc_frame_info uvc_frames_mjpeg[] = {
{ 1280, 720, { 333333, 0 }, 384 }, /* Note: 720p, 80KB */
{ 1920, 1080, { 333333, 0 }, 800 }, /* Note: 1080p, 200KB */
{ 0, 0, { 0, }, },
};
// H264 格式分辨率列表
static struct uvc_frame_info uvc_frames_h264[] = {
{ 640, 480, { 333333, 0 }, 3072 }, /* Note: 480p */
{ 1088, 1280, { 333333, 0 }, 3072 }, /* Note: 1280p */
{ 1280, 720, { 333333, 0 }, 3072 }, /* Note: 720p */
{ 1920, 1080, { 333333, 0 }, 3072 }, /* Note: 1080p */
{ 0, 0, { 0, }, },
};
// UVC 支持格式与分辨率列表
static struct uvc_format_info uvc_formats[] = {
{V4L2_PIX_FMT_YUYV, uvc_frames_yuyv},
{V4L2_PIX_FMT_H264, uvc_frames_h264},
{V4L2_PIX_FMT_MJPEG, uvc_frames_mjpeg},
};
通过 potplayer 播放器

使用方法
X5 UVC Host 端的
4.3.18.5. 常见问题
X5 EVB 主板 USB2.0 和 3.0 分别是哪个接口
USB2.0 对应 Micro-USB 接口

USB3.0 对应 USB Type-A 接口

使用 USB2.0 模拟设备提示 “usb-gadget is already running”
X5 EVB 启动/etc/init.d/usb-gadget.sh stop
如何使用 USB 3.0 Gadget
USB3.0 请/etc/init.d/usb3.0-gadget.sh脚本
使用
USB 3.0 切换 Host & Device 模式
USB3.0 默认
硬件
方式
短接

软件
方式
设置 USB3.0 为 Host模式
echo host > /sys/class/usb_role/35100000.usb-role-switch/role
设置 USB3.0 为 Device模式
echo device > /sys/class/usb_role/35100000.usb-role-switch/role