找回密码
 -注册-
查看: 32379|回复: 75
打印 上一主题 下一主题

【原创】拒绝YY 从基础讲解USB/UAC运作原理

[复制链接]
跳转到指定楼层
1
发表于 2017-4-23 19:58 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式 来自 上海
本帖最后由 aarwwefdds 于 2017-4-23 21:20 编辑

USB是通用串行总线的意思,本质上并不是专门用来传输音频数据的。这里先简单列举USB2.0几个特性:双绞线、带电源、数据速率与传输频率无关、自同步(不需要单独传输时钟)、Token(令牌)轮询特性[1]。双绞线的特性使得USB天生具有抗共模干扰的能力,带供电使得它带的设备可以不需要电源,令牌轮询特性用于“交通管制”。

USB是主从模式的总线,Host控制器决定它下面所有设备一切事务的发送/接收时机。全速下,Host每1ms±500μs生成一个“帧”(frame)。高速下,每125us±0.0625μs生成一个“帧”[2]。一个“帧”以SOF包打头,包含发送给同一个Host控制器下的不同设备的若干个USB数据包。因此同一个控制器下的USB设备带宽共享:


在同一个USB控制器上的全速设备(FullSpeed/FS)、低速设备(LowSpeed/LS)设备之间共享带宽。高速设备(HighSpeed/HS)之间共享带宽,不与全速/低速设备共享,甚至很多南桥会单独设计高速USB2.0控制器。这种共享带宽,在下行中是这样实现的:Host设备发给高速设备 H1的数据包,高速设备H2同样会收到相同的数据包,但是因为接收地址与自身地址不符,H2设备会无视该数据包。同样的,Host发给F1全速设备的数据包,F2全速设备和L1/L2慢速设备也会收到同样的包,但是会将其无视。[3]

上行带宽共享则是由主机控制:除非主机在“帧”中发送了IN包告诉这个设备准许发送数据,否则设备不允许发送数据。这样就避免了冲突产生。

USB有四种传输通道类型(Endpoint):控制(Control)、中断(Interrupt)、批量(Bulk)、同步(Isochronous)。
Control用于USB总线控制等(所有设备都有),Interrupt多用于鼠标键盘的数据传输(其实在USB令牌轮询的特性下这是个伪Interrupt),Bulk多用于U盘数据传输。
前三种类型都有重传,各有特点这里略过。但USB音频类(USB Audio Class,简称UAC)采用的音频数据传输是第四种端口,也就是Isochronous,拥有错误检测机制,但是没有重传。

为何没有重传呢。
一是音频/视频是很讲究“实时性”的,否则会音画不同步,带来的恶果是很蛋疼的。因此音频/视频设备本质上都需要与主机同步,重传会打乱同步。
二是同步(Isochronous)类型因为要求低延迟,不像别的传输类型有握手过程,同一个"传输端口"内数据包是单向移动的(要么入要么出),Host不会给一个OUT方向的同步传输通道发送IN包,没有办法引入重传机制(发生错误时无法通知主机)。[4]
另外还有一点,为了“同步”,每个“帧”中的每个同步(Isochronous)通道只会传送一次数据。

这里有人要问了 用一个IN和一个OUT的Isochronous通道不就可以解决错误处理了?(ASYNC异步下也确实有一对IN和OUT通道,具体作用下文会解释,反正不是用来“错误检测”)

事实上,不可能。Host在一个Frame中轮询各个Endpoint的顺序是不可知的,很可能Host在一个Frame中先轮询了你的IN通道,但此时Host还没给你的OUT通道传送数据。这样就产生了:数据还没发送 怎么能确认数据收到了呢。


但这是否值得担忧呢?USB自身抗干扰特性(双绞线/屏蔽层)使得正常/正确使用的情况下,产生错误的概率非常非常低。真产生错误了,设备因为CRC校验失败,会将错误的USB数据包丢弃,而这会导致USB界面缓冲区欠载,导致短暂静音/爆音
76
发表于 2023-1-22 13:25 | 只看该作者 来自 陕西
挖个帖。
大佬我想问问很多玩OSU这种对延迟比较敏感游戏的玩家常常说独立解码器会有声画不同步的情况,他们反而推荐使用板载声卡。
请问属实吗?(我自己没这方面感受),是什么原因造成的?
回复

使用道具 举报

75
发表于 2018-12-17 10:22 | 只看该作者 来自 山东济南
ppqppqpp 发表于 2018-12-14 21:18
20年经验老师傅,专业维修菊花

菊花很健康,暂无维修需求
回复

使用道具 举报

74
发表于 2018-12-14 21:18 | 只看该作者 来自 浙江衢州
专业尸体 发表于 2018-12-14 17:02
楼主你好,本人小白刚接触一点usb音频,我enable了playback interface之后,给isochronous endpoint按照max ...

20年经验老师傅,专业维修菊花
回复

使用道具 举报

73
发表于 2018-12-14 17:02 | 只看该作者 来自 山东济南
楼主你好,本人小白刚接触一点usb音频,我enable了playback interface之后,给isochronous endpoint按照maxpacketsize和interval发送pcm数据,从耳机那边只能听到嗡嗡的杂音,请问这是问什么呀?
回复

