最近项目里需要做一个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