USB Gadget
+ -

Linux USB Gadget UAC1复合麦克风扬声器大功告成?

2025-09-23 0 0

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

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

164914423668

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

164938347383

不过一个不太好的消息是该驱动有BUG,有时会崩。具体问题还在分析:

[   54.988704] usb_ep_enable err=0 
[   54.994906] f_audio_set_alt intf=2 alt=1 req_buf_size=200
[   55.000328] config_ep_by_speed err=0 
[   55.003999] usb_ep_enable err=0 
[  120.506802] f_audio_set_alt intf=2 alt=0 req_buf_size=200
[  120.668701] Unable to handle kernel paging request at virtual address 00007c80
[  120.675955] pgd = 80004000
[  120.678668] [00007c80] *pgd=00000000
[  120.682268] Internal error: Oops: 817 [#1] PREEMPT SMP ARM
[  120.687759] Modules linked in: usb_f_uac1 libcomposite
[  120.692954] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.1.15 #10
[  120.698965] Hardware name: Freescale i.MX6 Ultralite (Device Tree)
[  120.705151] task: 80bddaf0 ti: 80bd8000 task.ti: 80bd8000
[  120.710567] PC is at memcpy+0x50/0x330
[  120.714323] LR is at 0x7a40d73
[  120.717385] pc : [<802aecb0>]    lr : [<07a40d73>]    psr: 20000193
[  120.717385] sp : 80bd9dec  ip : 086b0d99  fp : 000000c0
[  120.728868] r10: 9494d73c  r9 : 0000bb80  r8 : 06110cee
[  120.734098] r7 : 02f90a92  r6 : 03d309b5  r5 : 08eb0e07  r4 : 0b101148
[  120.740631] r3 : 07770e29  r2 : 00000020  r1 : 9494ef20  r0 : 00007c80
[  120.747165] Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[  120.754566] Control: 10c53c7d  Table: 94ac006a  DAC: 00000015
[  120.760319] Process swapper/0 (pid: 0, stack limit = 0x80bd8210)
[  120.766330] Stack: (0x80bd9dec to 0x80bda000)
[  120.770696] 9de0:                            9451fe80 9439e504 945fcb00 94899630 00007c80
[  120.778883] 9e00: 9494d700 7f0137c8 9494d734 00000000 9439e504 000000c0 9494d73c 9494d700
[  120.787071] 9e20: 9494d734 9494d73c 9439e504 804f5210 94759a00 9494d780 00000001 9439e010
[  120.795259] 9e40: 9439e53c 9439f010 9439e504 00000001 9439e010 9439e014 80bda504 9439e4a8
[  120.803446] 9e60: 97b903c0 00000001 0000001c 943ac080 940f1120 00000000 00000000 000000db
[  120.811633] 9e80: 940f10c0 80c496ea 00000000 8006e9b4 00000000 183535e7 940f10c0 940f1120
[  120.819819] 9ea0: 943ac080 00000000 00000001 80bd9f18 94006000 8006eaac 940f10c0 940f1120
[  120.828007] 9ec0: 80be1610 800715d4 000000db 00000000 000000db 8006e054 80bd3be8 8006e30c
[  120.836195] 9ee0: f4a0200c 80bda838 80bd9f18 f4a02000 18352e17 0000001c 00000001 80009454
[  120.844384] 9f00: 80585390 20000013 ffffffff 80bd9f4c 18352e17 80013240 80bd9f60 fffffff7
[  120.852571] 9f20: 18352e17 0000001c 97b91df8 00000001 1833b864 0000001c 18352e17 0000001c
[  120.860759] 9f40: 00000001 00000000 00000017 80bd9f60 a6aaaaab 80585390 20000013 ffffffff
[  120.868946] 9f60: 18352e17 0000001c 80bd2328 80bd8000 80bda5a4 808358d0 97b91df8 80be07b0
[  120.877134] 9f80: 80bd9f90 00000001 00000000 80065d9c 00000001 80bd2304 80bd4df0 80bda6c0
[  120.885320] 9fa0: 80c496e8 80bda5ac 80bd5780 80bd5780 00000000 ffffffff 00000000 80b52c5c
[  120.893508] 9fc0: ffffffff ffffffff 80b52678 00000000 00000000 80baf8e0 80c4c294 80bda540
[  120.901695] 9fe0: 80baf8dc 80bdebf4 8000406a 410fc075 00000000 8000807c 00000000 00000000
[  120.909908] [<802aecb0>] (memcpy) from [<7f0137c8>] (f_audio_complete+0x180/0x1e8 [usb_f_uac1])
[  120.918630] [<7f0137c8>] (f_audio_complete [usb_f_uac1]) from [<804f5210>] (udc_irq+0x4f4/0x105c)
[  120.927522] [<804f5210>] (udc_irq) from [<8006e9b4>] (handle_irq_event_percpu+0x78/0x134)
[  120.935716] [<8006e9b4>] (handle_irq_event_percpu) from [<8006eaac>] (handle_irq_event+0x3c/0x5c)
[  120.944600] [<8006eaac>] (handle_irq_event) from [<800715d4>] (handle_fasteoi_irq+0xe0/0x198)
[  120.953138] [<800715d4>] (handle_fasteoi_irq) from [<8006e054>] (generic_handle_irq+0x2c/0x3c)
[  120.961763] [<8006e054>] (generic_handle_irq) from [<8006e30c>] (__handle_domain_irq+0x7c/0xec)
[  120.970476] [<8006e30c>] (__handle_domain_irq) from [<80009454>] (gic_handle_irq+0x24/0x5c)
[  120.978842] [<80009454>] (gic_handle_irq) from [<80013240>] (__irq_svc+0x40/0x74)
[  120.986330] Exception stack(0x80bd9f18 to 0x80bd9f60)
[  120.991387] 9f00:                                                       80bd9f60 fffffff7
[  120.999575] 9f20: 18352e17 0000001c 97b91df8 00000001 1833b864 0000001c 18352e17 0000001c
[  121.007761] 9f40: 00000001 00000000 00000017 80bd9f60 a6aaaaab 80585390 20000013 ffffffff
[  121.015956] [<80013240>] (__irq_svc) from [<80585390>] (cpuidle_enter_state+0xd8/0x208)
[  121.023977] [<80585390>] (cpuidle_enter_state) from [<80065d9c>] (cpu_startup_entry+0x1fc/0x320)
[  121.032778] [<80065d9c>] (cpu_startup_entry) from [<80b52c5c>] (start_kernel+0x39c/0x3a8)
[  121.040965] Code: f5d1f05c f5d1f07c e8b151f8 e2522020 (e8a051f8) 
[  121.047070] ---[ end trace b7ff04b26e49fad5 ]---
[  121.051695] Kernel panic - not syncing: Fatal exception in interrupt
[  121.058058] ---[ end Kernel panic - not syncing: Fatal exception in interrupt

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
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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