USB Gadget
+ -

USB Gadget functions UAC1虚拟声卡g_audio_setup

2025-12-02 本文链接为:http://www.usbzh.com/article/detail-1601.html ,欢迎转载,转载请附上本文链接。

USB Gadget是Linux系统可以通过主机的UDC控制器,实现从设备的功能。简而言之就是Linux作为从机,其通过UDC的USB接口接入的是主机,比如Windows。
现在市面上比较高级的USB相机设备,应该都是这种设计。

UAC按规范分为UAC1.0,UAC2.0,UAC3.0等,使用最普通的是UAC1.0,UAC2.0也随着操作系统的支持,也慢慢得到了发展。不过最普遍的也当属UAC1.0。

本人在使用IMX6UL开发板验证USB Gadget functions UAC1.0时,发现其功能开发很不完善。

  • 第一:其仅支持扬声器,并不支持麦克风,需要自己手动修改代码。
  • 第二:音频数据的处理很不优雅,也很不灵活。对于其扬声器的数据处理,直接在内核中暴力打开ALSA的真实扬声器,发送数据并播放。这样如果需要进行音频数据处理,需要修自以为f_uac1.c的源代码,很不方便。

以上,是本人使用IMX6UL开发板的经历,当然,其使用的Linux内核版本为4.1.15,其支持不完善也理解。而对比其NCM网卡的功能,其双向虚拟的网卡通讯,让自己留下了深刻的印象,所以也会想象假如一天其UAC也这样,不是更加方便吗?
12010220878

/*
 * We have three interfaces - one AudioControl and two AudioStreaming
 *
 * The driver implements a simple UAC_1 topology.
 * USB-OUT -> IT_1 -> OT_2 -> ALSA_Capture (主机端speaker)
 * ALSA_Playback -> IT_3 -> OT_4 -> USB-IN (主机端microphone)
 */

果然,随着LINUX内核的发展,LINUX的大神们实现了上述的功能。
从Linux4.14开始,支持一个神密的函数g_audio_setup

/*
 * g_audio_setup - initialize one virtual ALSA sound card
 * @g_audio: struct with filled params, in_ep_maxpsize, out_ep_maxpsize
 * @pcm_name: the id string for a PCM instance of this sound card
 * @card_name: name of this soundcard
 *
 * This sets up the single virtual ALSA sound card that may be exported by a
 * gadget driver using this framework.
 *
 * Context: may sleep
 *
 * Returns zero on success, or a negative error on failure.
 */
int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,const char *card_name);

该函数可以创建一个虚拟的ALSA声卡,让其实现最终的功能。
不过有个很诡异的问题,就是声卡名称问题,本人写的是这样的:

    status = g_audio_setup(audio, "AA CARD", "BB PCM");

实现声卡的名称在LINUX下为:

console:/proc/asound # cat cards
...
 3 [PCM            ]: BB PCM - BB PCM
                      BB PCM 0

|console:/proc/asound # cat pcm
03-00: AA CARD : AA CARD : playback 1 : capture 1

本人使用是内核版本为:5.10

这样在Linux系统中就会有一个AA声卡BB的PCM设备,其支持扬声器和麦克风。这样就可双向音频数据传输了。

本文链接为:http://www.usbzh.com/article/detail-1601.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

