USB UAC功能设备驱动的配置使用

该功能会用到USB, Audio功能。
对于USB音箱,数据流:PC->USB->设备->udc驱动->gadget驱动(UAC1)->应用层得到音频数据(操作生成的虚拟声卡进行录音)->应用层播放音频数据(操作实际播放声卡进行播放)
对于USB麦克风,数据流:设备端应用层拿到录音数据(操作实际录音声卡进行录音)->应用层播放录音数据(操作生成的虚拟声卡进行播放)->gadget(UAC1驱动)->udc驱动->USB->PC(执行录音程序)得到录音数据

配置使用方法

  1. 内核配置
    USB gadget UAC1内核配置:
    09812958f1b1b9677360c53cb94ff6726a3f10917060e028d0f5c14e0b46abe4QzpcVXNlcnNcY2FpeW9uZ2hlbmdcQXBwRGF0YVxSb2FtaW5nXERpbmdUYWxrXDQ1NjYyMzZfdjJcSW1hZ2VGaWxlc1wxNjQwNDg1ODg2MDA2XzEyOUYxNkRBLTkyOTItNGRhNi05REMxLTlGOTBEQzhCQkYxQi5wbmc=.png
    另外Audio相关播放、录音配置也需要配置。
  2. configfs配置
    一般直接输入命令即可:setusbconfig uac1
    具体配置内容可以查看package/base-files/setusbconfig-configfs该脚本
    个别需要注意的配置:
    设置通道数掩码,例如支持两通道:
    echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
    echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
    设置采样率:
    echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
    echo 48000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_srate
    我们的平台默认配置一般只有一个ISOC端点,所以默认setusbconfig只会使能一个USB playback:
    echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
    echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
    echo 48000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
  3. 测试验证方法
    默认配置使用了USB音箱模式,因此,需要将虚拟声卡的录音数据送到实际的播放声卡(例如audiocodec)中:
    arecord -Dhw:UAC1Gadget -f S16_LE -r 48000 -c 2 -t raw |aplay -Dhw:audiocodec -f S16_LE -r 48000 -c 2 -t raw
    (PC端注意选用新生成的播放设备进行播放)
    如果需要改成USB麦克风模式,需要修改下setusbconfig配置:
    echo 0x3 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_chmask
    echo 0 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/c_chmask
    echo 16000 > /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/p_srate
    这时候是将实际录音数据送到虚拟声卡中:
    arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 -t raw |aplay -Dhw:UAC1Gadget -f S16_LE -r 16000 -c 2 -t raw
    (PC端注意选用新生成的录音设备进行录音)

利用alsa的dsnoop插件,它不会因没有数据而返回-EIO错误
改动点:
/etc/asound.conf增加相关alsa配置:

pcm.CaptureUAC1 {
    type plug
    slave.pcm {
        type dsnoop
        ipc_key 3333
        ipc_perm 0666
        slave {
            pcm "hw:UAC1Gadget" 
            rate 48000
            channels 2
            period_size 1920
            periods 4
        }
    }
}

测试命令指定的名字需要从安排了arecord -Dhw:UAC1Gadget改成arecord -DCaptureUAC1,即:
arecord -DCaptureUAC1 -f S16_LE -r 48000 -c 2 |aplay