| Navigation:First_Community->Science&technology->Electronic | Goto:New Topic•Setting•Search | |
MegaEntry - Social networking and discussion site!
其实从开始我对pci卡是一窍不通的,硬件还好说,软件驱动程序更是一头雾水,由于我的pci卡是要在windows98操作系统下应用的,所以必须编写pci卡的驱动程序,支持windows98下pnp硬件的驱动程序一般可以编程vxd。如果想为了以后的2k平台兼容就最好编wdm,因为windows2k不支持vxd,而且以后的发展wdm肯定要代替vxd了。不过由于我找到的资料基本上都是介绍vxd的,感觉vxd的技术好像更成熟一点,编的人更多一点,所以偷了一下懒(惭愧),就没有去研究wdm,就选择了vxd。 我的pci卡其实很简单,仅仅在本地端接了一个遥测信号的处理系统。 先说说硬件吧,其实按照正常的pci卡开发过程,仔细阅读pci规范是很重要的,但是由于时间比较短,我也没有很大的耐性看那些破规范,也就稍稍了解了一下。现在市场上有许多的专用的pci规范接口芯片,这些芯片提供的pci接口完全符合规范,具体符合的规范版本可以参看具体的芯片所以即使开发者不是很了解规范的具体细则,也可成功的设计pci卡。也就是可以达到傻瓜及设计。在连线上只要将对应的引脚连在总线上就可以了,在连线时要注意pci规范中提到了信号用的反射波信号,所以驱动的信号只用了要求电压的一半,另一半靠反射来提升。所以对信号线的长度有要求:64位卡的32位信号具备的最大连线长度是1500mil,64位扩展信号的附加信号的连线长度最大为2000mil,pci clk的长度为2500mil /-100mil,如果不够长度可以多绕几圈。 还有一个要注意的是pci信号中prsnt1和prsnt2,开始我对这两个信号一直不是很清楚,清华bbs上的精华区说得也是含糊,后来师兄devilface告诉我的prsnt1和prsnt2两者必须有一个接gnd,否则系统肯定找不到卡,主板就是靠这两个信号来判断这个插槽上是否有卡,而其接法同pci卡使用的功率有关具体的含义如下(0 表示悬空,1表示接地):MegaEntry - Social networking and discussion site!
prsnt1 prsnt2 含义 0 0 no card 0 1 15w 1 0 25w 1 1 7.5w 另外pci卡上最好在从槽上引的电源上多加几个电容,所有电源都必须退藕一般规范推荐pci卡做4层板,但是我只做了2层,其实无所谓,只要2层布得开,没必要布4层,不过我布线的时候还是费了一点功夫,用specctra布了5,6次,为研究室节省开支嘛!(要是导师看见了该多感动呀!)MegaEntry - Social networking and discussion site!
pci规范规定了5v和3.3v两种电气规范,我们一般的机器上都是5v规范的插槽当然也不乏3.3v的。所以我做的是5v的卡,不要以为5v的插槽上就得不到3.3v,一样可以提供3.3v的。MegaEntry - Social networking and discussion site!
前面提到了pci接口芯片,现在pci接口芯片技术已经比较成熟了,介绍一点我知道的:AMCC:早期有5920,后来5933风靡国内,早期的PCI接口都是用这做的amcc最近又推出了5935,估计改了一些5933的bug,我看它的文档几乎与 5933一致.plx :pci接口芯片的老大了.9030,9052,9050:slave芯片9050,9052面向isa卡转pci的市场.9030为嵌入式专门设计.他们的文档不过100页左右.不难MegaEntry - Social networking and discussion site!
价钱便宜.不过170~190.9054,9080,90609060是最早的32位master的pci控制芯片.9080取代9060;9054可能更成熟一些.(?)iop480.好东西呀!带sdram接口和嵌入cpu,只是开发起来困难比较大. 自己直接去plx的网站看看.www.plxtech.com,我就知道这么点,大家可以补充。MegaEntry - Social networking and discussion site!
我用的是9052,还是那句话,用的人多,技术成熟,遇到问题了可以到bbs发问。我就喜欢捡现成的,不服你就说嘛!!!! 9052的机理比较简单,它内部提供了两种配置寄存器。一种叫做pci configuration registers ,这就是我们常说的pci配置空间另外一个叫 local configuration registers,它提供了配置本地端的一些信息。这里提到了本地端,说一说。其实9052就相当于一个桥,连接pci卡的本地端的芯片到pci总线上,将pci指令例如读写某个寄存器、内存、io翻译到本地端。9052本地端提供了地址线26根(27:2)和数据线32根,还有LBE4根,可以翻译成不同的地址线,太麻烦了我就不详细说了,反正我用的LOCAL端是8位数据,在这种模式下LBE1和LBE0提供地址线[1:0]。PCI配置寄存器提供了6个基地址寄存器,这些基地址都是在系统中的物理地址其中BASE1 和BASE2 都是用来访问LOCAL 配置寄存器的基地址,BASE1是映射到内存的基地址,BASE2是映射到IO的基地址。所以可以通过内存和IO来访问LOCAL 配置寄存器。CopyRight owned by the original author.--(www.MegaEntry.com)
MegaEntry - Social networking and discussion site!
再说软件驱动,我说过我编的是vxd,用vtools编的,可以用vc 直接编译成vxd文件,至于为什么必须用vxd驱动我想就不用说了。我的vxd的主要任务就是在系统中找到我的pci卡,并读出本地芯片所映射的内存物理地址,在windows系统中,用户程序不能直接访问物理地址,只能使用线性地址,所以vxd还有做的一件事就是将物理地址转换成线性地址供win app使用。 vxd查找pci卡就是靠搜索vendorID和deviceID,它是通过依次搜索总线号和设备号(具体什么意思我也说不清,反正知道就行了),看是否有符合指定的vendorID和deviceID,如果符合则认为找到了pci卡的配置空间,因为配置空间的第一个双字就是vendorID和deviceID.然后向下面的地址依次读就可以读出pci卡的配置空间其他信息,包括space0映射的内存基地址。读出此地址来再进行物理地址到线性地址的转换,就可以完全供win app使用了(可以通过指针访问),来读取9052 local上挂的芯片了。具体的查找方式主要通过vxd程序中首先向io地址0xcf8写入最高位为1的双字0x80000000,这个数的第16到23位代表了总线号,第11到