Linux USB Gadget UAC1复合麦克风扬声器大功告成?
2025-09-23
0
0
上一篇文章大概说了一下在搞UAC1复合麦克风扬声器,当时也仅是将设备复合出来了,没有进行数据的通讯处理。今天要说的是音频数据处理也”正常”了。
由于IMX6UL自带的扬声器和麦克风,本来的想法是相互独立。扬声器用IMX6UL自常的扬声器播放,而麦克风用自带的麦克风采集声音,可无奈u_uac1.h/c文件中并没有实现Linux麦克风的功能,所以此路对自己来说,当前有点不通。
所以,本人本着能方便就偷懒的方式重新规划了音频数据的链路。我的想法是既然麦克风无法获取真实的数据,何不妨使用扬声器的数据来回环。这让从Windows系统下来的扬声器音频数据,在UAC1驱动中兵分两路,一路直接使用IMX6UL自带的扬声器直接播放,另一路则掉转车头,从UAC1驱动中回到Gadget麦克风中,最终回到Windows系统中。这样,我们在Windows系统中使用使用Gadget扬声器播放的声音,可以通过Gadget麦克风再次采集回来。如果这时我们用我们的另一个扬声器来侦听该麦克风,就可以听到播放的声音。
不过一个不太好的消息是该驱动有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