基于Linux系统的VoIP语音接入网关设计与实现
2009-04-10
作者:赵婉芳1,2, 于 京2, 田
摘 要: 提出一种基于Linux操作系统的VoIP语音接入网关设计,并给出了具体实现过程,其中重点阐述了硬件实现过程。该方案具有很强的扩展性,并且将终端和网关的功能整合为一,适用于改造中小企业内部电话网,以较低的价格从传统电话网过渡到VoIP电话。
关键词: VoIP; EHPI; Linux
VoIP(Voice over Internet Protocol)是一种以IP电话为主,在使用了TCP/IP协议的网络上进行语音传输并推出相应的增值业务的技术。VoIP可以在IP网络上低成本地传送语音、传真、视频和数据等业务,如统一消息、虚拟电话、虚拟语音/传真邮箱、查号业务、Internet呼叫中心、Internet呼叫管理、电视会议、电子商务、传真存储转发等。随着IP网络电话技术的发展,由最初的只是计算机对计算机的语音传输通信,到后来从普通电话机到普通电话机的VoIP网络电话实现,使得IP电话使用范围扩大。目前,IP网络电话已经通过网关把因特网与传统电话网联系起来,广泛地采用Internet和全球IP互联的环境,提供比传统业务更多、更好的服务。用户可以像使用普通电话一样,只要有网络电话机就能打因特网的国际长途电话,而通话费用远远低于国际长途电话的费用,大大降低了通信成本。随着VoIP技术的成熟,IP电话将逐渐取代传统电话,成为未来电话的发展趋势。
本文设计并实现一种基于Linux操作系统的VoIP网关设备。该设备以AudioCodes AC49012为核心,支持12路压缩语音通道,扩展性强,将终端和网关的功能整合为一个设备,具有很好的应用前景。
1 基本原理
1.1系统原理
该系统主要由CPU、DSP、SLIC及一些外围设备组成。CPU的主要功能是对网络数据包进行处理并将数据传送到以太网。DSP负责对语音数据进行压缩编码处理,再将语音数据组合成帧传送给CPU。SLIC负责提供DSP与电话线的接口,对数据进行数模/模数转换。另外SLIC芯片给电话线提供驱动电压,产生电话机所需的信号,如振铃等。系统结构示意图如图 1所示。
当两个VoIP终端建立语音通道后,语音的处理过程如下:
(1)用户的声音被SLIC数字化后,产生64kb/s PCM数据流。PCM数据流进入DSP后,DSP按编码要求通过语音压缩算法对语音信号进行压缩编码处理,再将语音数据按时间分段组合成帧,一般20ms语音数据构成一个帧。
(2)DSP将压缩语音数据帧传给CPU,CPU再对语音数据帧进行处理。CPU将语音数据帧加上RTP头构成RTP包,再使用UDP协议将RTP包传到以太网上。
(3)对端收到UDP包后,从中取出RTP数据包,再将RTP头部去除得到压缩语音数据帧。CPU将语音数据帧传给DSP解压。DSP将语音数据帧还原为64kb/s的PCM流,通过TDM总线送至SLIC,SLIC将数字信号转变为模拟信号发送到电话机。
1.2 AC49012简介
语音处理DSP芯片是该VoIP设备的核心部件,它的选择至关重要,在本方案中选择的是AC49012。该芯片是一款新型的功能强大的语音/传真/数据处理芯片。它最多能处理24个无压缩通道或12个压缩通道。该芯片很适合中低密度VoIP设备,具有扩展性强、功耗低、外形尺寸小等优点。AC49012对外提供了EHPI、TDM等接口,通过这些接口,AC49012很容易与其他芯片相连。在设计产品时,将AC49012与控制处理器和SLIC芯片相连,就可实现各种语音产品,如IP电话、VoIP网关、无线和有线网关、IP PBX等。这样的结构提高了产品设计的灵活性。AC49012的主要功能包括:支持多种码率的压缩编码,如G.711(64kb/s)、G.726(16~40kb/s)、G.727(16kb/s~40kb/s)、G.729AB(8kb/s)、G.723.1(6.3kb/s);支持回声消除,符合G.168-2002标准;自动检测和切换语音、传真或数据等业务;支持传真转发功能,符合标准T.38;支持加密功能,能对数据包进行加密;能生成RTP/RTCP包,减轻外部处理器负荷。
在该DSP芯片中每一个通道都有如图2所示的结构。PCM数据进入DSP后,为了提高语音质量,先经回声消除器处理,将其中的回声衰减。DSP能自动检测出PCM中的数据类型是语音数据、带内信令还是传真数据。每一类数据都有相应的处理模块。语音数据经编码器(Speech Encoder)压缩成低码率的数据流(该DSP支持多种压缩编码,如G.726、G.729等)。传真数据在本地被解析出来后,放在数据包中传输。最后这些数据由CPU打包后发到网络上。相反地,CPU将从网络上收到的数据包解开后,通过EHPI传给DSP处理。这些数据进入DSP后,也会被分类,根据数据包的协议分类。语音数据包经解码器(Decoder)解码成PCM流,发送到外部D/A转换器转换成电话信号。传真数据调制产生PCM流输出。
2 系统硬件设计
系统硬件结构设计如图3所示。系统中主处理器CPU选用Cirrus Logic EP9302芯片。它是一颗SoC芯片,内部集成ARM920T的核,带有16KB指令缓存和16KB数据缓存。ARM9核的工作频率为200MHz,系统总线频率为100MHz。处理能力完全满足该系统的需要。该芯片集成了多种硬件模块,如USB、UART、SPI、SDRAM控制器、10/100Mb/s以太网MAC等。外部数据总线上可挂接多种存储器,如Flash、SDRAM等。系统DSP选用AC49012。SLIC芯片选用LE88221,每片芯片提供两个通道。该系统有12个通道,所以需要使用6片LE88221芯片,另外,该系统使用4MB NOR Flash存放Bootloader和程序映像(包括Linux内核和文件系统)。内存使用32MB SDRAM。
CPU和AC49012之间的通信通过EHPI(即Enhanced Host-Port Interface,16位并行接口)来实现。通过该接口DSP能与Cirrus Logic EP9302芯片直接相连,中间不需要任何逻辑电路转换信号。DSP通过EHPI接口连接到CPU的外部总线上,占用CPU的一段地址空间。这种连接方式可以使一片CPU连接多片DSP芯片。EHPI并行接口的信号如表1所示。
其中,当CPU访问DSP所在地址时,连接到DSP的片选信号HCS必须有效。HCNTL0连接到地址线,通过地址来区分HPIC(控制寄存器)和HPID(数据寄存器)。CPU通过写HPIC控制寄存器给DSP发中断信号,同样,DSP也能给CPU发送HINT中断信号,CPU响应中断后清除中断标志位。
SLIC与DSP连接使用TDM(Time Division Multiplex)总线。该总线是时分复用总线,6片SLIC可以连接到同一条TDM总线上。不同的语音通道使用不同的时隙(Time Slot)。每个时隙的带宽是64kb/s,就是一个语音通道的带宽。TDM总线的工作频率可调,工作频率越高时隙就越多,支持的语音通道也就越多。
要使LE88221芯片正常工作,必须初始化内部寄存器。LE88221有一个SPI接口用于CPU访问其内部寄存器。通过SPI串行接口CPU可以读写SLIC芯片内部寄存器来初始化和控制SLIC。SPI接口由DIN(串行数据输入)、DOUT(串行数据输出)、DCLK(数据时钟)和CS(片选信号)组成。CPU发给SLIC的数据有固定的格式,先发8bit地址,后面紧跟多字节输入数据或多字节输出数据(由LE88221输出)。读写操作由地址的最低有效位区分,即奇地址表示读出操作,偶地址表示写入操作。CPU只有一个SPI接口,而该系统中有6片SLIC芯片需要连接,所以需要使用外部CPLD芯片来切换,同一时刻CPU的SPI只连接到一片SLIC芯片。6片SLIC芯片可以共用DIN、DOUT、DCLK这些信号,但它的片选CS信号必须由CPLD切换来确定是否与CPU的SPI片选连接。通过这种机制,驱动程序通过控制CPLD来选择要控制哪片SLIC芯片。
3 驱动程序设计
本系统采用的是实时Linux操作系统。实时Linux 操作系统源代码开放,软件成本较低,具有实时响应能力。此外Linux系统有大量开源的应用程序可使用,开发人员可以通过修改源代码来进行功能的扩展,Linux还可以在广泛的硬件平台上运行,具有很好的可移植性,用户很容易把应用程序从一个Linux平台移植到另外一个Linux平台。
本系统的Linux是在Linux 2.6.10上打实时补丁得到的。Linux内核和文件系统存放在Flash中。在Linux中使用设备文件表示设备,设备文件放在/dev目录下。设备文件与设备驱动关联,当应用程序读写设备文件时,系统会将读写请求发给相应的设备驱动,由驱动程序去控制芯片完成任务。该系统中有两个主要的驱动程序,DSP驱动和SLIC驱动。它们分别对应设备文件“/dev/dsp”和“/dev/slic”。
SLIC驱动的主要功能是初始化SLIC芯片并提供事件查询接口。初始化过程是通过写SLIC芯片的寄存器来配置工作参数,主要包括配置TDM总线工作频率、每个通道占用的TDM时隙、配置滤波器参数等。初始化完成后,芯片进入正常工作状态。应用程序通过驱动提供的接口查询各种事件,如摘机、挂机、告警等事件。通过查询,应用程序能及时了解电话机状态。
DSP驱动是系统中最重要的驱动程序,它的主要功能是初始化DSP芯片并提供应用程序与DSP通信的接口。在初始化过程中,首先将DSP的固件下载到DSP中,然后配置DSP的工作参数,如选择编解码器、语音处理参数、传真转发参数、信号音参数等。DSP驱动可简单分为两层:上层实现与DSP固件的通信,驱动与DSP固件使用私有数据包通信,这层实现这些私有数据包的构造和解析;下层实现EHPI总线的访问,读写DSP中的数据。上层生成的数据包由下层写入到DSP中;反之,下层从DSP读出的数据包会传给上层解析。
该系统使用ARM核CPU运行Linux系统,所以要使用针对ARM的GNU交叉编译工具来编译驱动程序。首先,要在一台运行Linux的开发机上安装开发软件包,其中包含GNU交叉编译器、映像工具、调试工具等;然后配置好开发机;编译驱动程序使用make工具,将生成的驱动程序拷贝到设备文件系统中;使用映像工具将设备文件系统做成映像,再用JTAG调试器将Linux内核和文件系统映像写入设备的Flash中;之后就可以启动设备,进行程序调试了。另外,为了调试方便也可以使用NFS文件系统,设备通过网络使用开发机上存放的设备文件系统。
在驱动程序调试过程中需要注意以下问题:
(1) TDM时隙设置。在DSP驱动和SLIC驱动中同一通道必须设置相同的TDM时隙,包括收发两个方向(SLIC到DSP、DSP到SLIC),否则SLIC和DSP无法交换数据。
(2) CPU访问EHPI总线的时序。在CPU中设置EHPI总线时序时,要根据EHPI总线的时序要求设置。该方案中CPU的总线频率较高,设置EHPI访问时序时需加入足够的延时,否则EHPI访问会出错。
该系统采用CPU和DSP分离的结构,有较好的扩展性。当需要增加通道数量时,只需增加DSP的数量就可以实现。CPU主频较高,有足够的数据处理能力。该设备试用后证明,设备成本低,通话效果良好,可取代现在使用的传统PBX设备,非常适合改造中小企业内部电话网。
参考文献
[1] 糜正琨.IP网络电话技术[M].北京:人民邮电出版社, 2000.
[2] 张登银,张精科.VoIP技术分析与系统设计[M]. 北京:人民邮电出版社,2003.
[3] 张磊.VoIP 语音技术及应用[M].北京:机械工业出版社,2000.