PCI总线协议的FPGA实现及驱动设计

PCI总线协议的FPGA实现及驱动设计

现在市面上存在着各种PCI接口芯片,如AMCC公司的

S5933,PLX的9080系列等。专用芯片可以实现完整的PCI主设备与从设备模式的接口功能,将复杂的PCI总线接口转化为相对简单的用户接口,但系统结构受接口芯片的限制,不能灵活地设计目标系统,且成本较高。本文使用符合PCI电气特性的FPGA芯片进行简化的PCI接口逻辑设计,实现了33MHz、32位数据宽度的PCI从设备模块的接口功能,节约了系统的逻辑资源,且可以将其它用户逻辑集成在同一块芯片上,降低了成本,增加了设计的灵活性。另外,还给出了Windows9x系统下的设备驱动程序,可以与应用程序接口,形成一个完整的系统。目前,本系统已经被印染企业应用在数据采集和处理等方面。1系统构成与功能描述系统的总体框图如图1所示。

由图1可见,系统的硬件平台为一块PCI卡。此卡的结构十分简洁,主要由FPGA芯片、RAM芯片和输出接口三部分组成。其中,FPGA芯片集成了PCI接口模块和数据处理模块。PCI接口模块实现了33MHz工作时钟、32位总线宽度的接口功能,支持I/O空间、内存空间及配置空间的读写和PCI中断功能。由于简化的PCI接口占用的逻辑资源较少,可以在同一块芯片中集成其他用户逻辑。作为一个应用实例,本文加入了一个数据处理模块,对PCI接口传送来的数据进行处理,通过片外的输出接口输出到下位机。RAM芯片为数据处理提供缓存功能。2从设备模式下的简化PCI协议的实现为了实现PCI接口的基本功能,必须完成以下几个模块:(1)PCI配置空间设置。PCI协议支持三种地

PCI总线协议基础

PCI总线协议基础 PCI总线协议基础 PCI基本总线协议传输机制是猝发成组数据传输。一个分组由一个地址相位和一个或多个数据相位组成。 1.PCI总线的传输控制 PCI总线上所有的数据传输基本上都是由以下三条信号线控制的: FRAME#:由主设备驱动,说明一次数据传输周期的开始和结束。 IRDY#:由主设备驱动,表示主设备已经作好传送数据的准备。 TRDY#:由从设备驱动,表示从设备已经作好传送数据的准备。 当数据有效时,数据源设备需要无条件设置xRDY#,接收方可以在适当的时间发出xRDY#信号。FRAME#信号有效后的第一个时钟前沿是地址相位的开始,此时,开始传送地址信息和总线命令,下一个时钟前沿进入一个或多个数据相位。每当IRDY#和TRDY#同时有效时,所对应的时钟前沿就使数据在主从设备之间传送。在此期间,可由主设备或从设备分别利用IRDY#和TRDY#的无效而插入等待周期。 一旦主设备设置了IRDY#,将不能再改变IRDY#和FRAME#,直到当前的数据相位完成为止,而此期间不管TRDY#的状态是否发生变化。一旦从设备设置了TRDY#,就不能改变DEVSEL#、TRDY#或STOP#,直到当前的数据相位完成为止。也就是说,只要数据传输已经开始,那么在当前数据相位结束之前,不管是主设备还是从设备都不能撤消命令,必须完成数据传输。 最后一次数据传输时(可能紧接地址相位之后),主设备应撤消FRAME#信号而建立IRDY#,表明主设备已作好了最后一次数据传输的准备。当从设备发出TRDY#信号,表明最后一次数据传输已经完成,接口转入空闲状态,此时FRAME#和IRDY#均被撤消。 对于PCI总线的传输,可总结出以下几条规则: ①FRAME#和IRDY#决定总线的忙/闲状态。当其中一个有效时,表示总线忙;两个都无效时,总线进入空闲状态。 ②一旦FRAME#被置为无效,在同一传输期间不能重新置为有效。 ③除非设置IRDY#,一般情况下不能设置FRAME#无效(在FRAME#无效后的第一个时钟沿IRDY#必须保持有效)。 ④一旦主设备已使IRDY#有效,在当前数据相位完成前,不能改变IRDY#或FRAME#的状态。 ⑤在完成最后一个数据相位之后的时钟周期主设备必须使IRDY#无效。 2.PCI总线的寻址 PcI总线定义了三种物理地址空间:内存地址空间、I/O地址空间及配置地址空间,前两种为通常意义的地址空间,第三种配置地址空间用以支持PCI的硬件配置。 PCI总线的地址译码是分散的,每个设备都有自己的地址译码逻辑,从而省去了中央译码逻辑。PCl支持对地址的正向译码和负向译码,所谓正向译码,是指总线上每个设备都监视地址总线上的访问地址,判断是否落在自己的地址范围内,译码速度较快。所谓负向译码,是指要接受未被其他设备在正向译码中接受的所有访问,因此,此种译码方式只能由总线上的一个设备来实现(一般是连接

如何写linux pci设备驱动程序-看

