simmconn 发表于 2010-2-11 15:57

乐之邦Monitor 01USD的得与失(三)山寨之声

乐之邦Monitor 01USD的得与失(三)山寨之声

大家看了标题可不要望文生义,以为这是一篇讲01USD的声音有多么山寨的文章。恰恰相反,01USD作为一款独特的厂机,今天成了我们“山寨”的对象。
首先声明一点,仿制的目的是分析、学习、改进和提高。用于仿制的硬件平台售价是01USD的两倍,所以并没有商业竞争的因素在里面。

01USD的玉照想必大家都见过,基本上是一个Cypress EZUSB FX2 USB接口芯片,加上一个Xilinx XC3S50A FPGA做音频数据处理,然后就是S/PDIF输出电路、电源电路等等。乐之邦给这两块芯片分别起了新名字,还好没有打磨重新标号。
简单地说,USB接口芯片把USB总线上的串行数据包转换成并行数据,写到输出FIFO里,然后由FPGA取走。USB接口芯片里还有一个8051单片机,负责处理设备请求、协调数据传输、配置和控制FPGA。一般来说单片机的处理能力不足以应付实时数据的要求,因此仅是起个协调作用。8051单片机运行的程序是固件的一部分,可以存在板上的EEPROM里,也可以由驱动程序下载。在01USD上,固件是由驱动程序下载的,成本低,便于升级。



01USD里面的FPGA按照播放的采样率定时从USB接口芯片的FIFO里取出并行音频数据,经过音量调节和混音后,转成S/PDIF格式的串行音频数据输出。FPGA还要负责用DCM生成音频时钟(参考《乐之邦Monitor 01USD的得与失》的前两部分)。FPGA的配置是由USB接口芯片里的8051单片机完成的,配置所需的数据(也即FPGA的映像文件)来自驱动程序。

上面的功能简述恐怕大家在别的评测网站上也能看到。下面我们来讨论一些具体问题。

首先是声卡的功能控制,包括启动、停止、调整采样率和音量的控制,另外还有读取APU版本号以及各个通道的音量等,是通过I2C总线来完成的。USB接口芯片是I2C总线的主设备。从设备有两个,一个是存储USB设备ID的EEPROM,另一个就是FPGA。在驱动版本1.0.5.0以后,EEPROM里面富余的空间还用来存储授权验证码。

系统的工作顺序基本是这样的:系统上电以后(插入USB插座),EZUSB自动从EEPROM里读取USB设备ID,并报告给主机。主机按照该ID装载匹配的驱动程序。驱动程序先是下载8051单片机的固件,然后配置FPGA,接着读取FPGA的APU版本号,并按上次存储的音量值设定音量控制。如果此时Musiland控制面板程序正在运行(活动窗口),驱动程序会不停地查询FPGA里面各路音源的音量值,用来实时显示音量表。

当播放程序开始播放时,调用驱动程序,先设定采样率,然后通知FPGA准备接受数据。播放程序接着通过驱动程序和USB总线向设备发送音频数据。当EZUSB的FIFO收到一定量的数据后,由一个标志信号通知FPGA可以开始取数据了。01USD同时支持WDM和ASIO,其硬件和软件也采用两个不同的通道(确切地说是三个通道,WDM左右声道共用一个通道,ASIO每个声道用一个通道)。这样设计的好处是在使用ASIO接口的播放程序时,Windows的系统声音,或另一个使用DirectSound或KernelStreaming的播放程序仍然能通过WDM通道把声音传出来。两个通道分别进行音量调节后,再进行混音然后输出。音量调节一般是用乘法器来实现,混音用加法器实现。播放结束的过程顺序与开始时相反。

接着介绍一下仿制所用的硬件平台:Digilent售价89美元的NEXYS。
NEXYS是一款有点过时的FPGA开发平台,使用的是Xilinx Spartan 3家族里面最早一代的XC3S400。虽然XC3S400的容量是XC3S50A的8倍左右,但其内部在时钟配置和灵活性方面并不及Spartan 3A。我想因此这样一块既有高速USB2.0接口,又有flash和PSRAM的开发板才会相对便宜。这款产品主要是面向大学学生学习逻辑设计用的,估计得到了很多IC厂商的价格优惠,板面上众多醒目的IC厂商标识也就不足为怪了。




