Linux - UAC USB声卡

最近项目里需要做一个linux平台的USB声卡,及通过USB插入Android设备,可识别成为一个USB声卡设备,并通过UAC采集录音 也可通过UAC播放音频的功能;

USB-HID定义

USB HID类是USB设备的一个标准设备类,包括的设备非常多。HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标、USB键盘、USB游戏操纵杆等。但HID设备类不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

USB HID设备的一个好处就是操作系统自带了HID类的驱动程序,而用户无需去开发驱动程序,只要使用API系统调用即可完成通信。

UAC定义

任何USB设备在连接到USB接口后,主机检测到有新设备接入,会利用不同的请求命令(Request)查询该设备的属性,设备通过不同的描述符向主机报告自己的情况。包括设备的种类,设备的功能,设备具有的端点数量以及其他工作属性等等。在了解这些信息之后,主机就可以根据需要分配USB工作带宽。
在USB中USB HOST 是通过各种描述符来识别设备的,有 设备描述符,接口描述符,端点描述符,字符描述符,报告描述符等
USB HID 设备 (人机交互操作的设备) 是通过报告来传送数据的,报告有:输入报告 和 输出报告
USB Audio Class,USB音频类,一个像USB这样的通用数据接口,可以有很多种实现数字音频数据传输的方式。不同的开发者可以根据自己的喜好和需求,定义任意的控制方式,传输模式,音频格式等等参数。

本文档提供Rockchip平台基于Linux4.4内核的USB Gadget UAC (USB Audio Class)驱动的使用方法。Rockchip平台可以支持UAC1 (兼容USB Audio Class specification 1.0)和UAC2 (兼容USB Audio Class specification2.0)驱动,并且,这两个驱动都可以支持基础的录音和放音功能。此外, Rockchip平台还提供了UAC1 Legacy(需要实际的声卡支持,只支持放音功能)和Audio Source (只支持录音功能,但可以支持多达15种不同的采样率)。开发人员可以根据产品的实际需求来选择合适的UAC驱动。如果要支持音量调节/静音功能,需要添加HID的控制,目前发布的SDK还没有支持。开发人员可以参考如下的文档进行HID功能的开发。

Kernel/Documentation/usb/gadget-testing.txt (参考 6. HID function)
Kernel/Documentation/ABI/testing/configfs-usb-gadget-hid
Universal Serial Bus Audio Device Class Specification for Basic Audio Devices (参考 8 HID Support in Basic
Audio Devices)

UAC设置

Note:USB Audio 1.0 Specification在USB 2.0 core Specification之前完成,因此USB Audio 1.0 Specification没有高速模式(High Speed)这一概念。可以通过一些经验规则使得Audio 1.0兼容设备在特定的操作系统上实现高速模式。比如修改isochronous endpoint descriptor的blnterval4,目前尚没有详尽的经验规则保证在所有的操作系统上都能正常工作在高速模式下。
Rockchip平台UAC1驱动支持USB Audio Class specification 1.0,支持录音和放音,并且不需要实际的声卡。UAC1驱动设置bInterval=4.
默认支持:
速率: High Speed
采样率: playback和capture都为48 KHz,可以通过内核提供的接口配置为其他采样率
声道数: playback和capture都为2 Channels,最多支持双声道,可以通过内核提供的接口配置为单声道
位深度: playback和capture都为16 bits
UAC1使用方法如下
添加CONFIG-USB-CONFIGFSFUAC1-y到内核的defconfig
以3308 EVB为例配置UAC1的脚本参考如下:

mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/rockchip -m 0770
echo 0x2207 > /sys/kernel/config/usb_gadget/rockchip/idVendor
echo 0x0019 > /sys/kernel/config/usb_gadget/rockchip/idProduct
echo 0x0100 > /sys/kernel/config/usb_gadget/rockchip/bcdDevice
mkdir /sys/kernel/config/usb_gadget/rockchip/strings/0x409 -m 0770
echo "0123456789ABCDEF" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/serialnumber
echo "rockchip" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/manufacturer
echo "USB Audio Device" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/product
mkdir /sys/kernel/config/usb_gadget/rockchip/configs/b.1 -m 0770
mkdir /sys/kernel/config/usb_gadget/rockchip/configs/b.1/strings/0x409 -m 0770
echo 500 > /sys/kernel/config/usb_gadget/rockchip/configs/b.1/MaxPower
echo "uac1" >
/sys/kernel/config/usb_gadget/rockchip/configs/b.1/strings/0x409/configuration
mkdir /sys/kernel/config/usb_gadget/rockchip/functions/uac1.gs0
ln -s /sys/kernel/config/usb_gadget/rockchip/functions/uac1.gs0
/sys/kernel/config/usb_gadget/rockchip/configs/b.1/uac1.gs0
echo ff400000.usb > /sys/kernel/config/usb_gadget/rockchip/UDC

假如3308开机后,默认运行了ADB配置脚本,会导致上述的配置方法出错,在调试阶段,可以手动执行如下命令来配置UAC1功能。最终产品的USB配置脚本,需要根据实际的需求来整合ADB和UAC1的配置脚本。

rm -rf /sys/kernel/config/usb_gadget/rockchip/configs/b.1/ffs.adb
mkdir /sys/kernel/config/usb_gadget/rockchip/functions/uac1.gs0
echo 0x0019 > /sys/kernel/config/usb_gadget/rockchip/idProduct
echo 0x0100 > /sys/kernel/config/usb_gadget/rockchip/bcdDevice
echo "USB Audio Device" > /sys/kernel/config/usb_gadget/rockchip/strings/0x409/product
echo "uac1" >
/sys/kernel/config/usb_gadget/rockchip/configs/b.1/strings/0x409/configuration
cd /sys/kernel/config/usb_gadget/rockchip/configs/b.1
ln -s ../../functions/uac1.gs0
echo ff400000.usb > ../../UDC

Note:"dProduct"可以根据产品自行定义,但不能与产品的其他USB Function idProduct冲突
"UDC"为USB控制器名称,对应/sys/class/udc/控制器名称Windows会对设备驱动记忆,更改配置后最好卸载驱动,让Windows重新识别设备
配置脚本执行成功后,连接USB到PC, PC端可以识别到USB Audio设备,如下图2-1 Windows-USB-Audio-Class1 ,图2-2 Ubuntu-USB-Audio-Class 1-Output和图2-3 Ubuntu-USB-Audio-Class1-input

在Windows下识别出UAC
在这里插入图片描述

在ubuntu中识别出UAC在这里插入图片描述

UAC 测试

这里不详细阐述;
提供个思路:
1)将UAC插入到Windows中;确定正确枚举到设备
2)测试UAC录音:UAC通过串口使用tinyplay播放一段格式正确的pcm音频,Windows端使用录音机录制,UAC播放完毕后,通过Windows的录音软件去判断录制到的音频文件是否是UAC播放的,对则合适;
3)测试UAC放音:UAC通过串口使用tinycap录制一段格式正确的pcm音频,Windows端使用播放软件播放一点pcm,Windows播放完毕后,通过串口查看的录音去判断录制到的音频文件是否是Windows播放的,对则合适;

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂泊在海上的星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值