何写linux pci设备驱动程序 original file:/Documentation/pci.txt translated by terrace PCI总线应用领域及其广泛并且令人惊奇。不同的pci设备有不同的需求以及不同的问题。因此,在linux内核中pci层支持就非常重要啦。本文档就是想为驱动程序设计开发人员解决pci处理中的各种问题。 Pci设备驱动程序的结构 现在有两种风格的的pci驱动程序结构:新风格的驱动(即让pci层来做大量设备探测工作并且支持热插拔功能)和旧风格的驱动(即由驱动程序自己探测设备)。除非你有很好的理由,否则就不要用旧风格写驱动程序。当驱动程序找到所驱动的设备后,将执行以下步骤: ①.启用设备 ②.访问设备配置空间 ③.检测设备资源(如基地址和中断号) ④.分配设备资源与设备通讯 下文将论述以上大部分步骤,其余部分请参考,它有不错的注释。 如果没有配置pci 子系统(即CONFIG_PCI 没有置位),以下介绍的大部分函数都被定义为内联函数,它们要么是空的,要么返回对应的错误代码以避免在驱动中出现过多的条件宏ifdefs。1.新风格的驱动程序 新风格的驱动程序只是在初始化时调用pci_register_driver,调用时使用一个指向struct pci_driver 的结构指针。该指针包含以下几个分量: name 驱动程序名称 id_table 指向一个与驱动程序相关的设备ID表的指针。大多数驱动程序应当用MODULE_DEVICE_TABLE(pci,…)将该设备ID表导出。在调用prob( )时设成NULL 以让系统检测到所有的pci设备。 probe 指向设备检测函数prob( ) 的指针。该函数将在pci设备ID与设备ID表匹配且还没有被其它驱动程序处理时(一般在对已存在的设备执行pci_register_driver或以后又有新设备插入时)被调用。调用时传入一个指向struct pci_driver结构的指针和与设备匹配的设备ID表做参数。若成功(驱动程序检测到pci设备)则返回0,否则返回一个负的错误代码。这个函数总是在上下文之间调用的,因此可以进入睡眠状态的。 remove 指向一个设备卸载函数remove( )的指针。该函数在pci设备被卸载时(如在注销设备驱动程序或者手动拔出该设备)被调用。同probe一样,该函数也是可以睡眠的。save_state 在设备被暂停前所保存的设备状态。 suspend 将设备转入低功耗状态而暂停。 sesume 将一个暂停的设备(低功耗状态中)唤醒启动。 enable_wake 允许设备产生唤醒事件以从低功耗状态中恢复。 (请参考Documentation/power/pci.txt 文件中关于pci电源管理以及相关函数的说明) ID表是一个struct pci_device_id 类型的数组,该数组以该类型中每一项都为NULL时结束。struct

PCI总线标准协议(中文版)

8.4.2 PCI总线信号定义 在一个PCI应用系统中,如果某设备取得了总线控制权,就称其为"主设备";而被主设备选中以进行通信的设备称为"从设备"或"目标节点''。对于相应的接口信号线,通常分为必备的和可选的两大类,为了进行数据处理、寻址、接口控制、仲裁等系统功能, PCI接口要求作为目标的设备至少需要47条引脚,若作为主设备则需要49条引脚。下面对主设备与目标设备综合考虑,并按功能分组将这些信号表示在图8.19中。其中,必要的引脚在左边,任选的引脚在右边。 一.信号类型说明 图8.19 PCI引脚示图 为了叙述方便,将PCI信号按数传方向及驱动特性划分为五种类型,各种类型的规定 如下: in:输入信号。 out:输出驱动信号。 t/s:表示双向三态输入/输出驱动信号。 s/t/s:持续三态(Sustained Tri-State),表示持续的并且低电平有效的三态信号。在某一时刻只能属于一个主设备并被其驱动。这种信号从有效变为浮空(高阻状态)之前必须保证使其具有至少一个时钟周期的高电平状态。另一主设备要想驱动它,至少要等到该信号的原有驱动者将其释放(变为三态)一个时钟周期之后才能开始。同时,如果此信号处于持续的非驱动状态时,在有新的主设备驱动它之前应采取上拉措施,并且该措施必须由中央资源提供。 o/d:漏极开路(Open Drain)可作线或形势允许多个设备共同使用, 二. PCI总线信号定义 PCI总线的信号线共有100根,下面按功能分组进行说明。

