Linux - UAC USB声卡

  • USB-HID定义
  • UAC定义
  • UAC设置
  • UAC 测试

最近项目里需要做一个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播放的,对则合适;

Linux - UAC USB声卡相关推荐

  1. Android/linux从usb声卡获取音频(使用libusb库)----环境,lsusb命令的介绍(一)

    Android/linux从usb声卡获取音频(使用libusb库)---环境,lsusb命令的介绍(一)        Android/linux从usb声卡获取音频(使用libusb库)---设备 ...

  2. Usb 声卡 linux,树莓派:使用usb声卡播放音乐

    ALSA命令 没有连接usb声卡时,树莓派只有缺省音频设备bcm2835 ALSA,连接usb声卡后可以看到USB Audio Device.ALSA是Linux下对声卡的管理命令,Jessie版本的 ...

  3. Linux内核USB总线--设备控制器驱动框架分析

    正文 1.概述 如下图所示,USB控制器可以呈现出两种不同的状态.USB控制器作为Host时,称为USB主机控制器,使用USB主机控制器驱动.USB控制器作为Device时,称为USB设备控制器,使用 ...

  4. linux创建虚拟声卡,Pear BIOS 安装和配置指引

    Pear BIOS 安装指引 Pear BIOS是一套硬件模拟系统,操作系统可以在这套模拟硬件上运行. Pear BIOS可以让用户同时安装多套操作系统,使用时可以选择任何一套操作系统启动. 在传统电 ...

  5. ubuntu18 usb耳机,ubuntu18.04 调试USB声卡

    由于项目需要进行声音播放,但是主板上没有声卡模块就使用USB外接声卡来实现音频播放. (项目使用ubuntu18.04的系统) 首先我们在主板上插入USB声卡,在终端中输入:lsusb $ lsusb ...

  6. 高品质USB声卡/音频芯片SSS1700|SSS1700设计96 KHz 24位采样率USB耳机麦克风方案|SSS1700中文设计方案讲解

    高品质USB声卡/音频芯片SSS1700|SSS1700设计96 KHz 24位采样率USB耳机麦克风方案|SSS1700中文设计方案讲解 台湾鑫创在2021年新推的一款SSS1700,是一款高品质U ...

  7. 嵌入式ARM下使用ALSA USB声卡

    你好!这里是风筝的博客, 欢迎和我一起多多交流. 使用Linux的一个好处就是里面集成了好多驱动,像USB声卡就是即插即用的,我们只需要下载一些使用库就ok. 我们现在要使用USB声卡,就需要alsa ...

  8. linux系统usb驱动怎么安装教程,MX Linux的闪存驱动器安装教程-电脑系统安装手册...

    MX Linux无疑是流行的中重Linux操作系统之一.它依赖于 Linux 和开源社区的出色上游工作.它的基础设计结合了优雅高效的桌面与简单的配置,高稳定性,坚实的性能和中等尺寸的占地面积.最重要的 ...

  9. USB声卡驱动(二):USB音频设备描述符

    USB声卡驱动(二)USB音频设备描述符 本篇笔记,分两部分,第一部分,是基本知识的记录.第二部分是一个实际的例子. 一.基本知识 一个音频设备(Audio Device)含有多个音频功能(Audio ...

最新文章

  1. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(3)--- 服务访问和配置模式...
  2. ubuntu eclipse mysql_Ubuntu设置、应用及常见问题解决(十)- 安装jdk+tomcat+eclipse+mysql...
  3. Java初学者都应该搞懂的六个问题
  4. php获取标准输入输出,shell--标准输入输出(readamp;echo)
  5. 分治——Secret Cow Code S(洛谷 P3612)
  6. 试题18 四平方和(枚举法)
  7. 爱奇艺影业,你明天还为传统电影业打工吗?
  8. 计算机中mac地址是什么意思,mac地址在计算机什么上
  9. matlab矩阵赋未知数,matlab设未知数
  10. 黑苹果Mac OS 12镜像下载 DMG
  11. 飞腾D20008核桌面处理器
  12. SQL注入原理-时间盲注
  13. 信息流广告文案与创意设计
  14. 深富策略:锂电光伏崛起 成长赛道再度回归
  15. “无法建立到信任根颁发机构的证书链问题解决,根证书的导入方法
  16. Redhat最小化安装后安装图形界面步骤
  17. Android 在分享列表添加自己的应用
  18. java使用es查询
  19. 国产GM8220,USB2.0集线器,替换汤铭的FE1.1,USB HUB,替换创维GL850
  20. XP系统下安装SQL Server2000标准版/企业版

热门文章

  1. CC2640R2F BLE5.0 CC2640R2F UART驱动
  2. PanoSim仿真模型--传感器模型之单目相机
  3. 证券市场低频日度数据
  4. 会话空闲时间已超过限度
  5. VMWARE安装苹果虚拟机,能联网能加AppleID
  6. 基于android的新闻系统开发,基于Android的新闻推荐系统的设计与实现
  7. matlab导入excel数据并作图
  8. 关于Protel 2004 绘制电路原理图——元件库的建立
  9. 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3
  10. 阿里云网站备案-备案流程问题解答汇总