pci卡设计心得

最新更新时间:2012-04-18来源: 互联网关键字:pci卡 手机看文章 扫描二维码
随时随地手机看文章
其实从开始我对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表示接地):
    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次,为研究室节省开支嘛!(要是导师看见了该多感动呀!)
    pci规范规定了5v和3.3v两种电气规范,我们一般的机器上都是5v规范的插槽当然也不乏3.3v的。所以我做的是5v的卡,不要以为5v的插槽上就得不到3.3v,一样可以提供3.3v的。
    
    前面提到了pci接口芯片,现在pci接口芯片技术已经比较成熟了,介绍一点我知道的:
AMCC:早期有5920,后来5933风靡国内,早期的PCI接口都是用这做的amcc最近又推出了5935,估计改了一些5933的bug,我看它的文档几乎与 5933一致. 
plx :pci接口芯片的老大了. 
9030,9052,9050:slave芯片 
9050,9052面向isa卡转pci的市场. 
9030为嵌入式专门设计.他们的文档不过100页左右.不难 
价钱便宜.不过170~190. 
9054,9080,9060 
9060是最早的32位master的pci控制芯片. 
9080取代9060;9054可能更成熟一些.(?) 
iop480. 
好东西呀!带sdram接口和嵌入cpu,只是开发起来困难比较大. 自己直接去plx的网站看看.www.plxtech.com,我就知道这么点,大家可以补充。

我用的是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 配置寄存器。
   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程序,进行动态加载。
下面是我的inf文件

[Version]
Signature=$CHICAGO$    ;必须这么写
Class=PLX              ;可以自己改
Provider=%SHENLI%      ;制作者

[Manufacturer]
%Manufacture%=SECTION0

[SECTION0]
%my_card%=my.install,PCI\VEN_10b5&DEV_9050   ;my.install表示了安装过程所要做的事,

[my.install]
CopyFiles=CopyFiles_PLX10b5                   ;主要做拷贝文件和注册表添加
AddReg=AddReg_PLX10b5


[CopyFiles_PLX10b5]
Vxd8_25.vxd

[AddReg_PLX10b5]
HKR,,DevLoader,0,Vxd8_25.vxd


[Strings]
Manufacture="BUAA202"                         ;这些信息会在安装时显示
my_card="PLX9052"

    
下面提供了vxd中查询pci卡的代码,这个代码是参考清华bbs驱动版精华区huyuguang大虾的大作,他提供了更详细的代码
有兴趣可以参考。

BOOL findpci(DWORD DeviceVendor,PCIINF *pciinf)//我的卡的DeviceVendor=0x905210b5
{
DWORD io_cf8;
DWORD io_cfc;
int i;
DWORD buf[16];

io_cf8=0x80000000;
for(;;)
{
  DWORD_OUT(0xcf8,io_cf8);//向0xcf8输出双字 io_cf8
  io_cfc=DWORD_IN(0xcfc); //从0xcfc读入双字
  if(io_cfc==DeviceVendor)//find  pci9052
  {
   for(i=0;i<16;i++)
   {
    DWORD_OUT(0xcf8,io_cf8+4*i);
    buf[i]=DWORD_IN(0xcfc);
   }
   pciinf->VendorID=(WORD)(buf[0]&0xffff);
   pciinf->DeviceID=(WORD)((buf[0]&0xffff0000)/0x10000);
   pciinf->Command=(WORD)(buf[1]&0xffff);
   pciinf->Status=(WORD)((buf[1]&0xffff0000)/0x10000);
   pciinf->RevisionID=(UCHAR)(buf[2]&0xff);
   pciinf->CacheLineSize=(UCHAR)(buf[3]&0xff);
   pciinf->LatencyTimer=(UCHAR)((buf[3]&0xff00)/0x100);
   pciinf->HeaderType=(UCHAR)((buf[3]&0xff0000)/0x10000);
   pciinf->BIST=(UCHAR)((buf[3]&0xff000000)/0x1000000);
   pciinf->BaseAddresses[0]=buf[4];
   pciinf->BaseAddresses[1]=buf[5];
   pciinf->BaseAddresses[2]=buf[6];
   pciinf->BaseAddresses[3]=buf[7];
   pciinf->BaseAddresses[4]=buf[8];
   pciinf->BaseAddresses[5]=buf[9];
   pciinf->SubsystemVendorID=(USHORT)(buf[11]&0xffff);
   pciinf->SubsystemID=(USHORT)((buf[12]&0xffff0000)/0x10000);
   pciinf->InterruptLine=(UCHAR)(buf[15]&0xff);
   pciinf->InterruptPin=(UCHAR)((buf[15]&0xff00)/0x100);
   pciinf->MinimumGrant=(UCHAR)((buf[15]&0xff0000)/0x10000);
   pciinf->MaximumLatency=(UCHAR)((buf[15]&0xff000000)/0x1000000);
   break;
  }
  else 
   io_cf8+=0x800; 
  if(io_cf8>=0x80ffff00)
   return 1;
}
return 0; 
}

    以上都是我这次制作卡的一些心得,还有很多不清楚的地方,写出来只是想让感兴趣的pci门外汉了解一下,但愿能有所帮助。肯定有很多错误,希望各位大虾指正,但求不会误人子弟。pci大虾见笑了。