1.系统引线 CLK in:时钟输入,为所有PCI上的接口传送提供时序。其最高频率可达66MHz,最低频率一般为0 (DC),这一频率也称为PCI的工作频率。对于PCI的其他信号,除、、、之外,其余信号都在CLK的上升沿有效(或采样)。 in:复位,用来使PCI专用的特性寄存器和定时器相关的信号恢复规定的初始状况。每当复位时, PCI的全部输出信号一般都应驱动到第三态。 2.地址和数据引线 AD0~AD31 t/s:地址、数据多路复用的输入/输出信号。在有效时,是地址周期;在 和同时有效时,是数据周期。一个PCI总线的传输中包含了一个地址信号周期和一个(或多个)数据周期。PCI总线支持突发方式的读写功能。 地址周期为一个时钟周期,在该周期中AD0~AD31线上含有一个32位的物理地址。对于I/O操作,它是一个字节地址;若是存储器操作和配置操作,则是双字地址。 在数据周期, AD0~AD7为最低字节, AD24~AD31为最高字节。当有效时,表示写数据稳 定有效,有效表示读数据稳定有效。 ~3 t/s:总线命令和字节使能多路复用信号线。在地址周期内,这四条线上传输的是总线命令;在数据周期内,传输的是字节使能信号,用来表示在整个数据期中, AD0~AD31上哪些字节为有效数据。 3.接口控制信号 s/t / s:帧周期信号。由当前主设备驱动,表示一次访问的开始和持续时间。 无效时,是传输的最后一个数据周期。 s / t / s:主设备准备好信号。该信号有效表明发起本次传输的设备(主设备)能够完成一个 数据期。它要与配合使用,当这两者同时有效时,才能进行完整的数据传输,否则即为等待周期。在写周期,该信号有效时,表示有效的数据信号已在AD0~AD31中建立;在读周期,该信号有效时,表示主设备已做好接收数据的准备。 s/t/s:从设备准备好信号。该信号有效表示从设备已做好完成当前数据传输的准备工作, 此时可进行相应的数据传输。同样,该信号要与配合使用,这两者同时有效数据才能进行完整传输。在写周期内该信号有效表示从设备已做好了接收数据的准备。在读周期内,该信号有效表示有效数据已被送入AD0~AD31中,同理, 和的任何一个无效时都为等待周期。 s / t / s:停止数据传送信号,该信号由从设备发出。当它有效时,表示从设备请 求主设备终止当前的数据传送。 s / t / s:锁定信号。是由PCI总线上发起数据传输的设备控制的,如果有几个不同的设备在 使用总线,但对信号的控制权只属于一个主设备(由信号标定)。当信号有效时,表示驱动它的设备所进行的操作可能需要多个传输才能完成,如果对某一设备具有可执行的存储器,那么它必须能实现锁定,以便实现主设备对该存储器的完全独占性访问。对于支持 锁定的目标设备,必须能提供一个互斥访问块,且该块不能小于16 个字节。连接系统存储器的主桥路也必须使用。 IDSEL in:初始化设备选择信号。在参数配置读写传输期间,用作片选信号。 s/t/s:设备选择信号,由从设备驱动,该信号有效时,表示驱动它的设备已成为当前访问的从设备。它有效表明总线上的某一设备已被选中。 4.仲裁信号 t/s:总线请求信号。该信号一旦有效即表示驱动它的设备要求使用总线。它是一个点到点的 信号线,任何主设备都应有自己的信号。 t /s:总线允许信号。用来向申请占用总线的设备表示其请求已获批准。这也是一 个点到点的

教你设计pci总线的高速数据采集卡(基于pci9054)

教你设计PCI总线的高速数据采集卡(基于PCI9054) 2007-03-13 21:02 眼下有不少场合需要用到PCI总线的数据采集卡,下面我就来谈一下设计PCI数采卡的原理及要点。 首先我要以我的实际经验,纠正存在于很多人心里的几个误区: 1.设计PCI采集卡要通读PCI协议。 相信有很多初学者都在这个地方被吓住了,几百页的英文要通读并理解谈何容易!其实PCI协议处理的这部分功能已经被PCI接口芯片完成了,如PLX公司的9054、9056和9052等等,它封装了PCI协议的细节,我们只需要控制这颗接口芯片local端的几个控制线就可以完成PCI总线的数据传输。PCI协议也有它的用处,我们只需要在某些需要注意的地方查阅一下相关章节即可,比如PRSNT1#和PRSNT2#引脚至少要有一个下拉,才能识别到卡,这就是PCI协议中的规定。 2. PCI卡布线很复杂,一不小心就可能不成功。 其实对于32位33MHz的PCI总线来说,布线相对比较简单,只要稍加注意就不会出问题。比如:PCI总线的时钟线要做成2500(+/-100)mil,这个是要注意的一点,一般PCI卡上的蛇行弯曲走线就是这条线,因为走直线距离一般都达不到此长度。其他要求,比如地址和数据线要在1500mil以内,其实你超过一些也没什么问题,不要超太多就好了。 3. PCI卡的驱动程序编写很难。 其实无论是软件还是硬件设计,都有一些相对成熟的资料可以参考。对驱动程序来说也是这样,对实际项目的开发没有几个是从头到尾自己在编代码,都可以在网上找到一些成熟的代码,然后自己修改一下即可,况且PCI卡的驱动程序又相对比较成熟,可参考的资料也较多。所以你要从网上找代码,向PCI接口芯片的供应商要代码,等收集到足够多的代码,再配以适当的教材(比如对于windows2000/XP系统下的WDM驱动程序,可以参考武安河老师的教材就足够),就可以进行你自己的驱动设计了。 下面我再针对具体应用谈谈PCI采集卡的设计: 一般数采卡的情况是将A/D转换后的数据通过PCI总线上传到PCI机,然后利用

