|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
[转帖]PCI卡设计心得(二)
(转载,作者不详) (续上贴)
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 配置寄存器。
BASE2~5四个空间提供了访问本地端所接的4个芯片(当然可以少于4个),它们将本地端的芯片通过本地端地址(在LOCAL配置寄存器中设)翻译成PCI的地址,也就是将本地的芯片映射到系统的内存或io口。是不是很简单呀?这样使用你的程序操作这一段内存(或io)实际上就是对本地的芯片操作了。我使用的是内存映射,本地端的芯片地址例如是0x0cc000,将此地址放入local配置寄存器的相应位置(由于有四个空间,可以选择任意一个空间来对应此芯片),我用的是space0,还要配置此空间的大小,这样在pci总线端系统会根据这个大小分配相应的内存空间(或io)供9052使用来映射local 上接的芯片。而系统分配的内存空间的信息会写入pci配置寄存器中,只要读出来就可以了。9052工作时还需要一个配置芯片eeprom,plx公司推荐了93cs46,这个eeprom比较好买,在中发一层就有。eeprom会在pci卡上电的时候配置9052,主要配置了pci卡的vendorID和deviceID,这是系统用来标识pci卡的,很重要,你的程序就靠这个标识来找到pci卡。还配置了local端的4个space的local基地址和大小,以及每个space的其它一些参数(这里不说了)。eeprom的内容很重要的,如果没写对很容易就出问题我开始老调不出来就是因为eeprom中的配置写错了,郁闷了好长一段时间哟!其实硬件本身很容易连,只要对应的脚相连就可以了,注意本地芯片如果不申请总线控制的话,9052的lhold信号一定要接gnd,还有如果本地芯片没有提供irdy#信号,9052的对应脚也必须接地否则你一读此芯片,系统就会死机,永远等待那个irdy#信号有效才读取数据。
再说软件驱动,我说过我编的是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到15位代表了设备号,第8到14位代表了功能号,然后就可以读取io地址0xcfc的双字,如果有效的话说明此pci配置空间地址上挂了一个pci卡,从0xcfc读出的数则为此pci卡配置空间的第一个双字,即vendorID和deviceID,我是将vendorID和deviceID一起使用的,即判断读出的双字是否等于我在9052配置eeprom中标定的数,如果是则说明找到了我的pci卡,如果不是则继续找。向0xcf8写入的数+0x800,在继续
读0xcfc,依次下去,直到找到。如果当此数加到0x80ffff00时还没找到(即总线号搜索完毕),则表明没法找到,那就要找找自己的原因了,可能是板子的配置错了。
找到了pci卡的配置空间后,读出space0的基地址,然后进行物理地址到线性地址的转换,我又偷了懒,vtools提供的example中有实现此功能的vxd源代码,直接用vc++编译成vxd就可以共win app使用了。所以实际上我的app程序使用了两个vxd,一个用来专门找卡,一个用来地址转换。
至于app如何调用vxd,可以参看vc的参考书,一般都有介绍。
下面将一下如何安装vxd到系统中,我编的vxd都是动态加载的(pnp一般都用动态加载vxd)要编写一个inf文件以便系统将vxd安装进去。我用的是windriver生成的inf文件模板,然后再按照需要进行修改,自然加上我的大名了。编完了inf文件后,就可以安装了。一般情况如果你插上pci卡windows启动后就会发现新硬件,你只要按照以前安装硬件的步骤进行就可以了只是在选择安装文件时选择自己编写的inf文件就可以了。我觉得一般的安装过程就是将vxd文件拷入系统的文件夹,即windows目录下,以便当app加载vxd时,系统可以找到vxd程序,进行动态加载。
未完,见下贴 PCI卡设计心得(三)
|
|