PCI接口芯片s5935及其应用
摘要:s5935是AMCC公司生产的 PCI接口芯片,可实现直通(PASS-THRU)、邮箱(MAILBOX)、FIFO/DMA三种工作方式。文章简要介绍了这三种工作方式,并给出了s5935的WDM驱动编程。
关键词:PCI WDM s5935
PCI局部总线由于具有高速率以及支持即插即用等特点在微机系统中得到广泛应用。利用PCI接口芯片可以方便地设计PCI规范板卡。s5935是AMCC公司s59xx系列PCI接口芯片中的一种。该芯片功能强大,可用于高速数据采集处理卡、视频加速卡以及多媒体通信等。其主要特点如下:
●兼容PCI2.1规范,可实现PCI总线主设备和从设备功能;
●具有高达132MB/s的传输速率;
●支持8/16/32位外加用户总线;
●可选nvRAM和扩展BIOS;
●具有直通、邮箱、FIFO/DMA三种工作方式;
●适于32位5V电平PCI卡,具有160脚PQFP和208脚TQFP两种封装。
javascript:window.open(this.src);" style="cursor:pointer;"/>
1 s5935的结构
图1所示是s5935的内部结构框图。s5935中的寄存器分为PCI配置寄存器组和操作寄存器组。前者可从nvRAM的40h~7fh位载入,也可以是默认值,s5935只能实现首部类型0和单功能设备配置。后者用于s5935与外加总线的操作配置和数据传输(如中断控制,邮箱入口等),从PCI总线访问时称为PCI操作寄存器组,地址为PCI操作寄存器基址加各寄存器偏移地址;而从外加总线访问时,称为外加总线操作寄存器组,可通过ADR[6:2]选择。
s5935的引脚接口分为PCI总线接口、外加总线接口和nvRAM接口。外加总线接口包括中断、复位输出、数据总线及控制引脚,这三种工作方式各有其独立的控制引脚。
2 s5935的工作方式
s5935具有直通、邮箱和FIFO三种工作方式,其中直通方式(Pass-Thru)可以实现PCI总线对外加总线的实时读写,它可对PCI总线读写时序直接响应;邮箱方式(MAILBOX)可通过PCI总线与外加总线的一方读/写邮箱,另一方接收中断/查询并写/读邮箱;以上两种工作方式只能在s5935作为PCI从设备时实现。 而FIFO方式则可使其作为总线主设备来启动DMA数据传输。在典型的PCI数据处理卡中,可用s5935作为PCI接口通过DSP处理数据,同时使用FPGA完成DSP与s5935间的逻辑转换;邮箱或直通方式用于主机和DSP之间的命令和参数传输,FIFO/DMA方式则可完成高速批量数据传送。下面是s5935的PCI配置及三种工作方式在Win-dows2000下的WDM驱动程序(DDK编程)。
2.1 s5935的PCI配置
PCI配置寄存器格式可参考PCI协议文档。如果不使用nvRAM加载s5935的PCI配置寄存器,将无法实现FIFO和直通工作方式。PCI配置寄存器中的基址寄存器BASE ADDRESS 0对应于PCI操作寄存器的基地址;BASE ADDRESS 1至4则分别对应于四个直通通道地址(无nvRAM时默认为0)。上述基址寄存器的内容可由系统在初始化时查询以确定映射方式(I/O或内存映射)、直通通道位宽和地址范围,然后由系统写入物理地址,这种具体配置方法比较麻烦(见参考文献1和2)。同时,nvRAM的45h字节的第5、6位必须置0以使能FIFO操作。
2.2 直通方式
s5935提供有四条直通通道,可以实现单周期和突发数据传送。在主机驱动程序中,读写直通通道地址可实现数据传输,如:
WRITE PORT USHORTBASE ADDRESS 3+OFF-SET ADDRESS,DATA;
s5935外加总线接口部分相关引脚:
PTATN: 输出,直通周期开始;
PTNUM10: 输出,指示四个直通通道之一;
PTBE30: 输出,DQ310字节使能;
PTWR: 输出,读写选择;
PTADR: 输入,OFFSET ADDRESS从直通地址寄存器驱动至DQ310;
PTRDY: 输入,表明外加总线完成传输;
ADR62: 输入,选择外加操作寄存器;
2.3 邮箱方式
s5935有输入、输出邮箱各四个,多采用中断/查询方式传输数据,外加总线则可由ADR6:2和IRQ等引脚实现。中断控制/状态寄存器用于实现中断的使能配置、查询和清除,邮箱状态寄存器可查询邮箱状态,通过控制/状态寄存器可使邮箱复位。还可以通过EA08脚直接读写外加总线4号输出邮箱的第三字节,这也是直连外部中断的一种简单方法。在Windows2000下,其典型WDM驱动程序中断相关部分模型如下(地址I/O映射):
AddDevice()//加载设备
……
IoInitializeDpcRequest();
……
DispatchPNP //
……
case CmResourceTypeInterrupt:
GetInterruptRes; //取得中断资源
……
WRITE PORT ULONG(BASE ADDR