PCI9052驱动配置方法

安装PCI9052接口卡Windows驱动和配置EEPROM 注意的地方主要有这几个: 1.TEST引脚要下拉,这是正常操作模式。如果上拉则是进入芯片测试模式。2.PCI金手指处的PRSNT1#和PRSNT2#引脚一定至少要有一个下拉,或者两个都下拉(具体可参照PCI协议V2.3),否则找不到卡。 3.模式选择引脚MODE0和MODE1如果都下拉,是C模式,即LOCAL端的地址线和数据线是分开的;如果MODE0上拉,MODE1下拉,则是J模式,即LOCAL端的地址线和数据线复用。我采用的是C模式。 4.这是很关键的一点,即EEPROM的EEDI/EEDO引脚的配置。有这样三种情况: A 当不安装EEPROM时,该引脚一定要下拉,用1k的下拉电阻即可。此时 启动后9054会按默认的值进行配置。 B 当安装空白的EEPROM时,该引脚需要上拉。 C当安装烧录好的EEPROM时,该引脚需要上拉。 这里解释一下:卡设计好后,如果没有配置好EEPROM的值,也可以测试卡的硬件,按A或B步骤,把卡插在PC的PCI插槽上,如果硬件设计没有问题,是可以找到卡的。所以设计的时候应将此引脚设计成上下拉,根据需要装上拉或下拉电阻。这可以避免只能等配置好EEPROM的值后才能测试卡的硬件设计正确与否。 5.EEPROM的设计问题,9054是应该搭配93C56的,即2k容量的EEPROM,9052是搭配93C46这种1k的EEPROM。至于具体的厂商,可以选用ST的M93C56或者HOLTEK的HT93LC56,PLX公司的网站上有EEPROM的选型指导,可以下载来看。据我的调查,市场上很容易买到ST的这种片子,其他品牌的不是太好买。另外,如果你是有烧录机,打算将ROM烧录过后再安装在板子上,那么采用插件的芯片比较方便,如果采用贴片的,烧录机要有相应的烧录SOP-8的转接头才行。如果你是打算在线烧录,可以采用贴片的S OP-8的封装的片子,直接把空白的片子焊接在板子上即可,关于在线烧录,以下会详细解释。 配置方法 1.将接口卡插入计算机PCI插槽,启动计算机后,windows 提示找到新硬件:其他PCI 桥设备。 *注:红圈所圈名称是安装驱动并配置EEPROM后的名称,安装驱动前设备类型未知 2.安装驱动,在设备管理器中找到一个黄色问号的PCI设备,打开其属性页,如图操作:

PCI驱动编程基本框架

Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux 内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。 1. 字符设备和块设备 Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示,例如,系统中的第一个IDE硬盘使用/dev/hda表示。每个设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是次设备号,标识使用同一设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致,否则用户进程将无法访问到设备驱动程序。 在Linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来,PCI卡通常都属于字符设备。 2. 设备驱动程序接口 Linux中的I/O子系统向内核中的其他部分提供了一个统一的标准设备接口,这是通过include/linux/fs.h中的数据结构file_operations来完成的: struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

PCI设备驱动

PCI设备驱动 1.PCI设备驱动一 一、PCI简介 PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径或信道。典型情况是,总线是连接于一个或多个导体的电气连线,总线上连接的所有设备可在同一时间收到所有的传输内容。总线由电气接口和编程接口组成。本文讨论Linux 下的设备驱动,所以,重点关注编程接口。 PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用在桌面及更大型的计算机上的外设总线。PCI架构被设计为ISA标准的替代品,它有三个主要目标:获得在计算机和外设之间传输数据时更好的性能;尽可能的平台无关;简化往系统中添加和删除外设的工作。 二、PCI寻址 从现在开始,我想尽可能通过一些实际的例子来说明问题,而减少理论方面的问题的描述,因为,相关的理论的东西,可以在其它地方找到。 我们先来看一个例子,我的电脑装有1G的RAM,1G以后的物理内存地址空间都是外部设备IO在系统内存地址空间上的映射。/proc/iomem描述了系统中所有的设备I/O在内存地址空间上的映射。我们来看地址从1G开始的第一个设备在/proc/iomem中是如何描述的:40000000-400003ff : 0000:00:1f.1 这是一个PCI设备,40000000-400003ff是它所映射的内存地址空间,占据了内存地址空间的1024 bytes的位置,而0000:00:1f.1则是一个PCI外设的地址,它以冒号和逗号分隔为4个部分,第一个16位表示域,第二个8位表示一个总线编号,第三个5位表示一个设备号,最后是3位,表示功能号。 因为PCI规范允许单个系统拥有高达256个总线,所以总线编号是8位。但对于大型系统而言,这是不够的,所以,引入了域的概念,每个PCI域可以拥有最多256个总线,每个总线上可支持32个设备,所以设备号是5位,而每个设备上最多可有8种功能,所以功能号是3位。由此,我们可以得出上述的PCI设备的地址是0号域0号总线上的31号设备上的1号功能。那上述的这个PCI设备到底是什么呢?下面是我的电脑上的lspci命令的输出: 00:00.0 Host bridge: Intel Corporation 82845 845 (Brookdale) Chipset Host Bridge (rev 04) 00:01.0 PCI bridge: Intel Corporation 82845 845 (Brookdale) Chipset AGP Bridge(rev 04) 00:1d.0 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #1) (rev 02) 00:1d.1 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #2) (rev 02) 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 42) 00:1f.0 ISA bridge: Intel Corporation 82801CAM ISA Bridge (LPC) (rev 02) 00:1f.1 IDE interface: Intel Corporation 82801CAM IDE U100 (rev 02) 00:1f.3 SMBus: Intel Corporation 82801CA/CAM SMBus Controller (rev 02) 00:1f.5 Multimedia audio controller:Intel Corporation 82801CA/CAM AC'97 Audio Controller (rev 02) 00:1f.6 Modem: Intel Corporation 82801CA/CAM AC'97 Modem Controller (rev 02) 01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 420 Go](rev a3) 02:00.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller(rev 46)

