UVC/UAC - 模块使用说明
UVC(USB Video Class)全称USB视频类,其定义适用于所有用于USB操纵视频和相关功能的复合设备中的所有设备或功能。V821平台UVC版本为1.1。
UAC (USB Audio Class)全称USB音频类,是一种通过USB连接传输音频数据的标准协议。它允许音频设备(如耳机、麦克风、音频接口、扬声器等)与计算机或其他支持USB的设备进行通信。USB Audio Class定义了音频设备与计算机或其他USB主机之间的数据交换方式,从而使音频设备能够在无需专用音频接口卡的情况下,直接通过USB接口与计算机连接。V821平台UAC版本为1.0。
UVC/UAC 支持功能:
- 支持MJPEG、H264、YUY2、NV12格式
- 支持ISOC/BULK传输模式
本文将展示如何将 V821 配置成为 USB 摄像头,通过 MIPI 摄像头输入图像,MIC 输入音频,通过 UVC/UAC 将音视频数据传输到 PC 端相机软件。将 V821 作为一个 USB 摄像头使用。
内核配置
执行 make kernel_menuconfig
进入内核配置界面
Allwinner BSP --->
Device Drivers --->
USB Drivers --->
USB Gadget Drivers --->
<M> Allwinner USB Gadget support
<M> Allwinner USB Webcam function
Tina 环境配置
配置自动加载驱动
执行 make menuconfig
进入配置界面
Kernel modules --->
USB Support --->
<*> kmod-sunxi-uvc
系统启动后会自动加载UVC驱动
配置 UVC 配置脚本
Allwinner --->
USB --->
<*> setusbconfig
配置UVC 设备
执行 make menuconfig
进入配置界面,选择运行 demo
Allwinner --->
eyesee-mpp --->
[*] support usb video camera, enable uvc component
<*> eyesee-mpp-middleware-demo
[*] select mpp sample
[*] mpp sample uvcout
编译后可以在 platform/allwinner/eyesee-mpp/middleware/sun300iw1/sample/bin
找到应用程序,复制到 SD 卡插入开发板。
配置UVC设备
输入 setusbconfig uvc
即可配置 V821 为 UVC 设备,可以看到提示新设备 Tina UVC
setusbconfig uvc
运行后可以看到出现了新的 video1
节点
PC 可以看到提示新设备 Tina UVC
运行测试用例
./sample_uvcout -D 0 -d 1 -B 10 &
参数 | 功能描述 | 示例 |
---|---|---|
-D / --vipp_dev | 选择 vipp 设备。 | -D 0 表示选择 /dev/video0 |
-d / --uvc_dev | 选择 uvc 设备。 | -d 1 表示选择 /dev/video1 |
-B / --bitrate | 设置 MJPEG/H264 流的比特率。 | -B 5 表示设置比特率为 5 Mbps |
-s / --dual_stream | 启用 MJPEG 插入 H264 流的功能。 | -s 1 表示启用双流功能 |
-s_vipp_dev / --dual_stream_vipp_dev | 设置双流使用的 vipp 设备。 | -s_vipp_dev 4 表示双流使用 /dev/video4 |
-b / --uvc_bulk_mode | 启用 UVC 批量传输模式。 | -b 1 表示启用 UVC 批量传输模式 |
-uac_in / --uac_in | 启用 UAC1 输入功能。 | -uac_in 1 表示启用 UAC1 输入功能 |
-uac_out / --uac_out | 启用 UAC1 输出功能。 | -uac_out 1 表示启用 UAC1 输出功能 |
-uac_sr / --uac_sample_rate | 设置 UAC1 音频采样率。 | -uac_sr 16000 表示设置 UAC1 音频采样率为 16000Hz |
-uac_ch / --uac_channel | 设置 UAC1 音频通道数。 | -uac_ch 1 表示设置 UAC1 音频通道为 1 |
-uac_bw / --uac_bitwidth | 设置 UAC1 音频位宽。 | -uac_bw 16 表示设置 UAC1 音频位宽为 16位 |
-uac_aec / --uac_aec | 启用音频 AEC(回声消除)功能。 | -uac_aec 1 表示启用音频回声消除功能 |
-uac_agc / --uac_agc | 启用音频 AGC(自动增益控制)功能。 | -uac_agc 1 表示启用音频自动增益控制功能 |
-uac_ans / --uac_ans | 启用音频 ANS(自动噪声抑制)功能。 | -uac_ans 1 表示启用音频自动噪声抑制功能 |
-enable_dual_uvc / --enable_dual_uvc | 启用双 UVC 设备功能。 | -enable_dual_uvc 表示启用双 UVC 设备功能 |
-debug / --debug_mode | 启用调试模式,发送图片。 | -debug 1 表示启用调试模式,发送图片 |
PC端打开PotPlayer,右键-->选项-->设备-->摄像头-->格式
选择对应格式及分辨率 ,然后点击右下角打开设备。
配置支持格式与支持分辨率
修改setusbconfig脚本,路径如下:
platform/allwinner/usb/setusbconfig/setusbconfig
找到enable_uvc函数,修改如下代码格式为:
uvc_create_frame <format> <flag> <width> <height> <index>
...
uvc_create_frame mjpeg m 1920 1080 1
uvc_create_frame mjpeg m 1280 720 2
uvc_create_frame mjpeg m 640 480 3
uvc_create_frame uncompressed u 320 240 1
uvc_create_frame h264 h 1920 1080 1
uvc_create_frame h264 h 1280 720 2
uvc_create_frame nv12 nv12 320 240 1
...
修改时注意,需要按照如上代码配置format、flag。相同格式下index从1开始递增,每个格式的 index 都是独立的。
UVC BULK传输模式配置
使用如下指令初始化UVC BULK模式。
setusbconfig uvc,bulk
使用测试用例加入-b 1 参数。
./sample_uvcout -D 0 -d 1 -B 10 -b 1 &
双路UVC设备
使用如下指令初始化双路UVC设备。
setusbconfig uvc,dual
使用如下指令测试:
sample_uvcout -D 0 -d 1 -B 10 -enable_dual 1 -D 4 -d 2 -B 10 &
接入Windows PC打开设备管理器可以看到两个UVC设备,使用potplayer打开对应的UVC设备进行预览。
UVC 和 UAC1 复合设备的使用
内核配置
Allwinner BSP --->
Device Drivers --->
USB Drivers --->
USB Gadget Drivers --->
<M> Allwinner Audio Class 1.0
Tina 环境配置
执行 make menuconfig
进入配置界面
Kernel modules --->
USB Support --->
<*> kmod-sunxi-uac1
初始化设备
勾选驱动后进行编译打包烧录,小机端串口输入:
setusbconfig uvc,uac1
切换到UVC+UAC1复合设备。
接入Windows PC后设备管理器会显示出UVC(UVC Camera)+UAC1(AC Interface)设备。(HD Audio 这个是电脑显示屏的,可以无视)
运行测试用例
./sample_uvcout -D 0 -d 1 -B 5 -uac_in 1 -uac_out 1 -uac_sr 16000 -uac_bw 16 -uac_ch 1 -uac_aec 1 -uac_ans 1 -uac_agc 1
- 配置设备 0(
/dev/video0
)为视频输入设备, - 配置设备 1(
/dev/video1
)为 UVC 视频输入设备, - 设置视频流比特率为 5 Mbps,
- 启用音频输入输出功能,并设置音频相关参数(采样率、位宽、通道数等),
- 启用音频的回声消除、自动噪声抑制和自动增益控制功能。
Windows PC可在声音设置界面进行测试验证:
UAC1播放测试:
UAC1采集测试:
使用侦听功能进行测试验证。
默认参数修改
默认UAC1设备参数为支持双向对讲、16k采样率、16bit位宽、单通道,req size为200Bytes。
音频参数可通过setusbconfig脚本进行修改。
platform/allwinner/usb/setusbconfig/setusbconfig
找到如下位置进行修改。
echo 0xef > /sys/kernel/config/usb_gadget/g1/bDeviceClass
echo 0x02 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass
echo 0x01 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol
[ -d /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0 ] || {
mkdir /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0
}
# playback and capture
echo 0x1 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
echo 0x1 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_srate
echo 0x2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_ssize
echo 0x2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_ssize
echo 0x2 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/req_number
echo "Tina UVC,UAC1" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
ln -s /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/uac1.usb0
enable_uvc 0
参数 | 说明 | 默认值 |
---|---|---|
p_chmask | playback 音频通道数(0x1:单通道 0x3:双通道) | 0x1 |
c_chmask | capture 音频通道数(0x1:单通道 0x3:双通道) | 0x1 |
p_srate | playback 音频采样率 | 16000 |
c_srate | capture 音频采样率 | 16000 |
p_ssize | playback 音频位宽 | 16 |
c_ssize | capture 音频位宽 | 16 |
req_num | UAC1驱动req个数 | 2 |
UAC1 out/capture指主机HOST到小机端Device,即小机端作为USB喇叭。 UAC1 in/playback指小机端Device到主机端HOST,即小机端作为麦克风。'
某些门锁猫眼板厂商会对 UAC wMaxPacketSize
大小有要求,这就需要对应修改。
例如在某某厂商某型号猫眼板,对模组的 UAC wMaxPacketSize
要求16 bytes。
在 V821上 wMaxPacketSize
在UAC1驱动中进行修改,如下图修改为16 bytes。
文件路径:
bsp/drivers/usb/gadget/function/u_uac1.h
修改 UAC1_OUT_EP_MAX_PACKET_SIZE
宏定义的数值。
#define UAC1_OUT_EP_MAX_PACKET_SIZE 16
常见问题
PotPlayer 打开设备卡住最后显示未响应
问题现象:
问题分析:出现这个现象说明 UVC 设备未响应,那么大概率为小机端没有跑 UVC 测试用例或者打开的 video
节点不对。
问题排查步骤:
检查是否运行了 UVC 测试用例,是否 UVC 测试用例报错退出。
UVC设备节点也是 /dev/video
节点与VIPP的节点类似,需要分清楚。可以参考以下几种方式确认打开的UVC节点是否正确。
- 执行
setusbconfig uvc
前后查看生成的video节点,如下图 UVC 节点为/dev/video1
root@(none):/# ls /dev/video*
/dev/video0 /dev/video4
root@(none):/# setusbconfig uvc
root@(none):/# ls /dev/video*
/dev/video0 /dev/video1 /dev/video4
root@(none):/#
- 通过
class
设备模型确认,如下图video1
节点为UVC节点
root@(none):/# cat /sys/class/video4linux/video1/name
sunxi_usb_udc
root@(none):/# cat /sys/class/video4linux/video0/name
vin_video0
BULK 模式 PotPlayer 打开失败或者黑屏无图像
问题现象:
- 提示该没问题无法播放
- 进入了播放界面确没有图像显示
问题分析:V821 支持两种UVC传输模式,每个模式都需要配置对应的UVC设备描述符并且上层处理UVC协议逻辑也要对应选择。所以针对该问题需要对UVC设备描述符和上层应用逻辑一起分析。
问题排查步骤:
- 接入PC使用
usbview
工具查看UVC设备描述符配置是否正确,如下图说明该设备为UVC BULK传输模式。
- UVC驱动通过驱动模块参数判断是否要配置为BULK模式,可根据如下来确认。
# Y代表UVC BULK模式
root@(none):/# cat /sys/module/usb_sunxi_f_uvc/parameters/bulk_streaming_ep
Y
# N代表UVC ISOC模式
root@(none):/# cat /sys/module/usb_sunxi_f_uvc/parameters/bulk_streaming_ep
N
- 确认UVC测试用例加入了 -b 1 参数
sample_uvcout -D 0 -d 1 -B 10 -b 1 &
UVC测试用例输出colorbar测试单UVC通路
加入 -debug 1
选项输出colorbar图像。
sample_uvcout -D 0 -d 1 -B 10 -debug 1 &
如何修改音量大小
采集音量大小设置
platform/allwinner/eyesee-mpp/middleware/sun300iw1/sample/sample_uvcout/uac/uac.c
result = AW_MPI_AI_EnableChn(ai_dev, ai_chn);
if (result != SUCCESS)
{
aloge("enable ai chn %d fail!", ai_chn);
goto _destroy_ai_chn;
}
AW_MPI_AI_SetDevVolume(ai_dev, 80); //加入这句
while (1)
采集音量大小范围0~100,默认为80。
播放音量大小设置
修改如下文件:
platform/allwinner/eyesee-mpp/middleware/sun300iw1/sample/sample_uvcout/uac/uac.c
...
result = AW_MPI_AO_StartChn(ao_dev, ao_chn);
if (result != SUCCESS)
{
aloge("ao dev %d ao chn %d start fail!", ao_dev, ao_chn);
goto _destroy_ao_chn;
}
AW_MPI_AO_SetDevVolume(ao_dev, 80); //加入这句
while (1)
...
播放音量大小范围0~100,默认为80。