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也这样,不是更加方便吗?
/*
* 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 ,欢迎转载,转载请附上本文链接。
USB Gadget