UAC1.0和UAC2.0区别
传统3.5mm模拟耳机逐步被USB数字耳机代替。采用USB协议进行音频播放使用USB Audio Class协议(简称UAC).UAC2.0由于支持USB High Speed,从而天生带有高带宽、低延时的优势。这些优势转化为对于Hi-Resolution Auido的支持。UAC1.0最高只支持到......
UAC1.0麦克风端点描述符wMaxPacketSize的问题分析
同事搞了一个UAC麦克风,将输入端点设置如下: ----------------- Endpoint Descriptor -----------------bLength : 0x09 (9 bytes)bDescriptorType ......
ALSA框架UAC1驱动程序入口宏DECLARE_USB_FUNCTION分析
题外话:为了学习看LINUX驱动,我也是拼了。对于LINUX源代码,虽然以前了解过LINUX的字符串驱动,不过突然跳到一个复杂的LINUX设备驱动,还是有点迷茫,自己什么不会。不过还是要狠下心来,像看了7天的UVC规范一样,强行让自己翻译。自己看的Linux UAC源代码位于https://eli......
ALSA框架UAC1函数f_audio_alloc_inst和f_audio_alloc
前面大概分析到了UAC1的系统级的入口函数f_audio_alloc_inst和f_audio_alloc。从代码上来看,会先调用usb_function_instance,再是f_audio_alloc。这是因为f_audio_alloc函数中引用了usb_function_instance申请......
UAC1数据结构关系由f_audio_bind函数引出的struct f_uac1_opts和struct f_uac1之间的联系解读
前面看到了分别通过f_audio_alloc_inst和f_audio_alloc函数申请struct f_uac1_opts和struct f_uac1结构体,而我们在看UAC1源代码的时候,就需要这些结构体之间进行转换。首先我们先看struct f_uac1_opts和struct f_uac......
USB Gadget CDC-ECM网卡实例
ECM和NCM网卡类似,也需要安装ECM驱动设备兼容ID为:USBClass_02&SubClass_06&Prot_00USBClass_02&SubClass_06USBClass_02创建脚本:#!/bin/bashmodprobe libcompos......
Linux Gadget驱动结构关系图
Linux Gadget驱动层级如下:Gadget Function驱动/gadget legacy驱动Gadget Compoiste驱动USB UDC驱动(USB Device Control)Gadget Function驱动/gadget legacy驱动function, 更加现......
gadget probe过程-以g_audio为例
g_audio中通过如下代码调用usb_composite_probe,其中入参为audio_driverstatic struct usb_composite_driver audio_driver = { .name = "g_audio", ......
configfs文件系统
Linux内核使用CONFIGFS配置项支持可以通过用户创建USB Compoiste Gadget。CONFIG_CONFIGFS_FS项用于支持配置文件系统。Menconfig -> FileSystems -> Psuedo File System -> {M}User......
Gadget legacy和Gadget Function的区别
在 Linux 的 USB Gadget 子系统中,Legacy GadgetGadget Function(FunctionFS 或 configfs) 是两种不同的实现方式,用于将 Linux 设备配置为 USB 外设(如 U 盘、网卡、串口等)。它们的区别主要体现在架构、使用方式和灵活性......
usb_gadget复合HID键盘和U盘实例
#!/bin/bash# 加载模块modprobe libcompositemodprobe usb_f_hidmodprobe usb_f_mass_storage.komount -t configfs none /sys/kernel/config# 创建 Gadgetcd......
usb gadget创建uvc相机脚本实例
#!/bin/bashmodprobe libcompositemodprobe usb_f_uvcmount -t configfs none /sys/kernel/configmkdir -p /sys/kernel/config/usb_gadget/g1cd /sys/kern......
USB Gadget CDC-ACM串口实例
符合USB ACM规范的设备由Windows提供其驱动程序usbser.sysuserser.infLinux Gadget对应的ACM驱动依赖为root@ATK-IMX6U:/sys/kernel/config/usb_gadget/g1# lsmodModule ......
USB Gadget CDC-NCM网卡实例
USG Gadget也提供了CDC-NCM网卡驱动程序,使用USB Gadget CDC-NCM驱动,这样在Windows主机端和Linux设备端都会创建一个USB网卡设备。root@ATK-IMX6U:/lib/modules/4.1.15# ifconfig -ausb0 Lin......
USB Gadget 打印机实例
打印机这一块应该要与实例相连,具体这一块没有研究过。生成的设备如下:设备模块如下:root@ATK-IMX6U:/lib/modules/4.1.15# lsmodModule Size Used byusb_f_printer 1137......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!