基于PCI总线的视频采集卡驱动程序的设计与实现

第5卷 第10期 中 国 水 运 Vol.5 No.10 2007年 10月 China Water Transport October 2007 收稿日期:2007-8-4 作者简介:周敏均 (1983-) 杭州电子科技大学 自动化学院 研究生 (310012) 研究方向:检测技术与自动化装置 基于PCI 总线的视频采集卡驱动程序的设计与实现 周敏均 杨成忠 江加加 摘 要:本文介绍了基于PCI 总线的视频采集卡驱动程序的设计和实现。视频采集卡基于PCI 总线的设计更好地满足了高速大容量的数据传输需求;针对视频设备的内核流驱动的设计更方便了上层应用软件的开发。该视频采集卡驱动已经成功应用于视频监控系统中,有效地提高了视频监控系统的功效。 关键词:PCI 总线 视频采集卡 内核流驱动 中图分类号:TP311.131 文献标识码:A 文章编号:1006-7973(2007)10-0149-03 一、引言 随着计算机、网络、多媒体技术以及全球安防事业的迅猛发展,数字视频技术得到了长足地发展,视频采集卡的应用也越来越广泛。但是由于视频数据传输高速、大量的特点,传统的使用基于串口、并口或ISA 总线传输数据的方式已经不能满足其传输的需求。同时,由于其复杂性,现在各厂商都是自己提供采集卡的SDK,没有统一的界面,使得上层应用的开发和设备的使用非常不便,而基于内核流的驱动程序能够很好的解决这个问题,上层应用程序能够通过系统提供的统一接口访问底层硬件。当前,基于PCI 总线的视频采集卡以其强大而灵活的功能、高度的集成性成为主流产品。为此,本文设计了基于PCI 总线的视频采集卡,并开发了相应的基于内核流的驱动程序。 二、视频采集卡硬件系统 PCI 总线是近年来出现的一种高性能的局部总线,它理论上提供133MB/s 的传输速率,支持猝发式读写,具备完整的多总线主控能力,支持即插即用,很适合网络适配器、硬盘驱动器、全动态数字视频卡、图形卡及各类高速外设应用。PCI 总线规范十分复杂,其接口的实现比ISA、EISA 困难,目前实现PCI 接口的有效方案有使用可编程逻辑器件和使用专门芯片两种。 图1 视频监控系统总体框图 在高分辨率图像实时处理中数据量相当庞大,视频采集卡必须不间断地采集视频序列中的每帧图像,同时在采集下一帧视频数据时必须把这些数据传入PC 系统。如果不能及时地处理第一帧数据,使得处理时间超过相邻两帧之间的间 隔时间,则会出现数据丢失现象。该视频采集卡采用SAA7130HL 视频采集芯片将模 拟视频信号转化为数字图像数据,再通过PCI 总线接口芯片PCI6150将数字图像 数据读入计算机,最后通过应用程序将图像显示出来。这个设计能充分满足视频传输及处理的需求。视频监控系统总体框图如图1。 三、视频采集卡驱动程序设计 为了支持新的业务和新的PC 外部设备类型对驱动程序的开发,微软推出了用于Windows2000和Windows NT 的统一的WDM(Windows Driver Model,简称WDM)驱动程序模型。而内核流驱动是针对多媒体设备的驱动模型,它是WDM 重要组成部分。它的存在将使上层应用程序的开发更加方便,应用程序通过系统提供的统一接口即可使用设备。 1.驱动工作原理 内核流驱动是一种内核模式驱动。它的工作原理为: (1)当视频采集卡插入PCI 插槽,系统的PnP 管理器检测到和内核流驱动匹配的视频设备时,便通过I/O 管理器向流类驱动(Stream class driver)发送设备的I/O 请求,如:对设备的初始化等。 (2)同时,流小驱动(stream minidriver)向流类驱动进行注册,告知流类驱动它是合法的,接着流类驱动把接收到的I/O 请求以SRB (流请求块)的形式发送给流小驱动。 (3)流小驱动得到SRB 后,将其进行解析并把得到的信息(如对设备进行初始化)通过回调函数返送给流类驱动,流类驱动便根据流小驱动返送的信息创建相应的功能设备对象、DMA 适配器以及分配缓存等。 (4)建立video capture、preview 和VBI 输出pin 的过滤器,以及输入资源选择的crossbar。 (5)当驱动得到视频流数据后一路直接送到显卡进行显示,另一路则进行视频压缩保存起来。 2.驱动的初始化