仿制的一个目标就是尽量多地利用NEXYS的硬件功能,用最少的硬件改动实现01USD的基本功能。NEXYS板上的EZUSB也带有一块EEPROM,不过其容量比01USD上的EEPROM大得多,里面存放了与NEXYS板的管理软件配合的固件。为了能够继续使用NEXYS板的管理软件,我决定把这块EEPROM暂时脱离电路,在FPGA里用逻辑实现01USD上EEPROM的功能。这样一来,这块板做声卡用和做开发板用两不耽误。

下面讲讲仿制的过程。
仿制的第一步是尽量了解你要仿制的东西(废话)。这里的关键是“尽量”,并不是要了解所有的细节才能开始动手。拿01USD做例子,它的驱动程序是如何工作的就不是十分重要,可以(也只能)把它当作一个黑盒子来看待。它的8051固件是如何工作的也不是十分重要。由于EZUSB是通用器件,FPGA的输入输出接口也相对简单,我们只需要侧重于以下几点:首先是FPGA用怎样的方法从EZUSB里面取数据;其次是驱动程序加载时以及控制面板设定改变时,EZUSB对FPGA有什么动作;第三是播放程序启动和停止时对FPGA有什么影响。当然,少不了对具体硬件线路的测绘,好在EZUSB和FPGA之间的连线并不多。



明白人要问了,从1.0.5.0版的驱动开始,乐之邦为了防山寨,在产品中加入了授权验证机制,还大动干戈地要求每个用户都把序列号email回去才能获得驱动升级所需的授权。我相信乐之邦的验证机制具有很高的保密性,我至今对它的具体工作原理也一无所知,但这并不妨碍仿制工作。再复杂的加密解密体系总有它最薄弱的一环,只要找到这个薄弱环节就够了。至于这个薄弱环节到底是什么,我们还是给厂家留个面子,在此就不公布具体细节了。

秀一秀“知己知彼”用的工具,从YLJ里淘来的价值700美元的MIIC-101 I2C总线分析仪,



第二步是根据已经掌握的材料将系统按功能分解,画出FPGA逻辑功能框图。


FPGA部分共有五个功能模块:I2C接口模块、配置寄存器组、USB FIFO接口模块、音频输出模块和显示模块。
I2C接口模块负责与EZUSB的I2C控制器通信。与常见的I2C从设备不同的是,“山寨版”的模块会响应两个不同的设备地址,一个是EEPROM的地址,另一个是FPGA配置寄存器组的地址。I2C接口模块把EZUSB来的读写请求转发给配置寄存器组。
配置寄存器组是FPGA的控制中心,它不但存储了USB设备ID,还负责控制其它功能模块的启/停,采样率和音频时钟的切换等。
USB FIFO接口模块负责生成EZUSB slave FIFO的工作时序,从FIFO里读出8-bit的数据,然后将其拼成左右两个声道各32-bit的并行音频数据,送给音频输出模块。USB FIFO接口模块同时负责WDM和ASIO通道的混音。
音频输出模块有I2S输出和S/PDIF输出两项功能。两者使用USB FIFO接口模块传来的同一份音频数据,并共享一部分控制逻辑。
显示模块最为简单,它只是把控制寄存器组传来的采样率信息转换成4位7段数码管扫描显示的输出信号。

第三步当然是写FPGA代码的苦差事了。既然是DIY,就可以不必拘泥于厂机的功能。为了简单起见,有些01USD功能就没有实现。首先是音量调节功能,数字声卡重在原汁原味的数据完整性,除非不得已,最好不要用数字音量调节功能。其次是音量表,这个就不用说了。第三是WDM与ASIO的混音问题。由于数字声卡对过载十分敏感。两个音源叠加,不加处理简单相加的话一定会失真得一塌糊涂。既然是DIY,这里就偷个懒,用最简单的混音方式:单独使用WDM或ASIO时,音量总是100%(一个bit不差);两者同时使用时各占50%。例如用ASIO听歌的时候传来系统声音,音乐声会被衰减6dB,系统声音结束后再恢复正常。这就像你在看电视的时候来了电话,电视的音量自动减小,不影响你接电话;接完电话以后,电视的音量自动复原。

“山寨”就是要有山寨的特点,首先是利用开发板上的4位7段数码管显示当前的采样率,这个很简单。第二个山寨功能有点“恶搞”:我们可以把APU的版本号改成随便什么数字,乐之邦的控制面板都会照显示不误。



