pci9054-可用
PCI9054驱动程序开发 O八一科技
PCI9054驱动程序开发
白强 曾明强 向琛 巩玉林
(零八一总厂电信 室 广元 6280l7)
摘 要:本文介绍了在WIN2000gg境下。通过wDM设备驱动程序开发工具
DDK和DriverStudio开发 工具包.用VC++编程语言对 ~k:PCI9054卡进行驱动程
序开发的一种方法。
关键词:DDK PC19054 DriverStudio WDM驱动程序开发
1 引言
随着电子技术的迅猛发展。我们可以方便地利用芯片设计自己需要的硬件设备。与此...
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;j
Insertnem (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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。