PCI设备的WDM驱动程序设计-9052

PCI设备的WDM驱动程序设计 柳泉罗耀华柳华伟 摘要:本文详细地讨论了利用DDK开发PCI设备的WDM驱动程序的设计原理、方法及在设计中注意事项,实现了以芯片PCI9052开发的PCI卡的具有内存和I/O读写及中断处理的WDM驱动程序。 关键字:PCI,WDM,驱动程序,DDK 在Windows操作系统中,为了保证系统的安全性和可移植性,对应用程序对硬件的操作进行了限制,尤其Windows 2000和Windows XP,不支持直接对系统的硬件资源的操作。因而在设计开发PCI设备时,需要开发相应的驱动程序来实现对PCI设备的操作,用户应用程序通过驱动程序来访问PCI设备。 由于计算机硬件设备都存在不同的特点,因此各种设备的驱动程序也都有自己的特点,比如PCI设备、USB设备等等。尽管在整体框架中基本相同,但设备功能上不同,因此本文以PCI桥芯片PCI9052开发的PCI卡为硬件设备,来探讨PCI设备的驱动程序的开发。 1.驱动程序类型和开发工具的选择 在WINDOWS操作系统下,支持PCI总线及其设备的驱动程序类型有支持Windows 98/95的VxD、支持Windows NT的NT式驱动程序和支持Windows 2000、Windows XP 和Windows 98的WDM(Windows Driver Model)。前两种驱动程序类型由于其支持的操作系统的逐渐淘汰而淘汰。现在主流的操作系统是Windows 2000和Windows XP,因此开发PCI设备的驱动程序最好的方案是WDM驱动程序。在一个系统中开发出WDM 驱动程序,稍加修改即可在其他系统中编译运行。 WDM是在Windows NT驱动程序体系的基础上发展而来的,修改或增加了即插即用、电源管理等功能,使之适应硬件和用户的要求。 开发WDM驱动程序的主要工具是微软为各操作系统提供的开发软件包Device Driver Kits(DDK) ,该软件包为驱动程序开发者提供了用于驱动程序开发的资源文件、编译连接程序、开发技术文档等。还有第三方提供的开发工具:NuMega公司的DriverStudio和Jungo公司的WinDriver,这些工具是在DDK的基础上为方便开发用户而进行开发的工具。在使用中,虽然利用DDK开发驱动程序难度较大,但是代码非常简洁,结构清晰,效率也高。利用第三方开发工具使用简单,开发速度较快,但对于驱动程序的理解和深入开发不如DDK。因此选择DDK开发PCI设备驱动程序,虽然开始会觉得非常复杂,但从执行效率和功能上会更有利。 2.PCI设备驱动程序的特点 在开发驱动程序之前对PCI总线和硬件设备进行了解是十分必要的,而且还要详细地掌握PCI设备的特性以及PCI设备驱动程序在设备程序栈的关系等,以便进行WDM 驱动程序的设计。

PCI总线驱动

PCI总线驱动的机制 1.总线子系统初始化 系统初始化时会调用 ■void __init driver_init(void) { 。。。。。。 buses_init(); 。。。。。。 } ■ ★I nclude/linux/kobject.h #define decl_subsys(_name,_type,_uevent_ops) \ struct subsystem _name##_subsys = { \ .kset = { \ .kobj = { .name = __stringify(_name) }, \ .ktype = _type, \ .uevent_ops =_uevent_ops, \ } \ } ★ Drivers/base/bus.c static struct kobj_type ktype_bus = { .sysfs_ops = &bus_sysfs_ops, }; ★ static decl_subsys(bus, &ktype_bus, NULL); bus_subsys={ .ket = { .kobj = { .name = “bus”, .ktype = &ktype_bus, .uevent_ops = NULL, } } ★int __init buses_init(void) { return subsystem_register(&bus_subsys); }

