新闻  |   论坛  |   博客  |   在线研讨会
基于I2S的USB 声卡系统设计
yanqin | 2009-06-24 17:28:11    阅读:2142   发布文章

 

摘  要:本文介绍了基于s3c2410处理器平台,利用i2s总线的usb声卡系统设计。详细阐述了usb声卡通讯的实现,并且根据i2s总线dma传输的特点实现了环形缓冲区,以提高系统性能,满足音频实时性的要求。
关键词: usb声卡;s3c2410;i2s

引言
    近年来usb产品层出不穷,usb音频类在usb开发者论坛的努力下,成为一种标准的规范,usb声卡也开始在市场上悄然出现。因为usb声卡内置了dac和有源功放,音频数据以数字方式进入usb声卡,完全杜绝了pc的内部干扰,所以,usb声卡将有可能成为现有内置声卡的替代品。本文介绍了一种基于arm处理器的usb声卡设计。
  
usb声卡原理
    由usb声卡数据流图(见图1)可以看出usb声卡的工作原理。在主机端播放音乐时,应用软件或驱动程序把各类音频信号转换为统一的格式,如pcm、mpeg等格式的数据流,通过主机的usb接口发送给usb声卡。声卡的usb接口接收到数据后,通过i2s接口把并行音频数据转为串行,再发送给音频编解码芯片进行d/a转换,即可在音频芯片连接的扬声器中发音。录音过程和播放过程正好相反。

740)this.width=740" border=undefined
   
图1  usb 声卡数据流

硬件设计
    usb声卡硬件主要包括mcu和音频编解码芯片。mcu采用三星公司的处理器s3c2410,s3c2410内置i2s总线控制器和usb slaver控制器。s3c2410的i2s控制器实现了一个外部8/16位立体声音频codec ic的接口,支持i2s总线数据格式和msb-justified数据格式,并且支持dma传输模式。

    音频芯片采用uda1341ts。uda1341ts提供标准的i2s接口,可以直接和s3c2410的i2s引脚连接。另外,此芯片还提供标准的l3、麦克风和扬声器接口。l3接口的引脚分别连到s3c2410的3个gpio输出引脚上,通过gpio控制l3接口。uda1341ts音频芯片集成数字化音频和混频器功能。数字化音频功能可以播放数字化声音或录制声音,因为包括这个功能,所以常把此类芯片称为codec设备。混频器用来控制各种输入/输出的音量大小等,在本芯片中通过l3接口进行控制。

740)this.width=740" border=undefined

图2 usb声卡拓扑图

软件设计
    软件设计包括两部分:usb声卡固件程序设计和主机端windows驱动设计。因为usb音频类设备是一种标准设备,在windows 操作系统上有标准的usb音频驱动,所以只需要开发者根据usb音频类的协议开发固件程序。

    usb声卡的固件程序主要包括两部分,第一部分主要是usb通讯,第二部分实现i2s接口数据传输以及数据流的缓冲区控制等。

usb通讯
usb声卡描述符
    为了有效地定义出usb声卡的描述符,可先根据usb音频类协议,并结合需要实现的usb声卡功能,确定出usb声卡的拓扑图(见图2),然后再根据拓扑图和usb音频类描述符的协议,写出usb声卡的描述符。

    usb声卡的描述符包括5部分,分别为设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。接口描述符是其中的难点。usb声卡的接口描述符包括两部分:音频控制(audiocontrol)接口描述符和音频数据流(audiostreaming)接口描述符。

    1. usb音频控制接口描述符。根据usb声卡的拓扑图所示,当声卡用于回放功能时,其声卡功能的控制流程,通过it1(input teminal),ot3(out teminal)和feature单元表示,it1表示的是pc向usb声卡发送的音频数据流,ot3表示的是发向dac的数据流,在it1和ot3之间的feature单元用于调节音量和音效功能等。当声卡执行录音功能时,usb的功能拓扑通过it2,ot4表示,it2表示a/d采样的音频数据流,ot4表示的是通过usb接口发向pc的数据流。usb音频控制接口的数据传输一般使用默认端点0。

    在usb声卡的拓扑图中,f表示的是usb音频类的feature单元,feature单元的主要作用是控制音量、静音、低音等。如果在描述符中声明了feature单元,在windows操作系统下,控制面板中的声音和音频设备的一些功能才能使用。那么在windows中进行调节音量等控制时,就会触发固件程序对uda1341ts芯片l3接口的控制。

    2. usb音频数据流接口描述符。因为usb 音频有回放和录音两种功能,所以需要两个同步数据流接口,两个接口使用双向端点1进行数据传输。

    通过usb声卡的拓扑图,可以分析出音频接口的流程和功能,从而得出usb声卡的描述符。

