全志F1C上测试一下USB-Gadget-Audio功能
先上一张内核配置的图,图示是2.0配置,Audio_Gadget如果不选,手动配置也可以,只是比较麻烦一点,但是灵活。
以下测试平台是win10 build 1909

USB Gadget Audio Class 1.0 Legacy测试
这个得手动加载, 我测试modeprobe g_audio.ko会失败
1
2
3
4
5
6
7
8#insmod /lib/modules/5.4.99/kernel/drivers/usb/gadget/libcomposite.ko
#insmod /lib/modules/5.4.99/kernel/drivers/usb/gadget/function/u_audio.ko
#insmod /lib/modules/5.4.99/kernel/drivers/usb/gadget/function/usb_f_uac1_legacy.ko
#insmod /lib/modules/5.4.99/kernel/drivers/usb/gadget/legacy/g_audio.ko fn_play=/dev/snd/pcmC1D0p
g_audio gadget: Linux USB Audio Gadget, version: Feb 2, 2012
g_audio gadget: g_audio ready
g_audio gadget: high-speed config #1: Linux USB Audio Gadget电脑上会出现一个叫 AC INTERFACE 的声卡,使用自带的MediaPlayer测试声音正常,这种方式需要有实体的声卡,就是加载驱动时指定那个放音设备/dev/snd/pcmC1D0p,不指定的话,放音设备是/dev/snd/pcmC0D0p 录音设备是/dev/snd/pcmC0D0c,不需要其它操作,就可以直接使用了。
但是这种方式会独占那个声卡,其它程序是无法再访问那个设备了,而且我测试经过5个半小时,内核直接挂了,不知道什么原因,如下图所示,如果你想使用usb audio 其它程序也需要访问声卡,那么你可以使用下边第二种方式
USB Gadget Audio Class 1.0测试
这种方式在驱动加载后,系统会多出一张声卡,包含一个放音,一个录音设备,前边那种是不会出现任何设备的
modprobe g_audio.ko c_srate=48000 c_ssize=2 c_chmask=3 #48k 16bit 2ch
1
2
3
4[ 71.822514] g_audio gadget: Hardware params: access 3, format 2, channels 2, rate 48000
[ 71.830844] g_audio gadget: Linux USB Audio Gadget, version: Feb 2, 2012
[ 71.837646] g_audio gadget: g_audio ready
[ 72.123305] g_audio gadget: high-speed config #1: Linux USB Audio Gadget名字也叫 AC INTERFACE ,如果需要改名字,是在uac1.c里边修改,电脑播放音乐
执行 arecord -D hw:2,0 -f dat -vv | aplay -D hw:1,0 -f dat 可以听到电脑播放的音乐
这里我碰到点问题,就是下图那样子,如果电脑一直在播放音乐,那么是没问题的,如果把音乐停掉,或者直接就没播放,那么几秒后,会出现 “input/output error” , 然后 arecord就会退出,即使电脑端再播放也没用了,因为就没在录音乐,当然不会响了,不过出现这错误好像也合理的,因为电脑就没有发送数据,录的时候,缓冲区空了,自然就读取出错了,数据都没有当然也没法放了。那么问题来了,我怎么知道用户什么时候播放呢,只有播放时才能录音,其它时候就是I/O错误,录音进程会退出啊,请路过的大神给支点招?
USB Gadget Audio Class 2.0测试
最后就是uac2.0了,这个兼容性没有uac1.0好,从WIN10的某个版本才开始自带驱动的
执行 modprobe g_audio.ko c_srate=48000 c_ssize=2 c_chmask=3 #48k 16bit 2ch
模块能正常加载,设备管理器里会出现一个叫 Source/Sink的设备 尴尬的是设备却无法启动
1
2
3
4# modprobe g_audio.ko c_srate=48000 c_ssize=2 c_chmask=3 #48k 16bit 2ch
[11080.340854] g_audio gadget: Linux USB Audio Gadget, version: Feb 2, 2012
[11080.347699] g_audio gadget: g_audio ready
# [11080.625525] g_audio gadget: high-speed config #1: Linux USB Audio Gadget系统自带了usb audio 2.0 的驱动,还不清楚什么原因导致的,Android正常