跳到主要内容

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

image-20250214140101326

Tina 环境配置

配置自动加载驱动

执行 make menuconfig 进入配置界面

Kernel modules  --->
USB Support --->
<*> kmod-sunxi-uvc

image-20250214143001937

系统启动后会自动加载UVC驱动

配置 UVC 配置脚本

Allwinner  --->
USB --->
<*> setusbconfig

image-20250214144225423

配置UVC 设备

执行 make menuconfig 进入配置界面,选择运行 demo

Allwinner  --->
eyesee-mpp --->
[*] support usb video camera, enable uvc component
<*> eyesee-mpp-middleware-demo
[*] select mpp sample
[*] mpp sample uvcout

image-20250214145825451

编译后可以在 platform/allwinner/eyesee-mpp/middleware/sun300iw1/sample/bin 找到应用程序,复制到 SD 卡插入开发板。

image-20250214145945850

配置UVC设备

输入 setusbconfig uvc 即可配置 V821 为 UVC 设备,可以看到提示新设备 Tina UVC

setusbconfig uvc

image-20250214150029169

运行后可以看到出现了新的 video1 节点

image-20250214150236340

PC 可以看到提示新设备 Tina UVC

image-20250214145459285

运行测试用例

./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,右键-->选项-->设备-->摄像头-->格式 选择对应格式及分辨率 ,然后点击右下角打开设备。

potplayer 设备设置

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
...

image-20250214151730790

修改时注意,需要按照如上代码配置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设备-设备管理器

双路UVC设备-potplayer界面

UVC 和 UAC1 复合设备的使用

内核配置

Allwinner BSP  --->
Device Drivers --->
USB Drivers --->
USB Gadget Drivers --->
<M> Allwinner Audio Class 1.0

image-20250214151952222

Tina 环境配置

执行 make menuconfig 进入配置界面

Kernel modules  --->
USB Support --->
<*> kmod-sunxi-uac1

image-20250214152635540

初始化设备

勾选驱动后进行编译打包烧录,小机端串口输入:

setusbconfig uvc,uac1

切换到UVC+UAC1复合设备。

接入Windows PC后设备管理器会显示出UVC(UVC Camera)+UAC1(AC Interface)设备。(HD Audio 这个是电脑显示屏的,可以无视)

image-20250214154953209

运行测试用例

./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播放测试:

UAC-UAC1复合设备-播放测试

UAC1采集测试:

UVC-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_chmaskplayback 音频通道数(0x1:单通道 0x3:双通道)0x1
c_chmaskcapture 音频通道数(0x1:单通道 0x3:双通道)0x1
p_srateplayback 音频采样率16000
c_sratecapture 音频采样率16000
p_ssizeplayback 音频位宽16
c_ssizecapture 音频位宽16
req_numUAC1驱动req个数2

UAC1 out/capture指主机HOST到小机端Device,即小机端作为USB喇叭。 UAC1 in/playback指小机端Device到主机端HOST,即小机端作为麦克风。'

某些门锁猫眼板厂商会对 UAC wMaxPacketSize 大小有要求,这就需要对应修改。

例如在某某厂商某型号猫眼板,对模组的 UAC wMaxPacketSize 要求16 bytes。

某某厂商某型号猫眼板UAC参数要求

在 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

image-20250214163323980

常见问题

PotPlayer 打开设备卡住最后显示未响应

问题现象:

potplayer_未响应

问题分析:出现这个现象说明 UVC 设备未响应,那么大概率为小机端没有跑 UVC 测试用例或者打开的 video 节点不对。

问题排查步骤:

检查是否运行了 UVC 测试用例,是否 UVC 测试用例报错退出。

UVC设备节点也是 /dev/video 节点与VIPP的节点类似,需要分清楚。可以参考以下几种方式确认打开的UVC节点是否正确。

  1. 执行 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):/#
  1. 通过 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 打开失败或者黑屏无图像

问题现象:

  1. 提示该没问题无法播放

potplayer无法播放

  1. 进入了播放界面确没有图像显示

potplayer无法播放

问题分析:V821 支持两种UVC传输模式,每个模式都需要配置对应的UVC设备描述符并且上层处理UVC协议逻辑也要对应选择。所以针对该问题需要对UVC设备描述符和上层应用逻辑一起分析。

问题排查步骤:

  1. 接入PC使用 usbview 工具查看UVC设备描述符配置是否正确,如下图说明该设备为UVC BULK传输模式。

bulk模式问题排查

bulk模式问题排查

  1. 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
  1. 确认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。