VxWorks下基于CS4281声卡的VOIP设计与实现
发布时间:2007/8/30 0:00:00 访问次数:432
来源:现代电子技术 作者:冯广友 张磊等
VOIP的基本原理:通过声音的压缩算法对声音数据编码进行压缩处理,然后把这些声音数据进行打包,经过IP网络把数据包送至接收地,再把这些声音数据包重组,经过解压处理后,还原成原来的声音信号,从而达到由互联网传送声音的目的。VxWorks是常用的嵌入式操作系统,基于VxWorks的嵌入式开发应用非常广泛。本文试图在小范围的以太网环境实现VxWorks操作系统下基于声卡的VOIP的尝试,为某些需要声卡的嵌入式开发提供支持。1 VxWorks及声卡简介
VxWorks是由风河(Wind River System Inc.)公司专门为实时嵌入式系统设计开发的一套具有微内核、高性能、可伸缩的实时操作系统,为程序员提供了高效的实时任务高度、中断管理,实时的系统资源以及实时的任务间通信,并能够根据用户的需求进行组合。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。VxWorks是一种功能强大而且比较复杂的操作系统,VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。VxWorks的优秀特性为编写应用程序和设备驱动程序提供了极大的便利。在VxWorks下,设备驱动程序既可以嵌入到内核中随系统一起启动,也可以作为可加载模块在系统启动之后运行。本文的声卡驱动程序采用后一种方式。
本文选用的声卡是Cirrus Logic公司的CS4281/AC′97。这是一款功能强大的声卡,他主要由CS4281和C2S4297A芯片组成。CS4297A是符合AC′97(Audio Codec′97)规范的一个混合信号串行编解码器。他负责对原始声音信号的采样混音处理,把接收的模拟声音信号转换成数字信号;也将接收的数字音频信号通过一种特殊的音频算法转换成模拟信号。CS4281是一个PCI-Ac′97数字控制器,他提供串行AC′97编解码器(如CS4297A)与并行PCI总线之间的接口。
2 总体设计
程序划分为两个模块:(1) CS4281声卡的VxWorksPCI驱动,实现声音的录音和播放;(2) 通信模块,该模块负责接收驱动模块的声音数据,并打包通过以太网发送;接收以太网的数据,解包成声音数据传给驱动模块。
低层是声卡驱动:从麦克风进来的声音在这里记录,并发送PCM抽样声音数据到上层;同时,声音数据从上层传来并发送到声卡播放,通过耳机输出。主要有以下几个函数:PCI配置空间的分配,完成声卡的查找及内存映射;CS428l及CS4297的初始化,进行一系列的硬件初始化;DMA缓冲区的分配,用来缓存声卡驱动和通信模块之间的声音数据;取样率和格式的设置,选择合适的取样率及格式;声音系统的打开及关闭,控制录音及播放功能的开关;中断处理函数,声卡驱动和通信模块之间通过中断来进行数据的存取。
上层是通信部分:声音数据在这里打包成分组通过网卡发送出去,从网卡接收来的数据在此解包并交给声卡驱动,数据经过以太网的发送和接收通过调用Socket来实现。
2.1 确定取样率
结合实际的实验环境,从诸多的取样率和格式中,选择11025 Hz取样频率、8 b单声道。计算最低的数据传输率:
2.2 设置缓冲区
如果网络中通信量变化较大,将产生时延抖动。需要设置两个缓冲区用来在发送数据和接收数据时进行缓存,以减轻时延抖动的影响,保证通信质量。缓冲区大小应适当,如果太小,将会造成数据丢失;如果太大,抖动时延将增长。
在x86结构中,页面大小是4 kB。这对DMA缓冲大小是个限制,因为DMA需要位于一个内存页面中来保持缓冲区的连续性,且要适应基于UDP的Socket通信,我们确定播放DMA缓冲和录音DMA缓冲大小都为2 kB,并且用“乒乓”技术在这两个缓冲区间传输,那么每1 kB,将有一个播放中断和录音中断。1 s中的中断次数为:1×11k/1k△11。
3 声卡驱动程序
3.1 PCI局部总线
本文所选用的声卡是Cirrus Logic公司的CS4281/AC′97 PCI声卡,作为一个PCI设备,在设备的初始化阶段,他和一般的PCI设备的步骤相同。
每一个PCI总线设备都有一个配置寄存器空间,他使目标设备的配置简单易行。配置空间是一个容量为256 B并具有特定结构的地址空间。配置寄存器是PCI设备的硬件与PCI设备的初始化软件及错误处理软件之间的信息交换区,以便软件对PCI设备进行识别和控制以及PCI设备向软件反映设备状态和要求。该空间分为头标区和设备关联区两部分。一个设备的配置空间不仅在系统自举时可以访问,而且在其他时间内也可以访问。
3.2 声卡的驱动结构及流程
(1) 声卡的探测以及入口
VxWorks BSP在syslib.c中探测并初始化系统中的PCI设备,检
来源:现代电子技术 作者:冯广友 张磊等
VOIP的基本原理:通过声音的压缩算法对声音数据编码进行压缩处理,然后把这些声音数据进行打包,经过IP网络把数据包送至接收地,再把这些声音数据包重组,经过解压处理后,还原成原来的声音信号,从而达到由互联网传送声音的目的。VxWorks是常用的嵌入式操作系统,基于VxWorks的嵌入式开发应用非常广泛。本文试图在小范围的以太网环境实现VxWorks操作系统下基于声卡的VOIP的尝试,为某些需要声卡的嵌入式开发提供支持。1 VxWorks及声卡简介
VxWorks是由风河(Wind River System Inc.)公司专门为实时嵌入式系统设计开发的一套具有微内核、高性能、可伸缩的实时操作系统,为程序员提供了高效的实时任务高度、中断管理,实时的系统资源以及实时的任务间通信,并能够根据用户的需求进行组合。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。VxWorks是一种功能强大而且比较复杂的操作系统,VxWorks只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。VxWorks的优秀特性为编写应用程序和设备驱动程序提供了极大的便利。在VxWorks下,设备驱动程序既可以嵌入到内核中随系统一起启动,也可以作为可加载模块在系统启动之后运行。本文的声卡驱动程序采用后一种方式。
本文选用的声卡是Cirrus Logic公司的CS4281/AC′97。这是一款功能强大的声卡,他主要由CS4281和C2S4297A芯片组成。CS4297A是符合AC′97(Audio Codec′97)规范的一个混合信号串行编解码器。他负责对原始声音信号的采样混音处理,把接收的模拟声音信号转换成数字信号;也将接收的数字音频信号通过一种特殊的音频算法转换成模拟信号。CS4281是一个PCI-Ac′97数字控制器,他提供串行AC′97编解码器(如CS4297A)与并行PCI总线之间的接口。
2 总体设计
程序划分为两个模块:(1) CS4281声卡的VxWorksPCI驱动,实现声音的录音和播放;(2) 通信模块,该模块负责接收驱动模块的声音数据,并打包通过以太网发送;接收以太网的数据,解包成声音数据传给驱动模块。
低层是声卡驱动:从麦克风进来的声音在这里记录,并发送PCM抽样声音数据到上层;同时,声音数据从上层传来并发送到声卡播放,通过耳机输出。主要有以下几个函数:PCI配置空间的分配,完成声卡的查找及内存映射;CS428l及CS4297的初始化,进行一系列的硬件初始化;DMA缓冲区的分配,用来缓存声卡驱动和通信模块之间的声音数据;取样率和格式的设置,选择合适的取样率及格式;声音系统的打开及关闭,控制录音及播放功能的开关;中断处理函数,声卡驱动和通信模块之间通过中断来进行数据的存取。
上层是通信部分:声音数据在这里打包成分组通过网卡发送出去,从网卡接收来的数据在此解包并交给声卡驱动,数据经过以太网的发送和接收通过调用Socket来实现。
2.1 确定取样率
结合实际的实验环境,从诸多的取样率和格式中,选择11025 Hz取样频率、8 b单声道。计算最低的数据传输率:
2.2 设置缓冲区
如果网络中通信量变化较大,将产生时延抖动。需要设置两个缓冲区用来在发送数据和接收数据时进行缓存,以减轻时延抖动的影响,保证通信质量。缓冲区大小应适当,如果太小,将会造成数据丢失;如果太大,抖动时延将增长。
在x86结构中,页面大小是4 kB。这对DMA缓冲大小是个限制,因为DMA需要位于一个内存页面中来保持缓冲区的连续性,且要适应基于UDP的Socket通信,我们确定播放DMA缓冲和录音DMA缓冲大小都为2 kB,并且用“乒乓”技术在这两个缓冲区间传输,那么每1 kB,将有一个播放中断和录音中断。1 s中的中断次数为:1×11k/1k△11。
3 声卡驱动程序
3.1 PCI局部总线
本文所选用的声卡是Cirrus Logic公司的CS4281/AC′97 PCI声卡,作为一个PCI设备,在设备的初始化阶段,他和一般的PCI设备的步骤相同。
每一个PCI总线设备都有一个配置寄存器空间,他使目标设备的配置简单易行。配置空间是一个容量为256 B并具有特定结构的地址空间。配置寄存器是PCI设备的硬件与PCI设备的初始化软件及错误处理软件之间的信息交换区,以便软件对PCI设备进行识别和控制以及PCI设备向软件反映设备状态和要求。该空间分为头标区和设备关联区两部分。一个设备的配置空间不仅在系统自举时可以访问,而且在其他时间内也可以访问。
3.2 声卡的驱动结构及流程
(1) 声卡的探测以及入口
VxWorks BSP在syslib.c中探测并初始化系统中的PCI设备,检