使用道具 举报

72
发表于 2017-10-22 21:29 | 只看该作者 来自 山东
天将明 发表于 2017-10-22 03:25
虽然我没有看懂,但我怎么觉得这个意思是USB现在是个100马力的发动机,难题就在如何基于它做出好车。

  正是这个意思,通用性上USB无可匹敌
  协议和技术上可以挖掘的东西还有很多,而且支持的格式也多
回复

使用道具 举报

71
发表于 2017-10-22 03:25 | 只看该作者 来自 北美地区
wangzx998 发表于 2017-10-21 00:03
usb这个东西通用程度太高,不止音频传输,设备输入输出慢慢都做成USB了
  可能没资格评论这个技术文( ...

虽然我没有看懂,但我怎么觉得这个意思是USB现在是个100马力的发动机,难题就在如何基于它做出好车。
回复

使用道具 举报

70
发表于 2017-10-21 21:23 | 只看该作者 来自 福建福州
rgwan 发表于 2017-10-21 15:54
公开了,欢迎去我的GitHub。最近缺钱,打算做一个套件回血。到时候板子我能免费送一波,器件就没法送了。 ...

你的GitHub???恕我孤陋寡闻,查了下,不是软件项目的托管平台吗?给个访问方式呀~~~有空可以捧捧场的说呢。

期待早日能成功吧~~~因为每年这么多身怀“高大上”作品的人被淹没在茫茫人海中。祝阁下能脱颖而出吧。

=================================================================================

理论上人耳虽然听不出来20K以上的正弦波,但是不代表人耳听不出20K以上信号对20K以内信号的影响。所以个人是认同高采样是会带来可闻的听感改善。同样高BIT带来的动态和细节上的提升应该更容易让人感觉到提高。这就是我在B站那个视频里坚持的理论,只是表达方式上可能被人带歪了。
回复

使用道具 举报

69
发表于 2017-10-21 15:54 | 只看该作者 来自 四川成都
本帖最后由 rgwan 于 2017-10-21 15:58 编辑
蓝子风 发表于 2017-10-20 23:01
B站上的那个呀,如果纯粹正弦波可以没问题,但是问题是音频信号中不止正弦波。你的很多信号理论也基本是 ...

公开了,欢迎去我的GitHub。最近缺钱,打算做一个套件回血。到时候板子我能免费送一波,器件就没法送了。

另外的,20k的非正弦波当然会被切除高频谐波变为正弦波,毕竟数字采样只能够表示带限信号。不过……首先你得能分辨的出20k以上谐波的存在……
回复

使用道具 举报

68
发表于 2017-10-21 00:03 | 只看该作者 来自 山东
wangzx998 发表于 2017-10-20 23:58
技术文好评,虽然难以看懂
  个人见解,HIFI烧油,也是PC攒机烧友
  相对于笔记本,尽量不要USB直连,O ...

  usb这个东西通用程度太高,不止音频传输,设备输入输出慢慢都做成USB了
  可能没资格评论这个技术文(因为这些东西真的不懂啊)
  但是这是趋势,USB相当于一台1000马力的八缸发动机了,怎么基于这个心脏做出好车,匹配好变速箱已经不是发动机的问题了
回复

使用道具 举报

67
发表于 2017-10-20 23:58 | 只看该作者 来自 山东
  技术文好评,虽然难以看懂
  个人见解,HIFI烧油,也是PC攒机烧友
  相对于笔记本,尽量不要USB直连,OEM的板子用料什么的不会太好。
  攒机里对于声卡就不必多说了,ROG的板子声卡也不会太好
  至于USB,现在都是3.0,3.1的时代了,稍微超频好点的板子用料,元器件都不会太差。
  发射端完全就不是瓶颈,看你收不收得到了,而且USB还可以绕过板载声卡(我的板载都是关闭的不用)
  USB是趋势,以后PCHIFI会占大多数,界面无可匹敌,通用性无敌~
  手上是华擎X370太极,买根乐机宝得的线刚开始有刺啦声,现在完全没有,听的美滋滋~
回复

使用道具 举报

66
发表于 2017-10-20 23:01 | 只看该作者 来自 福建福州
本帖最后由 蓝子风 于 2017-10-20 23:14 编辑
rgwan 发表于 2017-10-18 23:14
求仔细读文档,看不懂就看实现……别上来就言之凿凿

上次在B站闲逛还看到你和其他人争论频率分辨 ...

B站上的那个呀,如果纯粹正弦波可以没问题,但是问题是音频信号中不止正弦波。你的很多信号理论也基本是根据这样的,比如22.05K信号只有2个采样的波形,你怎么分辨是正弦波还是三角波或者方波?所以其实越接近采样表达的极限,会有一定的问题。因为很多差不多比较高频的非线性波形,包含的谐波成分已经远超过这个频段了。所以就造成了损失。而很多这样的波形变化,是人耳可以分辨出来的。这也是为什么虽然人耳只能听到20-20K的音频信号,但是高采样高比特在声音上会比CD标准的16BIT/44.1K要出色。

有些时候是有认知错误,是真的错了,自然需要改正。我也有过不少的认知错误,比如早期的时候对于异步模式的理解错误。

当然了,你是专业者,或者你可以直接按照自己的元件用FPGA什么的搭一个你所谓的信号理论出来的USB DAC???
回复

使用道具 举报

65
发表于 2017-10-18 23:14 | 只看该作者 来自 四川成都
蓝子风 发表于 2017-4-28 09:45
按照USB规范,是BULK

求仔细读文档,看不懂就看实现……别上来就言之凿凿

上次在B站闲逛还看到你和其他人争论频率分辨率是和采样率有关还是跟分析窗口有关……本来很想发给你一本奥本海姆的信号与系统,可惜没绑手机发不出去233333333

回复

使用道具 举报

64
发表于 2017-10-18 22:54 | 只看该作者 来自 四川成都
本帖最后由 rgwan 于 2017-10-18 23:17 编辑
TokuRin 发表于 2017-9-23 21:42
我可能大背景没描述!

我是在Linux下,在应用层,去实现uac2.0协议(绕过了底层uac驱动),和外接音频解 ...

在应用层(user-space)上,实时性是比较难保证的,你可能遇到的是丢帧和长度调整不到位的问题(跟随声卡要求)。建议你还是用内核驱动,但是独占ALSA接口。

回复

使用道具 举报

63
发表于 2017-10-18 22:52 | 只看该作者 来自 四川成都
本帖最后由 rgwan 于 2017-10-18 22:58 编辑
aarwwefdds 发表于 2017-4-23 21:53
其实buffer也没那么精贵,现在的设备挂个几兆RAM轻而易举的事情,也不增加多少成本

主要是现在有两种 ...

其实这个东西还得看芯片。对通用单片机/FPGA之类的没APLL电路的芯片来说。做异步反而简单。如果系统有可以lock住SOF的PLL,那就是做同步简单了。

我个人还是比较喜欢做异步,因为好控制,对现在我手上的平台来说,实现比较简单(虽然对PC上需要实时应用的软件不友好),也比较好控制。近期打算公开一个STM32F205+CPLD UAC1、UAC2的实现,有空可以去我GitHub逛逛。

回复

使用道具 举报

62
 楼主| 发表于 2017-9-24 22:04 | 只看该作者 来自 上海
TokuRin 发表于 2017-9-23 21:42
我可能大背景没描述!

我是在Linux下,在应用层,去实现uac2.0协议(绕过了底层uac驱动),和外接音频解 ...

我觉得你应该考虑是扩声道,位深可能不是问题
回复

使用道具 举报

61
发表于 2017-9-23 21:42 | 只看该作者 来自 中国
我可能大背景没描述!

我是在Linux下,在应用层,去实现uac2.0协议(绕过了底层uac驱动),和外接音频解码器通信。
现在已经能够完全识别设备,并进行控制传输。
在播放音频时,即同步传输(iso)时,播放效果很乱(音频失真还有杂音)。

外接音频解码器:32bit,4声道。(设备信息中读取的)
音源:16bit,2声道。

按照你的讲解,我应该要把音源数据转换成32bit、4声道,再传给外设就OK?
回复

使用道具 举报

60
 楼主| 发表于 2017-9-23 19:34 | 只看该作者 来自 上海
TokuRin 发表于 2017-9-23 17:57
多谢回复!!!
所以,是通过主机端软件修改音频数据,达到主机端和外设端相互匹配bit参数的(外设的bit ...

descriptor这玩意你改不了

然后是,(排除掉软件混音设备和SRC)在主机端处理过程中其实都是32位的。最后再根据需要裁切或者塞0。这个过程对音质无损

外设是4声道,音源是2声道的话。看你自己怎么弄,你可以把2声道直接输出到FL和FR(这个映射你可以自己在驱动面板设置或者驱动也有默认映射信息)。或者扩展成4声道输出给设备。一般情况下这些是主机端软件完成
回复

使用道具 举报

59
发表于 2017-9-23 17:57 | 只看该作者 来自 中国
aarwwefdds 发表于 2017-9-23 04:16
最好的办法就是直接塞0了。方便处理

而且在某些情况下,例如在播放过程中应用了DSP,你可以很方便的从 ...

多谢回复!!!
所以,是通过主机端软件修改音频数据,达到主机端和外设端相互匹配bit参数的(外设的bit值是恒定的)。而不是通过向外设发送控制请求,修改外设参数。
这样理解?

在问一下,主机和外设的通道数需要匹配么?
例如,主机端拿到的音频数据是2声道,外设如果是4声道,那这个转换,需要那边来做?

回复

使用道具 举报

58
发表于 2017-9-23 07:15 来自手机 | 只看该作者 来自 广东
好帖战马。换一条线就能有提升?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | -注册-

本版积分规则

Archiver|手机版|粤icp备09046054号|耳机网-耳机大家坛

粤公网安备 44030602000598号 耳机大家坛、www.erji.net、网站LOGO图形均为注册商标

GMT+8, 2024-11-22 04:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表