关键词:PCI总线,TM1300,以太网通信接口,视频通信?
1 引言
TM1300是Philip公司推出的多媒体DSP,它不仅具有强大的处理能力,还具有非常友好的音频和视频以及SSI和PCI等I/O接口,可以根据应用的需要灵活地构造各种视频通信系统。在本文之前,已经有了TM1300上的H.263软硬件平台,并利用TM1300的SSI(通用串行口)接口输出编码码流,通过两种专门设计的外围接口板实现了通过modem在电话线上的低码率传输和通过E1接口在专线的高速传输。鉴于目前计算机网络的普及和网上视频业务的发展,很有必要再为TM1300视频编码系统开发一个以太网接口,拓宽应用范围。开发以太网接口的一种合理思路是,利用TM1300集成的PCI接口驱动专用的以太网接口芯片。因目前多数以太网接口芯片,如realtek8029,realtek8139等都是PCI接口的,可以用PCI总线将数据从TM1300传输到这些专用的以太网接口芯片,然后由它们发送数据。而且,TM1300可以运行嵌入式操作系统pSOS,pSOS带有TCP/IP协议栈,所以,可以方便地完成编码码流的 TCP/IP封装。
根据以上思路,我们首先进行了前期测试,证明这样是可行的,接下来进行了电路板的设计,并顺利完成了调试。目前,这个以太网接口已经基本开发成功。本文将对这个设计的技术要点从硬件和软件两方面进行详细介绍。
2 硬件设计
系统框图如图1所示。
硬件设计的重点是PCI总线接口, PCI总线根据数据位的宽度有32位和64位之分,64位的数据线对32位是兼容的。PC中常见的是32位PCI总线,它的有用引脚总数是110个,可以分成3组。第一组是基本功能信号线,包括32位共享数据地址线AD〔00..31〕、接口控制线、仲裁线、时钟线、系统复位线、中断线;第二组是附加功能信号线,包括错误报告线、cache功能支持线、JTAG边界扫描线;第三组是电源线,包括设备耗电量标示线、3.3V电源线(12根)、5V电源线(13根)、地线(22根)。
因为PCI的附加功能信号线支持的cache功能和JTAG边界扫描功能8029都不具备,而且虽然8029具有奇偶校验错报告功能引脚,但是可以悬空不用,所以,只需要考虑第一组功能信号线的连接。
PCI接口的设计有以下几个要点:
(1) PCI总线的仲裁。
这里先说明两个概念。首先,PCI总线是多设备共享的,由于PC里有多个PCI设备,所以需要使用仲裁器;其次,PCI设备有主设备和从设备之分,主设备可以发起PCI数据的传送,从设备只能被动地响应主设备的操作,对读操作和写操作做出响应。PCI的仲裁引脚是REQ#和GNT#,分别称为请求线和授权线,只有PCI主设备有这两个引脚。REQ#和GNT#成对地连到仲裁器,设备与设备的REQ#和GNT#是互不相连的。
PCI总线的仲裁过程是这样的:PCI主设备把REQ#电平拉低,表示向仲裁器请求占用总线,经仲裁获准后,仲裁器把这个设备的GNT#电平拉低,表示请求获准,该设备就可以使用总线了。当它不再使用总线时,使REQ#信号变为高电平,仲裁器就不再会给它分配总线资源。在本系统中,TM1300是PCI主设备,8029是PCI从设备,不存在共享总线的问题,所以不需要仲裁器,可以简单地把REQ# 和GNT#短接,相当于TM1300自己给自己授权。
(2) PCI_IDSEL信号线在设备的PCI配置读写中起关键作用。
PCI有一种特殊的读写周期,称为配置读写,这是在系统引导时,还没有给设备配置I/O或内存地址,软件只能通过配置读写访问设备。配置读写有两种,分别称为0型和1型,采用哪一种取决于总线的硬件连接。当配置读写操作不经过PCI桥时,使用0型,当要经过PCI桥时要用1型,0型读写的地址直接就是总线上的地址,1型读写的地址则要经过PCI桥的译码才成为最终的总线地址。本设计中,TM1300和8029是用PCI总线直连的,所以使用了0型配置读写。
AD〔00..31〕是PCI总线的共享地址和数据线,每一次PCI传送都分为地址周期和数据周期。在地址周期, 0型读写时AD〔00..31〕的内容如下:AD〔00〕和AD〔01〕总为“00”,因为配置读写是以双字为单位的;AD〔02〕-AD〔07〕是要读写的PCI配置空间的寄存器号;AD〔08〕~AD〔10〕是设备的功能号,在一块PCI卡上有多个功能设备时,为了进一步区分这些设备就要用到这几位,8029是单功能设备,这几位全为0;AD〔11〕-AD〔31〕是设备选择位,其中必须有且仅有一位为"1"(如图2所示),物理上这表现为总线的AD〔11〕-AD〔31〕中有一根为高电平,如果出高电平的这根线与某块PCI卡的PCI_IDSEL引脚相连,这块卡就会被激活,在紧接着的数据周期,它就会将其PCI配置空间相应寄存器的内容放到总线上供读取。?
(3)PCI_FRAME#,PCI_DEVSEL#,PCI_IRDY#,PCI_TRDY#引脚的处理。
这四个引脚均是低电平有效,需要接上拉电阻,保证在设备未驱动该引脚时处于稳定的无效状态, 上拉电阻的阻值在1kΩ到10kΩ范围内,阻值越小则芯片将该信号驱动为有效的时间越短,但是太小会导致电流过大,所以,要权衡考虑,本设计选用4.7kΩ。
上述三点对脱机情况下PCI设备的互连具有较普遍的参考意义,除此之外,本设计还有以下几点比较特殊:
·TM1300的PCI_INTA#引脚配置为输入,以接收8029的中断;?
· PCI时钟由TM1300提供;?
·8029的复位信号也就是TM1300的复位信号,由外部电路提供;?
·TM1300的PCI_STOP#,PCI_SERR#引脚悬空,因为8029不具备相应的附加功能。另外TM1300的PCI_INTB#,PCI_INTC#,PCI_INTD#引脚可以用作用户中断。
3 软件设计
软件的结构框图如图3所示。其中,TM1300运行pSOS,它是一个简单的实时多任务嵌入式操作系统,带有pNA+网络组件,pNA+相当于TCP/IP协议栈的扩展,它向上提供应用程序编程的socket接口,向下定义了一个与网络接口层交互的接口,包括8个函数,分别是:ni_init(接口芯片初始化)、ni_broadcast(发送广播分组)、ni_send(发送普通分组)、ni_getpkb(申请发送缓冲区)、ni_retpkb(归还接收缓冲区)、ni_ioctl(I/O控制操作)、ni_pool(统计量查询)、Announce(网络接口驱动调用它把接收到的数据包提交给pSOS)。网络接口层在本应用中就是8029的驱动程序,它通过硬件抽象层来驱动8029。硬件抽象层是PCI总线的配置读写和I/O读写指令集的总称。
软件执行的流程大致是:系统首先启动pSOS,pSOS加载网络接口驱动程序,然后调用驱动程序的ni_init函数,初始化8029的PCI配置空间并设置8029的工作参数,之后启动用户任务。在这里,用户任务是H.263编码进程。它对VI口读入的源图像进行压缩编码后,调用socket的接口函数sendto(sendto是UDP套接口专用的发送函数),把码流发送给pSOS,pSOS根据UDP协议进行封装后,调用ni_send函数,ni_send完成数据包从系统主内存到8029片上RAM的拷贝,然后启动8029发送数据。在接收的情况下,8029收到一个完整的数据包后,用中断通知CPU,CPU转而执行中断服务程序,中断服务程序将数据包从8029片上RAM中拷贝到系统的主内存,然后调用Announce函数,把数据块的指针,数据长度和其它信息提交pSOS,pSOS将数据包沿协议栈一层层上传,作出相应的处理。
软件的设计和pSOS操作系统的关系比较密切,限于篇幅,本文不对pSOS作详细介绍,可以参阅参考文献〔1〕和〔2〕的相关内容。另外,8029驱动程序的编写可以参照参考文献〔3〕。本文接下来重点介绍PCI配置空间的配置过程,这部分对于类似的设计有较普遍的参考意义。
PCI配置空间有64个字节,PCI片内都集成了这些寄存器,其中存储了该芯片的厂商号、设备号、设备类型等重要代码,还包括命令寄存器、基地址寄存器等控制其总线行为的寄存器,它们必须在设备初始化时正确配置,否则设备不能工作。
对8029PCI空间的配置需要三个步骤:?
首先,扫描总线,这一步的目的是找到8029的配置地址,直观地讲就是它的PCI_IDSEL引脚和哪根AD线相连,因为后续的配置写要根据这个地址寻址。扫描总线时,要对AD〔11〕到AD〔31〕每根线进行一次扫描,如果这根AD线连接了一个PCI设备的PCI_IDSEL引脚,那么用配置读函数读取PCI配置空间的0号寄存器时,应该返回该设备的设备和厂商代码,如果这根线实际未连接设备,则返回值是0,已知8029的设备和厂商代码是"0x802910ec",如果返回值与之相同,说明找到了8029,这时要记下这根AD线的序号。例如,我们在硬件上把8029的PCI_IDSEL和AD〔20〕相连,则扫描到的序号就应该是“20”。
其次,用配置写函数配置I/O读写使能,即在command寄存器写入“0x1”。
最后,用配置写函数配置I/O地址,即在I/O Base Adddress寄存器写入分配给该设备的I/O地址,例如“0xe400”。程序流程图如图4所示。
4 调试结果
根据以上设计,我们在原TM1300视频编码硬件系统的基础上加入了PCI接口,并编写了pSOS下8029的驱动程序。然后,在这个硬件平台上对8029的驱动部分进行了数据传送测试。
首先,我们用一个单独的UDP发送任务进行发送速率测试。这个任务高速向网络上的一台PC发送数据包,数据包的大小是变长的。该PC接收并对丢包数进行统计,其结果如表1。实验表明,在用网线直连的各种测试速率情况下都没有出错,当接入局域网后在发送速率为4.5Mbps时有突发的少量错误。由于UDP是不可靠的传输方式,所以这种错误是正常的。测试中UDP发送的最高速率可以达到5Mbps左右,它与硬件的最高速率(10Mbps)相比还有一定差距,主要原因是数据从系统主内存到8029片上RAM的拷贝过程目前尚未采用DMA方式,这是需要改进的地方。
然后,我们进行了编码和传送的联合测试。编码任务执行H.263数据压缩,然后把码流从以太网接口发出,在网络上的另一台PC上接收这个码流和进行解码播放。通过调整编码器的量化步长可以控制编码的输出码率。在实验环境下发现,在量化步长大于等于5、码率在700kbps以下时,基本没有丢包的情况,解码得到的图像比较稳定;当量化步长进一步减小、码率接近1Mbps时,出现丢包现象,解码的图像出现彩色方块。出现这种现象是因为H.263编码器对CPU资源的消耗很大,而且数据在主内存和8029片上RAM之间的复制采用的是I/O读写方式,也需要一定的CPU资源,当量化步长小于5时,处理复杂度超过了CPU的能力,从而产生了一定的误码。解决问题的途径一方面是改进数据的传送方式(采用DMA),另一方面需要对编码任务进行优化。
5 结束语?
本文把介绍重点放在了对于类似的设计有较普遍参考意义的部分,例如PCI总线接口的设计,PCI空间初始化的步骤等。对测试结果进行了较详细的分析,提出了以后改进的方向。?
参考文献?
1 倪强. 基于TM1300的视频监控系统码率控制和远端设备控制接口技术研究:〔学位论文〕. 南京:南京邮电学院信息工程系,2002
2 倪强,胡明. 基于PSTN的视频监控系统的远端设备. 电子工程师,2002(4): 14~16
3 ***. 计算机通信技术及其程序设计. 西安:西安电子科技大学出版社,1998
评论
查看更多