USB Gadget
+ -

Linux USB Gadget UAC1复合麦克风扬声器

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

上一篇文章大概说了一下在搞UAC1复合麦克风扬声器,当时也仅是将设备复合出来了,没有进行数据的通讯处理。今天要说的是音频数据处理也”正常”了。

由于IMX6UL自带的扬声器和麦克风,本来的想法是相互独立。扬声器用IMX6UL自常的扬声器播放,而麦克风用自带的麦克风采集声音,可无奈u_uac1.h/c文件中并没有实现Linux麦克风的功能,所以此路对自己来说,当前有点不通。

164914423668

所以,本人本着能方便就偷懒的方式重新规划了音频数据的链路。我的想法是既然麦克风无法获取真实的数据,何不妨使用扬声器的数据来回环。这让从Windows系统下来的扬声器音频数据,在UAC1驱动中兵分两路,一路直接使用IMX6UL自带的扬声器直接播放,另一路则掉转车头,从UAC1驱动中回到Gadget麦克风中,最终回到Windows系统中。这样,我们在Windows系统中使用使用Gadget扬声器播放的声音,可以通过Gadget麦克风再次采集回来。如果这时我们用我们的另一个扬声器来侦听该麦克风,就可以听到播放的声音。

164938347383

PS:在测试时遇到一个BUG,会内核崩溃,经过分析,是内存泄露引起的。
原因是在OUT的端点申请的端点请求,和IN端点中释放端点求时前,未释放端点的内存缓冲区。

if (ep == out_ep) 
{
    if (in_ep && in_ep->driver_data)
    {
        mreq = usb_ep_alloc_request(in_ep, GFP_ATOMIC);
        if (mreq)
        {
            mreq->buf = kzalloc(req->actual, GFP_ATOMIC);
            if (mreq->buf)
            {
                mreq->context = audio;
                mreq->complete = f_audio_complete;
                mreq->length = req->actual;
                memcpy(mreq->buf, req->buf, req->actual);
                usb_ep_queue(in_ep, mreq, GFP_ATOMIC);
            }
            else
            {
                usb_ep_free_request(in_ep,mreq);
            }
        }
    }

    f_audio_out_ep_complete(ep, req);
}
本文链接为:http://www.usbzh.com/article/detail-1586.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

Linux V4L2框架
Linux系统支持多钟多样的Video设备,如通过USB总线连接的相机,通过PCI设备连接的摄像头,通过MIPI总线连接其它Video设备。故Linux系统专门开发了V4L2子设备用来管理此类设备。V4L2子系统向上为虚拟文件系统VFS提供一的接口,这样应用程序就可以通过虚拟文件系统访问视频设备。......
linux下UsbMon-WireShark之USB协议抓取分析
usbmon配置使用usbmon抓包分的,是需要 内核开启CONFIG_USB_MON=m, 重新编译内核, 编译ko :make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- CONFIG_USB_MON=m M=./drivers/usb/ ......
USB-UAC麦克风 音频控制接口
音频控制接口描述符描述了设备的结构(拓扑结构),并通过特定类请求对音频的控制。UAC麦克风 音频控制接口描述符偏移地址字段长度值描述0bLength10x09接口描术符的长度1bDescriptorType10x04描述符的类型接口描述符2bInterfaceNumber10x00接口ID号3bA......
USB音箱 UAC设备描述符分析
这里看到,USB规范采用的是USB1.1版本,不过字符串中又显示的是”USB2.0 Device”,所以这里就有点迷~关于设备描述符各字段的详细解释,详见USB规范中设备描述符一节。从bDeviceClass,bDeviceSubClass和bDeviceSubClass都被置为0来看,这是一个典......
UAC 类特定音频控制接口头描述符
UAC类特定音频控制头接口描述符这个名字有点绕,其实这个描述符是前接标准的音频控制接口描述符,后续关于音频控制的所有相关描述符,起着承上起下的作用。当然也可以认为是音频控制相关描述符的前导。这是因为UAC类特定音频控制接口描述符含有一个关键的字段wTotalLength,用于包含音频控制所有接口描述......
华为UAC耳机 音频控制接口
音频控制接口占用接口ID=0,音频控制接口的描述符结构布局如下:USB标准接口描述符UAC音频控制接口头描述符IDSId描述    音频控制输入终端描述符1USB Streaming   ......
华为UAC耳机的工作过程数据分析
华为UAC耳机工作时,首先需要打开设备,然后读取数据,播放过程后,需要关闭设备。这里我们使用BusHound抓包(省略掉重复的数据包:由于这些特定类请求是发给UAC音频控制终端/实体或接口的,所以我们先回顾一下UAC音频控制单元的一些ID,然后对照其选择子进行分析。UAC音频控制接口头描述符ID描述......
UAC 文档下载
UAC规范1.0文档下载地址:https://www.usb.org/sites/default/files/audio10.pdfUAC规范2.0文档下载地址:https://www.usb.org/sites/default/files/Audio2.0_final.zipUAC规范3.0及3.......
UAC 音频数据格式FORMAT_TYPE_3
下面来介绍USB Audio Data Formats 的第一类音频数格式 FORMAT_TYPE_III = 0x03Audio Data Format Type III Codes 其下又分为5种,分别为:NamewFormatTagTYPE_III_UNDEFINED0x2000IEC1937......
Linux支持的UVC视频格式
Linux支持的UVC视频格式位于linux-5.6.11linux-5.6.11driversmediausbuvcuvc_driver.c文件下:其数组结构定义如下:static struct uvc_format_desc uvc_fmts[] = { { .n......
UAC 音频控制
一个USB设备可能包含多个配置。像手机一样,当手机通过USB线缆接入PC机后,会弹出一个选择对话框:让用户选择。当然一个USB设备只能工作在一种配置描述符下。对于每一个USB配置描述符,可能含有多个USB接口描述描述符,同时这些接口描述符可能每个接口描述符又包含多个转换接口描述符。这些接口描述符可能......
USB音箱 UAC Speaker 概述
手头有一个USB Speaker,插入电脑后在设备管理器中如下:从设备管理器中来看,这是一个单一功能的Usb Speaker。其硬件设备ID如下:USBVID_1908&PID_2070&REV_0100(USB Composite Device)USBVID_1908&......
USB音箱 UAC配置描述符分析
该USB音箱的配置描述符和普通USB设备描述符结构体一致,并无特别区别。该配置描述符的总长度(包括后续的所有其它描述符)为110字节,这里相对华为耳机的要少了很多,这是因为少了像麦克风和HID。从配置描述符的字段bmAttributes来看,并不支持远程唤醒功能。 ------------......
华为UAC耳机 配置描述符
配置描述符的大小其实不光包括配置描述符自身,也包括后续的所有描述符。这里我们只先介绍一下配置描述符,后续的接口描述符和其它UAC相关描述符在后续一节介绍。配置描述符的内容如下: ------------------ Configuration Descriptor --------------......
UAC 其它速率配置描述符
UAC规范中,并没有定义特别的其它速率配置描述符,故UAC音频设备的其它速率描述符应符合USB规范中的其它速率配置描述符。......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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