usb通讯的程序实现
    s3c2410有5个双向fifo端点,其中0端点是控制传输端点,其他4个端点支持批量、中断、同步传输等方式。在本系统中使用0、1两个双向传输端点。端点0执行控制传输(control),一方面传输usb协议的控制信息,例如setup事件、握手信号、枚举信息等,另一方面传输音频控制信息,例如采样率控制、音量控制等。端点1采用同步传输方式( isochronous),传输时间间隔为1ms,用于实时传递主机和i2s之间的录音或放音数据。

    根据usb协议,usb设备的任何数据传输,都由usb主机分配,然后usb设备响应相应的usb主机总线请求。s3c2410的usb控制器采用的是中断方式响应,那么在s3c2410的usb中断服务程序中要作以下工作:
isr_usb()
{
if(usb_int_reg&reset_int)     reset_usb();   //重启usb设备
if(usb_int_reg&resume_int)   resume_usb();  //唤醒usb设备
if(usb_int_reg&suspend_int)  suspend_usb(); //挂起usb设备
if(ep_int_reg&ep0_int)         handle_ep0(); //执行控制传输端点0处理程序
if(ep_int_reg&ep1_int)         handle_ep1(); //执行同步传输端点1处理程序
}

usb声卡的控制传输
    在主机端应用程序中,执行音量调节、静音等事件时,usb音频驱动通过默认端点0执行一个控制传输。一次控制传输主要包括两个步骤,第一步,由主机向设备发送一个建立(setup)信息,描述控制访问的类型,设备将执行此控制访问。第二步,零个或多个控制数据信息的传送,这是访问的具体信息。根据usb音频类协议分解控制信息包,然后再根据控制信息,执行相应的操作。例如,在主机端应用程序中播放音乐前,usb声卡就会从主机端收到如下的两个包:
setup包  22 01 00 01 01 00 03 00
控制数据包 40 1f 00

    根据usb音频类协议分解setup包,可以得知,本次控制传输的作用是设置usb声卡的采样频率,并且收到的3字节控制数据信息是采样频率,即8khz。那么在播放音乐前,必须把i2s和uda1341ts芯片的采样频率设置为8khz,才能和主机端保持同步。

i2s总线实现方法
    在s3c2410芯片中,i2s接口提供三种数据传输模式:正常传输模式、dma传输模式、传输/接收模式。本系统采用的是传输/接收模式,它具有双通道dma功能,一方面窃取总线控制权,提高系统的吞吐能力,另一方面,可以实现同时接收和发送音频数据,即全双工模式。

    在s3c2410芯片中,有4个dma通道控制器用于控制各种外部设备,其中i2s与其他串行外设共用两个桥接dma(bdma)类型的dma通道。通过设置i2sfcon寄存器可以使i2s接口工作在dma模式下。此模式下fifo寄存器组的控制权掌握在dma控制器上。当fifo满时,由dma控制器对fifo中的数据进行处理。dma模式的选择由i2scon寄存器的第四和第五位控制。

    为了使usb声卡的回放和录音可以同时进行,即实现全双工,数据传输使用两个bdma通道,通道0用于回放,通道1用于录音,因为s3c2410的bdma中没有内置dma存储区域,所以需要在sdram中分配dma缓冲区。音频数据回放时,先由usb总线取得音频数据,写入dma缓冲区,由bdma控制器通道0窃取总线控制权,通过i2s控制器写入i2s总线并传输给音频芯片。录音采用bdma控制器的通道1,其数据流过程和回放相反。

    由于处理的音频数据量比较大,并且pc端接收/发送数据的速度和i2s处理数据的速度不能完全匹配,这就导致了放音失真或者录音丢帧的现象。为了解决这个问题,最简单易行的方法是使用比较大的环形缓存。但实际上大的缓存区需要更长的填充时间,在使用时会出现延时。为了解决延时的问题,使用环形、多段缓存机制。在这种机制下,将缓存区分割成若干个相同大小的块,并使用算法实现环形缓冲。下面以8khz/16位/单通道音频流的播放为例说明缓冲区的操作。

    usb音频类规定的usb同步传输周期为1ms,即对于8khz/16位/单通道pcm编码的音频流,每隔1ms,usb设备就会收到一次主机传来的数据,数据包大小为16字节,为了尽量保持i2s和usb传输同步,可以取16字节作为一个缓存区段的大小。当usb声卡接收到数据后,mcu先判断缓冲区中是否有空闲区域,如果没有足够缓冲区就跳过一个样本,然后再逐一把fifo中的数据复制到sdram的缓冲区。

    因为i2s的dma控制器处理数据是按段进行,每段长度为16字节,在dma取数据前,先判断缓冲区中的数据量,如果没有足够数据(16字节),则加入静音数据,然后再执行dma传输。

结语
    本文所阐述的基于i2s总线的usb声卡,已经在基于s3c2410处理器的开发板上成功实现,不过只是实现了usb声卡的最基本功能。可以尝试把mp4、u盘等和usb声卡集成在一体,会更有应用价值。

参考文献
1. samsung inc. s3c44b0x risc microprocessor datasheet. http://www.samsung.com.  2003
2.philips semiconductors. uda1341ts datasheet.http://www. semiconductor. philips.com. 2002
3. hyde, john, usb design by example. intel. www.usb-by-example.com.2002.5

  


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客