UAC 音频与 UVC 视频 Function

UAC 音频与 UVC 视频 Function

1. UAC 架构

1
2
3
4
Host (USB Audio Class driver)
<-isoc-> f_uac1/f_uac2 (描述符+EP0 class request)
-> u_audio.c (isoc数据 <-> ALSA PCM)
-> 虚拟声卡 (本机应用 arecord/aplay 对接)

音频数据不接真实 codec:Host 放音变成本机 PCM capture,本机 playback 变成 Host 的录音源。真正连接硬件 codec 的是f_uac1_legacy(需板级 codec,较少用)。

关键入口

函数 位置 职责
g_audio_setup() u_audio.c:1426 创建 ALSA card/PCM,连接 uac 参数
u_audio_start_capture() u_audio.c:594 Host->设备 方向 isoc OUT 流启动
u_audio_start_playback() u_audio.c:722 设备->Host 方向 isoc IN 流启动
afunc_bind() f_uac2.c:1033 UAC2 描述符/端点分配
afunc_set_alt() f_uac2.c:1418 alt 0/1 开关流
afunc_setup() f_uac2.c:1822 Clock Source/Volume/Mute 等 class request
afunc_disable() f_uac2.c:1493 断开停流

UAC1 vs UAC2

UAC1 UAC2
速度 FS 语义(HS 可跑但描述符老) HS/SS,推荐
时钟模型 无显式 clock entity Clock Source/Selector,支持多采样率切换
反馈 adaptive/sync 支持显式 feedback EP(异步模式)
Windows 原生 Win10+ 原生

ConfigFS 属性配置采样率(c_srate/p_srate)、位宽(c_ssize/p_ssize)、通道掩码(c_chmask/p_chmask)、音量/静音控制暴露等。修改必须在绑定 UDC 前完成。

音频要点

  • isoc 无重传,欠载/过载直接表现为爆音;每包字节数由采样率/包间隔推出,非整数采样率下有 ±1 帧抖动处理;
  • 异步模式需 feedback 端点向 Host 报速率,否则长时间播放产生漂移;
  • ALSA period/buffer 设置过小会在系统调度抖动时 underrun。

2. UVC 架构

1
2
3
4
Host (UVC driver, 如Windows相机)
<-EP0 class-> f_uvc.c (control: PU/CT/SU 请求转发到用户态)
<-isoc/bulk-> uvc_video.c (payload封装) <- uvc_queue.c(videobuf2)
<- 用户态V4L2 (/dev/videoX 输出设备)

UVC function 把控制与数据都交给用户态:控制请求经 V4L2 event(UVC_EVENT_SETUP/DATA/STREAMON/STREAMOFF)投递给应用,视频帧由应用向/dev/videoX(V4L2 OUTPUT 设备)QBUF。

关键入口

函数 位置 职责
uvc_alloc() f_uvc.c:1281 实例化 function
uvc_function_bind() f_uvc.c:800 控制/流接口、端点、V4L2 设备注册
uvc_function_setup() f_uvc.c:295 class 请求转为 V4L2 event(DELAYED_STATUS)
uvc_function_setup_continue() f_uvc.c:342 用户应答后恢复 EP0 状态阶段
uvc_function_set_alt() f_uvc.c:380 alt 0/1 停/起流
uvc_v4l2_open() uvc_v4l2.c:617 用户态打开 V4L2 节点
uvcg_video_enable() uvc_video.c:784 组织 request 队列开始推流

ConfigFS 描述符树

UVC 的格式/分辨率/帧率在 configfs 中搭建(uvc_configfs.c):

1
2
3
4
5
6
7
functions/uvc.0/
├── control/ (header, processing/terminal)
├── streaming/
│ ├── uncompressed/u/ (格式) └── 360p/720p... (帧)
│ ├── mjpeg/m/...
│ └── header/h -> 链接格式;class/fs|hs|ss -> 链接header
└── streaming_maxpacket / streaming_interval

漏建任一层链接都会 bind 失败。带宽由 maxpacket×burst×interval 决定,1080p MJPEG 以上通常需要 HS isoc 3×1024 或 SS。

UVC 要点

  • 应用必须及时处理 STREAMON/OFF 与 setup event,否则 Host 侧超时;
  • isoc 模式丢包即丢帧数据,Host 端表现花屏;bulk 模式无带宽保证但不丢;
  • SS 下 companion 描述符的 burst 配置直接决定可用带宽。

3. RK3588 配置现状

rockchip_linux_defconfig启用USB_CONFIGFS_F_UVC(相机产品线),rockchip_cpcem_linux_defconfig启用 UAC1/UAC2/HID(音频类产品),electric 仅基础 ACM/MSC/FFS。本树另有自定义f_audio_raw绕开 UAC 标准协议做原始音频传输(见厂商自定义 Function 章)。

文章互动

阅读 --

留言

0 条留言

正在加载留言…