对乐之邦Monitor系列比较有争议的一点是用DCM实现数字时钟合成。Xilinx原厂不推荐使用两个DCM级连作频率合成,因为这样做的jitter很大。厂家给出了jitter的估算公式,并在FPGA开发环境ISE里屏蔽了两个DCM级连作频率合成的功能。不过厂家的估计比较保守,是按照FPGA里大量逻辑功能同时工作在较高频率,并使用了大多数I/O的条件下给出的。个人看法是用于音频的FPGA属于轻载工作,也只使用了很少数的I/O,所以01USD实测jitter的结果还不错。只是XC3S50A里面只有两个DCM,无法同时精确合成44.1KHz和48kHz两种采样率所需的时钟(参见《乐之邦Monitor 01USD的得与失》第一部分)。最近发布的1.0.8.x驱动采用了运行时重新配置FPGA的方案,虽然能够精确合成音频时钟,但采样率切换时有2秒左右的延迟。硬件资源的限制在现有产品上是无法克服的。

我的“山寨版”使用外部时钟源,这样一来玩家可以用高精度的晶振提供音频时钟。即使是最便宜的晶振,精度也比01USD的“快速模式”高。我在这里用了一只22.5970MHz的晶振,与标准频率22.5792MHz理论误差不到9ppm,实测误差23ppm;与DCM合成的理论误差400ppm、实测500ppm相比改善了很多。更重要的是,玩家可以用高精度时钟源直接供给DAC芯片,然后让FPGA作为从设备,只提供数据,不再占据时钟信号的通路。与ASRC相比,既得到了低抖动的时钟,又保证了数据完整性,不必担心ASRC差强人意的数字滤波器改变音频数据。在FPGA与DAC之间还可以插入隔离电路,隔断PC与DAC之间的电气联系,杜绝PC的开关电源干扰和地线回路问题。隔离电路可以由光藕组成,也可以采用电容或电感耦合原理的隔离芯片。



接下来是调试。调试的过程出乎意料的顺利。WDM几乎不用调试就出声了,ASIO模式在解决了一个小bug以后也顺利出声。在调试过程中也出现了诸如一个声道出声、另一个声道出噪音,以及ASIO和WDM同时发声时输出失真等问题。这些问题或多或少与01USD的工作机制有关。既然了解了问题产生的原因,今后在构建自己的USB声卡时就可以克服。

从开始写代码到调试成功,大概花了我2周的业余时间。要知道这只是一个产品开发工作量的一小部分,EZUSB的固件大概要占据与FPGA开发相当的工作量,驱动程序的开发和维护则要多出好几倍。山寨版只是绕过了庞大的软件开发工作,坐享其成而已。山寨过程的成功,说明厂家的“APU”并不是那么神秘,但同时也体会出USB声卡的开发有很多细节问题需要考虑,并不是信手拈来的。

山寨的结果是手里拥有一套“自主知识产权”的FPGA功能模块,虽说这些模块的功能很简单,但毕竟是自己开发的,与网上那些开源的,受GPL或类似授权协议限制的IP还是不同。尽管现在的“山寨版”只支持1.0.5.0驱动,但我们并不是为了山寨而山寨,也没有必要跟踪乐之邦每个新版驱动程序的改动。接下来要做的,是搭建自己的高速多通道数字USB声卡,等待Windows7对USB Audio Class 2.0的支持。C-media和VIA都有了类似的IC产品,为什么还要DIY呢?DIY的结果不见得比厂机好,也不见得更便宜,但那是自己双手创造出来的成果。依我看这正是音响DIY发烧友的追求,也是本论坛存在的意义所在。

最后来一张山寨版的工作照

drcy 发表于 2010-2-11 16:20

可以借来试听吗?

iflyingpig 发表于 2010-2-11 16:28

这样的帖子严重要顶!!!

skyman 发表于 2010-2-11 16:34

阿牛哥一个!!!

iflyingpig 发表于 2010-2-11 16:37

ezusb和fpga的接口是重点,想必楼主用了逻分抓取一把数据,用来分析ezusb如何控制fpga的。

simmconn 发表于 2010-2-11 17:05

ezusb和fpga的接口是重点,想必楼主用了逻分抓取一把数据,用来分析ezusb如何控制fpga的。
iflyingpig 发表于 2010-2-11 16:37 http://bbs.hifidiy.net/images/common/back.gif
还好,只用双通道的数字示波器就够了。数据格式主要是在PC上用软件抓的(sniffUSB)。
家里有逻分,但是这次没派上用场。那天在耳坛上HerculesVR说逻分是山寨专用的,汗呀!还好这次是清白的,下次就没准了。