在buses_init中调用subsystem_register时,bus_subsys作为sysfs root 目录下的项被建立(因为其kset.kobj.parent的值为NULL) ■pci总线初始化 ★struct bus_type pci_bus_type = { .name = "pci", .match = pci_bus_match, .uevent = pci_uevent, .probe = pci_device_probe, .remove = pci_device_remove, .suspend = pci_device_suspend, .suspend_late = pci_device_suspend_late, .resume_early = pci_device_resume_early, .resume = pci_device_resume, .shutdown = pci_device_shutdown, .dev_attrs = pci_dev_attrs, }; ★struct device_attribute pci_dev_attrs[] = { __ATTR_RO(resource), __ATTR_RO(vendor), __ATTR_RO(device), __ATTR_RO(subsystem_vendor), __ATTR_RO(subsystem_device), __ATTR_RO(class), __ATTR_RO(irq), __ATTR_RO(local_cpus), __ATTR_RO(modalias), #ifdef CONFIG_NUMA __ATTR_RO(numa_node), #endif __ATTR(enable, 0600, is_enabled_show, is_enabled_store), __ATTR(broken_parity_status,(S_IRUGO|S_IWUSR), broken_parity_status_show,broken_parity_status_store), __ATTR(msi_bus, 0644, msi_bus_show, msi_bus_store), __ATTR_NULL, }; ★static int __init pci_driver_init(void) { return bus_register(&pci_bus_type); } postcore_initcall(pci_driver_init); 通过postcore_initcall声明,使pci_driver_init函数被链接到.initcall.init段。这个段的函数在初始化时由static void __init do_initcalls(void)函数调用。最终系统在初始化线程static int __init

linux设备驱动之pci设备的IO和内存

linux设备驱动之pci设备的I/O和内存 ------------------------------------------ Pci设备的I/O和内存是一个比较复杂的问题.如下的总线结构: 在上图的总线结构中,ethernet设备和pci-pci bridge的同类型资源空间必须要是pci bus0的一个子集 例如,pci bus 0的I/O端口资源是0x00CC~0x01CC. Ethernet设备的I/O范围的是 0x00CC~0x0xE0.那么pci-pci bridge的I/O端口范围就必须要在0x0xE0~0x01CC之间. 同样,SCSI和VIDEO同类型资源必须要是pci_bus1的子集.pci bus1上有一个pci桥,对应的资源也就是它所连桥上的资源.即pci_bus->self. 也就是说,下层总线的资源是它上层总线资源的子集。上层总线资源是下层总线资源的父集。其实,每个PCI设备的资源地始地址都是由操作系统设置的.在x86上,都由bios设置好了.假若没有bios的时候,我们应该怎么去设置设备的资源起始范围呢? 可能在pci枚举完成之后: 1:从根总线开始,设置根总线的资源范围是从0开始,到0xFFFF或者0xFFFFFFFF的最大范围. 2:对其它的设备,可往其资源寄存器全部写入1,就可以求得该资源项的类型和长度. 3:设备从根总线的资源那里分得对应长度的资源. 4:如果设备是pci-pci bridge,则递归配置它. 可能有人会有这样迷惑,对应于上图,如果pci-pci bridge的资源大小是N.而SCSI和video资源范围超过了N怎么办呢? 我们必须要注意一点,总线的区间是可以自已设定的,而设备资源的区间是在设计的时候就已经 确定好了.也就是说,我们可以更改pci device区间的起始地址,但我们不能改变它的大小. 因此,出现了上面所说的这种情况.可能是由bios在处理PCI的时候出现了BUG.我们需要调整总线的资源区间.

DSP与PCI总线

PCI总线接口与DSP的HPI接口 1 HPI接口功能及特点 主机接口HPI(Host Pott Interface)是C54x DSP系列定点芯片内部具有的一种并行接口部件,主要用于与其他总线或CPU之间进行通信,其接口框图如图l所示。主机是HPI口的主控者,HPI口作为一个外设与主机连接,使主机的访问操作很方便。主机通过以下单元与HPI 口通信:专用地址和数据寄存器、HPI控制寄存器以及外部数据和接口控制信号。HPI有两种工作方式:共用寻址方式(SAM)和仅主机寻址方式(HOM)。在SAM方式下,丰机和C54x都能寻址HPI存储器;在HOM方式下,仅能让主机寻址HPI存储器,C54x则处于复位状态,或者处在所有内部和外部时钟都停止工作的IDLE2空闲状态(最低功耗状态)。

VC5402是TI公司推出的一款性价比极高的16位定点处理器。它是C54x系列中应用比较广泛的一种芯片,有着丰富的接口资源,是一种集数据处理和通信功能于一体的高速微处理器。VC5402 HPI口是一个增强的8位主机接口,它通过HPI控制寄存器HPIC、地址寄存器HPIA和数据锁存器HPID来实现与主机之间的通信。主机通过外部引脚HCNTLO和HCNTL1选中不同的寄存器,则当前发送8位数据就到该寄存器。控制寄存器HPIC既可以被主机直接访问,又可以被DSP片上CPU访问。在使用上,由于主机接口总是传输8位字节,而HPIC是一个16位寄存器,所以主机向HPIC写数据时,需要发送2个相同的8位数据。地址寄存器HPIA,只能被主机直接访问。主机将HPIA寄存器视为一个地址指针,借助于HPIA主机可以访问VC5402全部的片上存储器。另外HPIA具有自动增长的功能,在自动增寻址模式下,一次数据读会使HPIA在数据读操作后增加1,而一个数据写操作会使HPIA操作前预先增加l。这样如果使能了该功能,则只须设定一次HPIA即可实现连续数据块的写入和读出。数据寄存器HPLD,只能被主机访问。如果当前进行的是读操作,则HPID中存放的是要从HPI存储器中读出的数据;如果当前进行的是写操作,则存放的是将要写到HPI存储器的数据。 2 VC5402的HPI口与PCl2040的接口设计 2.1 PCI总线及其实现方法 PCI局部总线是32或64位数据总线,32位PCI总线在读写传送中支持132Mb/s的峰值传送速率,64位PCI传送支持264Mb/s峰值传送速率。对于64位66MHz的PCI总线,传送速率可达528Mb/s。PCI总线协议规范复杂而庞大,因此需要借助总线接口来实现。实现PCI总线协议一般有两种方法:一是用FPGA设计实现,但PCI协议比较复杂,因此难度较大;二是采用PCI 总线控制芯片,如AMCC公司的S5933和PLX公司的PCI9052等通用的PCI接口芯片。TI公司专门推出了针对PCI总线和DSP接口的芯片PCI2040,它不但实现了PCI总线控制的功能,而且提供了和DSP芯片的无缝接口,因而大大降低了系统设计的复杂度,缩短了开发时间。 2.2 P012040与DSP接口设计 PCI2040足TI公司设计的专门用来实现C5000/C6000系列DSP和PCI总线进行接口的专用芯片,可以通过8位或16位HPI接口与C54x/C6xDSP实现无缝连接。PCI2040通过HPI接口与VC5402连接。PCI2040的HPI口为8/16位数据传输接口(8位还是16位,依据所挂接的DSP的类型)。主机作为传输的主设备,从机DSP不能发起传输。主设备PCI2040可以读/写DSP内存,DSP HPl口可以访问DSP所有的片上资源,PCI2040和VC5402之问的通信主要靠DSP的HPIA、HPIC、HPID三个寄存器完成。VC5402的HPI与PCI2040口的连接如图2所示。

PCie驱动综述分析

PCie 驱动 Pcie设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。 Pce的配置空间: PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是由操作系统决定其映射的基址。 系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们的配置要求,并进行系统配置。所以,所有的PCI设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。 PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。 ? 一般来说,基于pcie总线的驱动,需要涉及到pci_driver pci_dev pci_device_id . pci_device_id : 用于标识pcie设备,通过上图的厂商Id 设备Id 功能号等唯一确定一个pcie 设备,内核通过这个结构体确认驱动与设备是否匹配。 pci_dev : 一般pcie 设备都具有热拔插功能,当内核检测到有pcie设备插入时,会与相应的Pci_driver : 当有相应的设备匹配会调用驱动的相关方法,驱动中通常要做的是读出Base Adrress Register1-6 的值,这是pcies设备6个内存空间的基地址,然后通过ioremap方法映射成虚拟地址,至于6个内存空间的具体含义需要依赖于设备。

PCI总线语音卡及WDM驱动程序设计

PCI总线语音卡及WDM驱动程序设计 CTI(Computer Telephone Integration)即计算机电话集成技术已经发展了30 多年。其中电话语音卡是CTI 中的典型应用之一,它作为电脑与公用电话网的 接口设备,应用领域已经渗透到社会各个部门。同时,在语音卡的开发中也不 断注入了新的技术,软件上有语音合成、语音识别等技术,而硬件上最重要的 就是DSP 技术和PCI 总线技术。研制了基于TMS320VC5410 DSP 的PCI 语音卡,并设计了相应的WDM 设备驱动程序,取得了良好的效果。 1 硬件设计 1.1 PCI 总线控制芯片PCI2040 PCI 总线是一种不依附于某个具体处理器的局部总线,它支持32 位或64 位 的总线宽度,频率通常是33MHz,目前最快的PCI2.0 总线工作频率是 66MHz。工作在33MHz、32 位时,理论上最大数据传输速率能达到 133MB/s。它支持猝发工作方式,提高了传输速度,支持即插即用,PCI 部件 和驱动程序可以在各种不同的平台上运行[1]。 实现PCI 总线协议一般有两种方法,一是用FPGA 设计实现,但PCI 协议比 较复杂,因此难度较大;二是采用PCI 总线控制芯片,如AMCC 公司的 S5933、PLX 公司的PCI9080 等通用的PCI 接口芯片。TI 公司专门推出了针对PCI 总线和DSP 接口的芯片PCI2040[2],它不但实现了PCI 总线控制的功能,而且提供了和DSP 芯片无缝的接口,因而大大简化了系统设计的复杂度并缩短 了开发时间。 PCI2040 内部功能框图如图1 所示。 PCI2040 是一个PCI-DSP 桥接器件,它提供了PCI 局部总线和TMS320C54X 8 位主机接口(HPI)与TMS320C6X 16 位主机接口的无缝连接。一片PCI2040 最

相关文档
最新文档