为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

pci9054-可用

2013-01-11 8页 pdf 315KB 70阅读

用户头像

is_390641

暂无简介

举报
pci9054-可用 PCI9054驱动程序开发 O八一科技 PCI9054驱动程序开发 白强 曾明强 向琛 巩玉林 (零八一总厂电信 室 广元 6280l7) 摘 要:本文介绍了在WIN2000gg境下。通过wDM设备驱动程序开发工具 DDK和DriverStudio开发 工具包.用VC++编程语言对 ~k:PCI9054卡进行驱动程 序开发的一种方法。 关键词:DDK PC19054 DriverStudio WDM驱动程序开发 1 引言 随着电子技术的迅猛发展。我们可以方便地利用芯片设计自己需要的硬件设备。与此...
pci9054-可用
PCI9054驱动程序开发 O八一科技 PCI9054驱动程序开发 白强 曾明强 向琛 巩玉林 (零八一总厂电信 室 广元 6280l7) 摘 要:本文介绍了在WIN2000gg境下。通过wDM设备驱动程序开发工具 DDK和DriverStudio开发 工具包.用VC++编程语言对 ~k:PCI9054卡进行驱动程 序开发的一种方法。 关键词:DDK PC19054 DriverStudio WDM驱动程序开发 1 引言 随着电子技术的迅猛发展。我们可以方便地利用芯片自己需要的硬件设备。与此 同时。我们面临着为自己设计的硬件设备开发相应驱动程序的问题。本文介绍了一种在 WIN2000环境下.通过驱动程序开发工具 DDK、DriverStudio,对一块 PCI9054卡进行驱 动程序开发的方法。通过该方法,达到识别、读写该 PCI9054卡的效果。 2 WDM及其开发工具简介 WDM (Windows Driver ModeO是微软公司全新的驱动程序模式。支持即插即用 、电 源管理和 WMI技术 。其运行平台是 Windows98/2000/XP操作系统,但是 Windows98对 WDM的支持不是很好。 开发 WDM常用工具有 DDK、DriverStudio。对于 DDK,微软公司提供了 Windows98 DDK、Windows2000 DDK和 WindowsXP DDK三个版本 ,分别对应 三种相应 的操作系统 , 同时需要用相应的 DDK来生成某一操作系统下的WDM驱动程序。 Driverstudio是 NuMegaLab公司开发的一整套开发、调试和检测 Windows平台下设备 驱动程序的工具软件包。它把 DDK (DeviceDevelopmentKit)封装成完整的 C++函数库 , 根据已经通过向导生成框架代码,并且提供了一套完整的调试和性能测试工具 SoftlCE、 DriverMonitor等。本文例子采用 的是 DriverStudi02.7。其包含 了 VtoolsD、DriverWorks、 DriverNetworks、 SofilCE、DriverMonitor、 EZDriverlnstaller、 SetDDKGo。 这 些 工 具 中 . VtoolsD是一个用来开发针对 Win9X操作系统下设备驱动程序 (VxD)的工具。DriverNet. works是针对Windows网络驱动开发人员的一个模块。S0ftICE是一个功能极其强大的内核 模式调试器 。DriverMonitor不仅可以显示 WDM 和 VxD在操作系统核心层次输出的调试语 维普资讯 http://www.cqvip.com O八一科技 PC19054-~动程序开发 29 句.还可以装载和卸载VxD驱动和NT4系统的驱动程序。EZDriverlnstaller是一个无需经 过设备管理器或 “添加新硬件”功能就能为 Windows2ooO/)(P动态加载和卸载 WDM驱动 程序的小实用程序。SetDDKGo用来设置设备驱动程序创建的环境。 3 PCI控制器 PCI9O54简介 PCI9054是一个 32位 33MHz总线主控 I/0加速器。它是当今最先进的通用总线主控 设备.可获得高达 132兆字节/秒的突发传输速度。PCI9054采用 PLX在业界领先的数据 流水线框架 (Data PipeArchitecture)。包含 DMA引擎、可编程 PCI起始器和目标数据传输 模式以及PCI信息传输功能。 PCI9054的主要特性如下 : a.符合 PCIv2.1、2.2,包含 PCI电源管理特性; b.支持 VPD (Vital Product Data)的PCI扩展; c.支持 PCI的双地址周期 (DAC),地址空间高达 4GB; d.提供 了两个 独立 的可编 程 DMA控 制器 。每个通 道均支持 块 和 Scatter/Ga出er的 DMA方式。DMA通道0支持请求 DMA方式; e.在 PCI启动模式,PCI9054可插入类型0和类型 1的配置周期; f.本地总线时钟由外部提供,该时钟可和PCI时钟异步;. g.PCI—Local Bus数据传送速率高达 132MB/S; h.支持本地总线 (Iocal Bus)直接接口 Motorola MPC850或 MPC86o系列 ,Intel系列 , IBM PPC401系列及其它类似总线设备 : · i.本地总线速率高达 50MHz,支持复用 、非复用的32位地址/数据;本地总线可为三 种模式 :M模式 、C模式和 J模式,可利用模式选择引脚加以选择 ; J.具有 8个 32位的 Mai lbox寄存器和 2个 32位 Doorbell寄存器; k.芯片为 3.3V核电压的低功耗 CMOS器件 ,兼容 PCI总线和 LOCAL总线上 的 5V的 I/0信号,芯片封装为 176针的 PQFP或 225针的PBGA。 其内部逻辑框图如下图所示 : PCI9054提供了一个 PCI总线和扩展总线的一种直接数据传输路径,降低了PCI总线 的复杂性 ,使得 PCI总线事 务 能够实时执行 ,并有利于在 PCI 总线 和本地 总线的外部设 备或 存储器设备之间获得高性能的 传输特性。 4 开发工具的安装 第一步:安装 Microsoft Vi. sual Studio C++6.0(注 意 Win— dows2000 DDK 暂 时 对 Visual Studio.NET不支持)。 维普资讯 http://www.cqvip.com 30 PC19054驱动程序开发 O八一科技 第二步:安装 Windows2000 DDK,在安装时候,选择完全安装。 第三步 :安装 Driverstudio 2.7开发工具。 Driverstudio安装后的设置: 1)在 Windows2000系统中,从 “开始”标签中选中DDK Build Settings,使用SetDD— KGo工具定义 BASEDIR环境变量并启动 VC++6.0。 2)打开 DriverWorks所在 的 Source目录中的建立库工程 VdwLibs。 3)选择 BuildlBatch Build(编译l批构件),打开下面的窗口,从中选则需要编译的配 置。如图所示 : 4)点击 Build编译所选择的库文件。 5 生成驱动程序 通过 DriverStudio生成驱动程序的步骤: 第一步:启动 vC++。在工具栏选择 “Diver Wizard”,写入工程名称 SAMPLE,选择 工程文件 目录。 第二步:选择驱动类型,本例选择 WDM Driver。 第三步:选择总线类型,本例选择PCI总线,并在 VendorlD和 DeviceID中分别输入 厂商号和设备号。还需要填入PCISubsystemID和PCIRevisionlD。 第四步:写入驱动类名称,驱动类文件名,本例为 SAMPLE。 第五步:选择需要处理的消息句柄,本例选择Read、Write、Device control。 第六步:选择 IRP队列排队方法。本例选 SystemManaged,则所有的IRP排队都由系 统 (即I/0管理器)完成。 第七步:是最关键的一步。首先在 Resource中添加资源,在 nallle中输入变量名,在 PICBaseAddress中输入 0—5的序列号。0—5和BARO—BAR5一一对应。在设置中断对话框 中。在 name栏写入中断服务程序名称,选中创建中断服务程序 ISR (CreateISR),不选创 建延迟程序调用 DPC(CreateDPC),选中MakelSR/DPCclassfunctions,使 ISR/DPC成为设 维普资讯 http://www.cqvip.com O八一科技 PCI9054驱动程序开发 3l 备类的成员函数。 其次选中Buffer以选取读写方式,用于描述与 I/O操作相关的数据缓冲区,本设计采 用 DirectI/O方式。 第八步:需要加入与应用程序或者其他驱动程序通信的 I/O控制代码。 添加完I/O控制代码后,一直选择 “Next”,直到 “Finish”,驱动程序框架完成。 此时已经具备了一个驱动程序以及做测试用的应用程序的基本框架。已经可以识别 PCI9054卡。我们可以在 VC集成环境下区修改有关程序,增加相关的具体操作代码,然 后就可以编译和调试了。 6 应用程序和驱动程序之间信息交换 向测试程序中修改、增加代码,完成驱动程序和应用程序之间的通信,要增加的内容 为:使用 IO控制代码方式写并且读。 . 主要函数的代码如下: NTSTATUS SampleDevice::SAMPLE _ IOCnJReadWrite—Handler( r1)I) { N IIJS status=STATLJS_SUCCESS; t《 “Entering SampleDevice::SAMPLE _ IOCTLI_ReadWrite _ Handler,”《 I《 EOL; char buff[51 2】,bum [51 2]; ULONG fwLength=0; strcpy(buff,(PCHAR)I.IoctlBuffer());//拷贝应用程序来的信息 t《 “InputPut Data is、” “atZbuffat:”\“《=IcOL: strcpy(buffl, “this is feedback from driver!Application sive me this string\”); strcat(buffl,buff); strcat(buffl, “、” “);//以上是组织反馈的信息 fwLength=strlen(bum)+l; if(I.IoctlOutputBufferSize()>=fwLength) f strcpy((PCHAR)I.IocflBuffer(),bum);//拷贝反馈信息 I.Information()=fwLength; ∥设置反馈信息字节数 ) elso { I.Information 0:O: t《 “buff size too small”《,EOL: ) retum status; l void Test_SAMPLE _ IOCTL _ ReadWrite(void) 维普资讯 http://www.cqvip.com 32 PCI9054驱动程序开发 O八一科技 { bufOutput is written by the device to return data to this application CHAR bufinput[IOCTL_INBUF_SIZE】; //Input to device CHAR bufOutput[IOCTL_OUTBUF_SIZE];ffOutput from device ULONGnOutput: ff Count written to bufOutput //Call device IO Control interface(SAMPLE_IOCTL_ReadWrite)in driver pfinff(“Issuing Ioctl to device-”); strcpy(buflnput. “ is is a sample”); if(!Device10Control(hDevice,SAMPLE_IOCTL_ReadWrite,buflnput, strlen(buflnput),bufOutput,IOCTL OUTBUF SIZE,&nOutput,,NULL)) { prinff ("ERROR:DeviceloControl retums%0x.”,GetLastError()); Exit(1); J else prinff (“Feedback is\”%s\“(%d)”,bufOutput,nOutput); J 运行后的效果如下 : 7 对 PCI9054卡进行读写操作 用 VC++建立一个基于对话框的工程 (略去),对 PCI9054卡进行读写操作,主要代 码如下 : ∥向PCI9054卡写入数据 void CExDlg::OnWrite() { ULONGnOutput; USHORT offset=0; USHORT num~0; buflnput【0】---offset; //Count written to bufOutput ∥写入的偏移地址 ∥写入的初始数据,以此来产生一个数组 ∥将用户指定的写入的偏移地址赋值给 buflnFut数 维普资讯 http://www.cqvip.com O八一科技 PCl9054驱动程序开发 33 组的第一个元素 buflnput【1】=IOCTL_INBUF_SIZE; //把要写入的数据个数赋值给buflnput 数组的第二个元素 for(ULONG j=O;jInsertnem (LVIF_TEXT I LVIF_STATE,i,strText, (i%2)=O?LVIS_SELECTED:0,LVIS_SELECTED,0,O); 维普资讯 http://www.cqvip.com 34 PCI9054驱动程序开发 O八一科技 //Initialize the text of the subitems. f0r(int j=1;j<3;j++) { strText.Format(TEXT (“%d”),buflnput【i+2】); pmyListCtrl->SetItemText(i,j,strText); 、 】 】 】∥调用DeviceloControl()函数 结束 】 ∥从PCI9054卡读取写入的数据 void CExDlg::OnRead() { ULONG nOutput; ∥实际读取的数据字节数 USHORT buflnput【2]; USHORT offset=O; //定义的变量。用于存放要读取的偏移地址 ∥把获取的读取偏移地址赋值给buflnput第一个元素 buflnput【0]=offset; ∥把要读取的数据个数赋值给buflnput第二个元素 buflnput【1】=IOCTL_UTBUF_SIZE; ∥显示生成的数组 CString showinfo; showinfo.Format(“要求读出%d个数据 \I1读取的偏移地址为 :Ox%x”, buflnput【1】,buflnput【0】); AfxMessageBox(showinfo); ∥调用 DeviceloControl()函数 if(!DeviceloControl(m—hDeviee, PCI905A 一 0C1]L 一 802 一 ReadBase2, buflnput, 2*sizeof(USHORT)。//字节数,为数组buflnput的大小 bufOutput, IOCTL _ OUTBUF _ SIZE*sizeof(USHORT),//字节数 &nOutput, NULL) ) { MessageBox(“无法进入驱动程序进行读操作”,“错误”,MB_OKIMB—ICONHAND); 】 维普资讯 http://www.cqvip.com O八一科技 PCI9054驱动程序开发 35 else { m _ listRead.DeleteAllhems(); CListCtrl pmyListCtrl= (CListCtrl )GetDlgltem (IDC—ListRead); CString strText; ∥显示读出的数据 for(ULONG i_O;iInserthem (LVIF_TEXTILVIFSTATE。i,strText, (i%2)=07 LVIS_SELECTE D:0,LVIS_SELECTED,0,O); for(intj=1.j<3;j++) f strText.Format(TE XT(“%d”),bufOutput【i】); pmyListCtrl->SethemText(i,J,strText); ) ) )∥调用DeviceloControl0函数结束 ) 8 结束语 通过 PCI9054芯片开发驱动程序的方式多种多样,本文利用该芯片,详细介绍了使 用驱动程序开发工具 DDK、DriverStudio对一块 PCI9054卡进行驱动程序开发的过程.以 及对该PCI9054卡进行读写数据操作的设计。该方法对准备从事驱动开发的人员有一定的 参考价值。 参考文献 1.(Windows98/2000驱动程序编写开发方法》.杨全胜.电子工业出版社 2.{Windows2000/XP WDM设备驱动程序开发》武安河、邰铭、于洪涛著.电子工业 出版社 作者简介 自强,助理工程师,081总厂电信室 曾明强,工程师,081总厂电信室 向琛。助理工程师,08 1总厂电信室 巩玉林,工程师,081总厂电信室 维普资讯 http://www.cqvip.com
/
本文档为【pci9054-可用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索