simon_zsw 发表于 2010-2-11 17:25

LZ的技术贴要顶,硬件层也有sniffer啊,长见识了,新版驱动不是说SRC成44.1的偶倍数么?

iflyingpig 发表于 2010-2-11 18:11

6# simmconn

哈哈,逻分甚强大。
那天我们用安捷伦AG16802抓SPI口数据,然后同事写了MATLAB程序分析结果: 在什么时刻配置哪个寄存器,配置了什么参数一目了然。无敌方便

卡西利亚斯 发表于 2010-2-11 19:51

我正好想年后弄一张68013做USB-HS开发,后面就接DSC或CM-3那些多功能带DMA的单片机。
速度基本够,RAM够大,直接用C开发......

LZ说得有点明白了,希望斟酌后修改下,不然山寨01USD就要上市了.........

对了,去年某时我在某EE论坛上看到到有人外包一个68013+FPGA做支持192的USB声卡的项目,还要求带ASIO,估计就是乐之邦吧~~~外包又省时又省事............

卡西利亚斯 发表于 2010-2-11 20:13

其实老早就看到老外卖USB2.0 的音频设计,
CY的接口,FW放在24里.....然后P口和FPGA做互动........

lter15 发表于 2010-2-11 20:58

太强大了

simon_zsw 发表于 2010-2-12 00:18

我正好想年后弄一张68013做USB-HS开发,后面就接DSC或CM-3那些多功能带DMA的单片机。
速度基本够,RAM够大,直接用C开发......

LZ说得有点明白了,希望斟酌后修改下,不然山寨01USD就要上市了.........

对了, ...
卡西利亚斯 发表于 2010-2-11 19:51 http://bbs.hifidiy.net/images/common/back.gif
山寨01US一早存在,不然XX邦也不会用到固件认证升级这招

simmconn 发表于 2010-2-12 03:47

我正好想年后弄一张68013做USB-HS开发,后面就接DSC或CM-3那些多功能带DMA的单片机。
速度基本够,RAM够大,直接用C开发......

LZ说得有点明白了,希望斟酌后修改下,不然山寨01USD就要上市了.........

对了, ...
卡西利亚斯 发表于 2010-2-11 19:51 http://bbs.hifidiy.net/images/common/back.gif

还好啦,既没有公布源代码,也没有寄存器定义,如果有人根据功能框图就能开发出一个山寨版的话,那他不用我这篇文章也能搞出来了。

simmconn 发表于 2010-2-12 03:49


山寨01US一早存在,不然XX邦也不会用到固件认证升级这招
simon_zsw 发表于 2010-2-12 00:18 http://bbs.hifidiy.net/images/common/back.gif

根据授权验证方案推出的时间来看,倒像是由于某个用户在客户论坛上提醒了他们一下造成的。

simon_zsw 发表于 2010-2-12 09:30



根据授权验证方案推出的时间来看,倒像是由于某个用户在客户论坛上提醒了他们一下造成的。
simmconn 发表于 2010-2-12 03:49 http://bbs.hifidiy.net/images/common/back.gif
嗯,半路冒出来的,不是一开始设计硬件时的整体方案,就因为半路出来,做得不完善容易误刷成砖,传说传说,认证就是针对山寨而出现,当然了,要是像LZ那样分析底层数据,模仿时钟的动作的话,多牛的加密也.......:lol

aihifi 发表于 2010-2-12 10:32

非常好的文章

卡西利亚斯 发表于 2010-2-13 12:33

;P 今年想玩DTS......... USB声卡丢着先 ......

68013做接口设计还不赖,超好用~

simmconn 发表于 2010-2-13 17:26

我帮别人做过认证。我的感觉是自己从零开始开发解码器可不是那么容易的一件事,除非解码部分软硬件都用现成的。不过这D什么什么和那个D什么都是十几年前的技术,专利都要过期了,都是有损压缩,除了支持多声道,实际效果和听MP3差不多(可能还不如MP3嘞)。如果你真要做的话,就祝你虎年虎运,“虎”到成功吧!

simon_zsw 发表于 2010-2-13 21:20

最新版本的AV机忽悠是次世代,带上HDMI一起忽悠,建议从这个搞起:lol

卡西利亚斯 发表于 2010-2-14 00:41

:loveliness:

米办法,兼容下AV吧......顶多播放PCM时候 PASS掉~~~
页: [1] 2 3
查看完整版本: 乐之邦Monitor 01USD的得与失(三)山寨之声