关键字:pci卡 编辑:神话 引用地址:pci卡设计心得

上一篇:Windows设备驱动程序编写时的主要问题及解决方案
下一篇:PCI设备WINDOWS驱动程序的开发

推荐阅读最新更新时间:2023-10-12 20:39

搭载Speedster7t FPGA器件的VectorPath加速PCI-SIG认证
支持PCIe Gen4 ×16的VectorPath®加速卡获得CEM插卡认证 加利福尼亚州圣克拉拉市,2022年9月12日—— 高性能现场可编程逻辑门阵列(FPGA)和嵌入式FPGA(eFPGA)半导体知识产权(IP)领域的领导性企业Achronix半导体公司今日宣布:其搭载Speedster®7t FPGA器件的VectorPath加速卡已通过PCI-SIG认证,并被添加到支持PCIe Gen4 x16的CEM插卡集成商列表中。 VectorPath S7t-VG6加速卡设计旨在为人工智能(AI)、机器学习(ML)、网络和数据中心应用开发高性能计算和加速功能,同时缩短上市时间。VectorPath加速卡现已上市,可实
[嵌入式]
搭载Speedster7t FPGA器件的VectorPath加速<font color='red'>卡</font>获<font color='red'>PCI</font>-SIG认证
基于PCI的视频编码的设计与实现
1 前言 随着通信网络技术的飞速发展,人们的观念也紧跟着时代的步伐,把自己融入了网络时代。例如查看信息,监控,交流等无不使用网络。虽说网络给我们带来了很大的信息流,但随着人们生活节奏的加快,对传输率的要求越来越高,特别是实时传输的时候。通过用MPEG4视音频编解码技术,卫星互联网播送技术解决了这方面的问题,使得数字视频广播图像分辨率达192×144×25FPS(PAL)/384×288×25FPS(PAL),图像和屏幕发送通过卫星信道,平均码流量小于384K;文字消息数据、外交互通过Web走公网,平均码流量小于56K,实现了点对点、多点即时播送和同步互动,深得广大用户的好评。为企业、政府机构、组织、和网络医院、网络学校提供一种高
[嵌入式]
基于CH365型接口和MCX314As型运动控制器的PCI总线运动控制设计
摘要:以CH365型PCI总线接口和MCX314As型运动控制器为核心硬件,自主研发了基于运动控制器的PCI总线运动控制卡。该控制卡能够实现4轴位置、速度和S曲线的加减速控制,具有直线、圆弧、位模式插补功能及自动原位搜寻功能,同时具有4路信号输入和8路通用输出。 关键词:运动控制卡;PCI总线;MCX314As;CH365 1 引言 随着现代科技的发展,数控技术的发展趋势是开放式数控。开放式数控系统具有即插即用、可移植性、可扩展性和可互操作性特点。PC—NC是目前比较实用的一种开放式数控系统模式,PC—NC可归纳为3种:PC板插入到NC装置中;软件NC;NC板插入到PC中。其中,第一种方案保留原有的数控系统不变,插入的PC
[应用]
基于PCI总线芯片CH365的数据密码设计
  引言   在信息化时代的今天,计算机技术的飞速发展,给人们的生产和生活带来了巨大便利,以前复杂的工作,现在只要单击鼠标即可完成,因此,计算机已经成为人们日常工作和生活的一部分,人们对计算机的依赖程度越来越高,没有计算机的生活简直难以想象。随着计算机在生产和生活中占剧比重的加大,信息安全问题也显得突出重要,失泄密案件时有发生。小到企业商业机密被窃取,给企业造成巨大的经济损失;大到国家安全和军事机密被窃取,给人民的生命财产安全带来严重威胁。在铁路军交管理系统中,对军列的调度是采用密码管理的,这些密码标识了重要的军事目标,同时也只有通过此密码才能访问调度软件,从而调度军列。如果这些密码失窃,重要的军事目标将暴露,同时对军列的调度将
