"); //-->
摘要:本文介绍了数字电视传输流的采集和利用tcp/ ip 协议实现在以太网中传输数字电视传输流的系统设计。给出了基于dsp/bios和ndk的嵌入式网络操作系统的硬件和软件设计方案,在tms320dm643的系统中实现了网络通信模型,并成功地实现了数字电视传输流的网络传输。
关键词:数字电视传输流;tms320dm643;dsp/bios;ndk
tcp/ip是因特网上传输数据所必需的协议, 这种网络通信模式在pc之间的实现已经完善, 但是体积、价格等因素限制了其应用的范围。因此, 基于tcp/ip 协议与以太网的嵌入式系统网络通信设计成为目前一个热门的话题。本系统实现了在以ti公司的tms320dm643为核心的嵌入式系统中,对数字电视传输流(ts)信号进行采集并在以太网中传输。利用本系统可轻松地实现在局域网中对数字电视传输流信号的传输、调度。数字电视传输流信号源是针对欧洲数字有线广播系统标准(dvb-c)的数字有线电视信号。网络接入硬件在以tms320dm643为核心的嵌入式系统中实现,网络接入软件采用了ti公司针对c6000系列dsp推出的tcp/ip ndk(network developer’s kit)网络开发包来实现。
系统电路设计
电路主要由5部分组成。数字电视传输流网络采集系统框图如图1所示。
图1 数字电视传输流网络采集系统框图
其主要功能是通过传输流接口模块采集数字电视信号进入pld(cyclone ep1c6q240c8)芯片,进行必要的处理后,将信号发送到dsp(tms320dm643)芯片存储起来,并进行算法处理。通过tms320dm643对bcm5221进行必要的配置,将存储在tms320dm643内的数据通过bcm5221传送到局域网中,并通过计算机接收数据。
传输流接口模块
传输流接口模块由cy7b933输入接口芯片及其电器接口电路组成。cy7b933输入接口电路是点对点的传输模块,可以通过光纤、同轴电缆和双绞线进行高速的串行数据传输。输入接口符合dvb-asi的接口标准。输入接口接收到串行位流后,通过内部pll时钟同步恢复数据的时钟信息,并对位流进行串并转换、解码和传输检错等操作。这种输入接口能灵活地把高速点对点串行数据转变成并行数据,而且应用领域广泛,包括各种服务器、存储器和视频传输的应用。
pld控制模块
在项目中,此部分硬件选用的是altera公司的ep1c6q240c8芯片。
此模块的主要功能是实现与cy7b933接收芯片的接口,把数据从cy7b933接收进来,并缓存数据。这部分功能均由vhdl语言编写的功能模块实现。主要有两个功能模块:receive与fifo。receive模块主要负责从cy7b933接收数据字段;fifo模块主要负责缓存数据。
receive模块
receive模块的功能是实现与cy7b933接收芯片的接口,把数据从cy7b933接收进来。其工作方式是以一个传输流包为边界接收数据的。
首先,receive模块会检测传输流包的边界,通过查找包头字节(固定为0x47)间的字节数来确定。因为包中数据也可能含有0x47,所以要牺牲3个包的数据来检查3次。当发现0x47这个字节的时候,就会触发一个内部的计数器开始计数。当计数到188后,如果下一个字节又是0x47,说明传输流包属于188个字节的包,那么计数器被清零;如果下一个字节又是0x47,说明传输流包属于188个字节的包,那么计数器被清零,否则计数器清零并重新开始检测边界。
当检测到边界以后,receive模块开始接收数据包。计数器会从零开始计数,在接收数据的过程中使能wrreq输出有效信号,同时把数据输出到下一级。当计数到188时,表示一个数据包接收完成。当一个包的数据接收完之后,计数器清零,并置ts188,保持高电平一个时钟周期。下一个周期检测数据是否为0x47,如果是,说明是下一个数据包的边界;否则,说明出现了错误,并重新回到上一段所说的检测数据包边界的状态。
此外,pld模块内会有一个专用计数器记录空包数,当接收到数据包后,会首先检测此数据包是否为空包,如果是空包,pld模块会把这个空包删除,并在计数器中加1。如果接收的不是空包,就会把计数器的值加到这个数据包的私有字段中,并缓存到fifo。然后计数器自动清零。这样处理数据包的目的是为了减少网络传输的数据流量,从而可以传输更多的传输流数据。把计数器的值加入私有字段是为了在计算机接收到数据后,可以把原来的空包恢复出来,从而保证原传输流数据的完整性。
fifo模块
fifo模块的功能是从receive模块接收数据,并缓存起来。当receive模块接收完一个完整的传输流数据包之后,会发送ts188或ts204的中断信号给dsp,dsp就会启动edma功能从fifo模块接收数据。dsp与fifo模块采用异步连接的方式,具体的接收操作在dsp部分说明中再加以描述。
dsp算法处理模块
此模块主要由以tms320dm643为核心的嵌入式系统组成。主要实现从pld模块接收传输流数据包,把数据包打包成tcp/ip格式,并实现对网络接口(bcm5221)控制模块的初始化,然后把数据包传送到网络模块。
为了实现上述功能,必须建立起一套以tms320dm643为核心的基本系统。
系统的具体配置
时钟配置:emif内核时钟eclkin是133mhz。此外,系统的外设总线、edma传输和l2存储器的工作时钟为cpu内核时钟的1/2,即300mhz;片上定时器的工作时钟为cpu内核时钟的1/8,即75mhz。
中断配置:tms320dm643除了reset和nmi引脚提供外部不可屏蔽中断请求输入以外,还有两个外部中断引脚gp0[5]/ext_int5、gp0[7]/ext_int7,以提供可屏蔽的外部中断请求输入。系统中,ext_int5外部中断用作pld模块的请求接收数据信号,每当pld模块接收完一个传输流包,就会发送一个外部中断信号给dsp,通知dsp接收数据。此外,edma中断用于接收完一个包的数据后做后续处理。
系统对emif的使用情况:
系统在ce0空间扩展了4m×64bit的sdram存储器(mt48lc4m32bpg),用于存储程序与数据。sdram的工作时钟由tms320dm643的eclkout1提供,与emif的工作时钟频率相同,本系统中默认eclkin为其时钟源,即133mhz。
系统在ce1空间扩展了4m×8bit的flash存储器(am29lv033c)。在对flash进行读/写访问前,需要通过emif的ce1控制寄存器ce1ctl,将ce1空间配置为8-bit异步存储器接口,及读/写时序。
系统在ce2空间扩展了与fifo模块连接的接口。在dsp看来,fifo模块可视为8bit异步只读存储器。fifo模块的读使能信号rdreq与tms320dm643的ce2片选信号连接;fifo模块的读时钟信号rdclk与tms320dm643的are读使能信号连接。
以太网接口
tms320dm643上集成有一个emac+mdio片上外设,emac是ethernet media access controller的缩写,即以太网媒体访问控制器,mdio是management data input/output的缩写,即管理数据输入/输出模块。emac+mdio用于为以太网物理层(phy)器件提供接口,其中,emac为接口以太网phy提供数据通路,mdio为接口以太网phy提供管理信息通路。
tms320dm643的网络接口原理框图如图2所示。图2描述了emac+mdio与dsp中间有一个emac 控制模块。它主要包含一些必备的、使emac更加有效使用dsp的存储空间,控制其复位、中断的一些逻辑。
这些寄存器的地址空间为:0x1c800000~0x1c803fff。
图2 tms320dm643的网络接口原理框图
网络接口控制模块
本系统用broadcom公司的bcm5221作为10/100base-tx以太网收发器,bcm5221的mii接口与tms320dm643的mii接口对接。具体接口如图3所示。rj45连接器选用amp公司的406549-1,其上带两个led指示灯,右边的led为绿色,用作指示连接状态。左边的为黄色,正常情况下用来指示数据传输。
图3 tms320dm643与phy设备连接框图
电源模块
系统包括4组电源:系统外接稳压电源,把220v的交流电源电压转换成5v直流电压;pld模块电源由两种电源供电,分别是3.3v和1.5v;tms320dm643需要两种电源,分别为cpu核心和周边的i/o接口供电。周边i/o电压要求3.3v,cpu核心电压只要1.4v;网络接口控制模块采用3.3v电源供电。
系统软件设计
系统的软件设计主要是通过tcp/ip网络开发包ndk来实现的。该开发包支持tcp/ip协议,并占用较少的系统资源。ndk仅用200kb~250kb的程序空间和95kb的数据空间即可支持常规的tcp/ip服务。所以,ndk很适合目前嵌入式系统的硬件环境,是实现dsp网络开发的重要工具。
系统软件的框图如图4所示。
图4 软件系统图
具体流程:系统配置主要在初始化函数中完成,此初始化函数将在.cinit初始化后,并在dsp/bios初始化和main函数之前调用。系统配置需要开启int8中断,也就是edma传输中断,并设置gpio7引脚为高电平,从而使pld模块始终处于初始状态。tcp/ip协议配置在任务线程中完成,主要实现服务器ip地址和网关的配置。当其完成后,系统就会触发一个软件中断,在软件中断程序中,服务器会产生一个用于侦听的端口,并开始侦听网络上的请求。此时,服务器已经处于待命状态,等待客户机的传输请求。
当客户机的传输请求到来时,系统首先会使gpio7引脚变为低电平,pld模块开始发送数据。当其接收到一个完整的传输流数据包后,就会发一个中断给dsp,dsp启动edma,用ping-pong的方式接收数据进入特定的存储器,当接收完一个完整的传输流数据包后,会产生硬件edma中断,中断程序主要是设置特定的标志位为1,然后退出硬件中断,重新回到软件中断程序。当软件中断程序检测到特定的标志位为1时,就会开始传输在存储器中的传输流数据包给客户机。当一个数据包传输完毕后,特定的标志会被置0,系统等待下一个数据包的到来。
当客户机要求停止传输的请求到来时,系统会重新使gpio引脚变为高电平,pld模块回到初试状态。此时,系统也会处于待命状态,继续侦听网络。
系统初始化
初始化配置主要包括emif总线配置、中断配置和底层网络配置3个部分。初始化工作首先在dsp/bios的全局参数配置窗口进行设置,然后调用初始化函数进行配置。
在dsp/bios的全局配置窗口主要设置了dsp的工作时钟频率为600mhz,选择使用的片级支持库csl为dm643的库,选用小端访问模式,片内256kb的sram全部用于cache,并调用初始化函数dm643_init()。
tcp/ip协议配置
初始化程序dm643_init()完成后,系统将进入各个线程。首先,系统会触发任务线程tsk0,在tsk0任务线程中执行函数stacktest(),其首先调用nc-systemopen()函数,完成协议栈及其所需内存的初始化,然后新建一个系统配置句柄hcfg = cfgnew();,并实现服务器ip地址和网关的配置。在本系统中,ip地址配置为"192.168.0.2";子网掩码为"255.255.255.0";网关地址为"192.168.0.1"。配置好之后,系统会触发一个软件中断,并做好侦听网络的准备。
网络侦听
前面在任务线程中已经配置了ip地址和网关,下面就要在软件中断中设置端口并进行侦听。首先,在开始使用报路之前,必须分配一个文件环境fdopensession( taskself() )给这个报路。接着就可以创建一个报路对象stcp = socket(af_inet, sock_stream, ipproto_tcp),并设置端口sin1.sin_port = htons(1000),在这里设置端口号为1000,当然也可以设置其他的端口号。然后把端口号与报路对象绑定bind( stcp, (psa) &sin1, sizeof(sin1)。最后进入侦听状态listen( stcp, 1)。
数据的接收
当客户端要求传输数据的信号到来后,系统会使gpio7引脚变为低电平,pld模块开始发送数据。dsp通过edma方式来接收数据。edma可以在没有cpu参与的情况下,由edma控制器完成dsp存储空间内的数据搬移。系统主要采用edma的ping-pong方式来连续接收数据。用ping-pong方式的目的是为了使接收操作和发送操作分开进行,增强程序的操作性和可读性。
限于篇幅,网络发送部分不再赘述。
结语
本系统的硬件和软件功能已经实现,网络传输的速度为2mbps。按照此速度,假设传输流中的空包百分比为40%,可以传输5mbps的传输流数据,至少可以传输2~3路的ts流节目。因此,可以证明本系统的设计方法合理、有效。
参考文献
1. 王明臣,姜秀华,张永辉.数字电视与高清晰度电视[m]。北京:中国广播电视出版社,2003
2. 李方慧,王飞,何佩琨.tms320c6000系列dsps原理与应用(第2版)[m]。北京:电子工业出版社,2003
3. texas instruments tms320c6000 tcp/ip network developers kit. revision 1.60.303, 12-jun-03
4. altera cyclone fpga evaluation board sockit user guide[s],2004
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。