[嵌入式]
基于PCI总线技术的NO.7信令采集研制
  由于目前NGN网络是一个以软交换为核心并由PSTN网络和VoIP网络融合在一起的复杂网络,多种接口、多种协议、多媒体并存,PSTN与VoIP设备的兼容性、VoIP网络内部不同设备提供商的设备兼容性、网络设计性能与实际部署性能的差异性、语音质量的差异性等挑战都严峻地摆在运营商面前。于是就要求NGN网络运营商能够对其网络性能进行测试和分析,NGN网络测试仪能够解决这样的问题。   本NO.7信令采集卡是基于PCI总线技术设计的,主要完成的功能为物理层的数据采集和HDLC链路控制。本卡根据协议的选择主要完成NO.7信令的采集,并把数据送到NGN网络测试仪的上层软件进行分析。   NO.7信令采集卡的总体设计方案及硬件实现
[嵌入式]
基于PCI总线的MPEG-1压缩软硬件设计及实现
  随着计算机技术、多媒体和数据通信技术的高速发展,人们生活水平的提高,对计算机视频的需求和应用越来越多,如视频监控、视频会议、计算机视觉等。计算机视频提供给人的信息很多,但是视频的数据量很大,不利于传输和存储,使其应用受到不少限制。为解决视频数据的存储和传输,唯一途径就是对视频数据进行压缩。   目前常见的视频压缩方法有MPEG-1、MPEG-2、MPEG-4、H.261、H.263等。考虑压缩技术的成熟度和该压缩卡的主要用途,本文采用MPEG-1作为压缩标准,研制了基于PCI总线的MPEG-I压缩卡。该卡适用于视频监控、视频会议等多种应用场合。该卡加上一台主机、摄像头和软件可构成一个完整的视频采集压缩系统。   1 系
[嵌入式]
凌华科技推出24位高精度PCI接口数据采集
凌华科技推出4通道24位高分辨率的数据采集卡PCI-9524,是现阶段在称重传感器(Load Cell)应用中具有最高精度测量的PCI接口数据采集卡,可满足高精度材料拉伸试验、压挤、挠曲测试等基于力量测量的应用。 凌华科技PCI-9524数据采集卡内置24位高分辨率的模拟数字转换器,并可提供2.5V或10V 两种激励电压(Excitation Voltage)的选择,整合自动归零(auto-zero)、远程感测以及数字滤波的技术,可达到200,000 counts以上的精确度及稳定度。 为满足基于称重传感器的材料测试机(MTS, Material Testing System)的复杂的精密测量及控制需求,凌
[测试测量]
4DSP推出的FM480是基于Virtex-4 FPGA的PCI夹层
4DSP的PMC扩展卡可加速信号处理算法 4DSP公司日前推出的FM480是一款基于Virtex-4 FPGA的PCI夹层卡(PMC)。FM480已通过几种现场测试,所开发的首个应用是一个基于IEEE-754标准浮点FFT内核的2维快速傅立叶变换。 FM480 PMC可选传导散热方式,配有大容量的SRAM和DRAM资源以及超高速DMA引擎,因而适于作为协处理器单元以满足信号处理算法的需求。该卡还提供了几个前面板I/O模块,可实现相机、前端面板数据端口以及ADC连接。 FM480目前已向几个主要用户提供了样件,已开发的项目包括在Virtex-4 FPGA中实现的实时JPEG2000压缩。有关该产品的价格目前尚未公布
[新品]
小广播
最新模拟电子文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved