PCI总线数据输出板驱动程序的开发(图)

2008-07-16 18:04:23来源: 今日电子

  PCI(Perip heral Component Interconnect )是一种先进的高性能32/64位局部总线,支持线性突发传输,数据最大传输率可达132MB/s。同时,PCI总线存取延误小,采用总线主控和同步操作,不受处理器限制,具有自动配置功能,非常适合于高速外设。所以,它正迅速取代原先的ISA总线成为微型计算机系统的主流总线。

  随着工业控制pci设备的增多,需要开发大量专用WDM驱动程序。鉴于直接用ddk开发驱动程序难度大,周期长,本文介绍了用DriverStudio套件开发WDM驱动程序的方法以及基于9052总线控制器的D/A数据输出板卡的硬件结构。

  

  

  图1 D/A数据输出板卡硬件结构

  D/A数据输出板卡硬件结构如图1所示。硬件电路由PCI总线控制器9052,数据锁存器LS373,D/A转换芯片,EEPROM组成。板卡上电时,读取EEPROM内容初始化9052配置空间,据此为板卡分配合适的内存空间和I/O空间,对空间进行读写操作。首先,上位机通过WriteFile()调用设备驱动程序,发送两个12位数字量,驱动程序相应函数将两个数字量分别写入两路锁存器,送入D/A转换芯片,最后输出模拟量。

  9052空间配置

  PCI9052芯片的配置寄存器分为PCI配置寄存器和局部配置寄存器,二者都可以由PCI总线和串行EEPROM访问。在PCI配置寄存器中的设备ID、制造商ID、版本号、首区类代码、类别代码、指令寄存器和状态寄存器等寄存器在所有的PCI设备中都必须实现,具体设置可参考相关资料。PCI配置寄存器提供有6个基地址寄存器(BASE0~BASE5)这些基地址都是系统中的物理地址,其中BASE0和BASE1是用来访问局部配置寄存器的基地址,BASE0是映射到内存的基地址,BASE1是映射到I/O的基地址,可用于通过内存和I/O来访问局部配置寄存器。这两个基地址可固定用于PCI9052芯片的寄存器操作。通过BASE2~BASE5四个空间最多可以访问局部端所接的4个芯片,实现4个局部地址空间(局部空间0~3)的PCI总线访问。

  本设计选取LAS0(Local Address Space 0)来访问局部端的锁存器,该寻址空间大小为4Kb,与其有关的寄存器有四个:LAS0范围寄存器、LAS0局部基址寄存器、LAS0局部总线区域描述符和片选0基址寄存器。LAS0范围寄存器规定了地址空间的大小。

  由于需要4Kb的地址空间,所以LAS0范围寄存器的值为0XFFFFF000;基地址必须是地址空间的整数倍,末尾为局部空间使能为,所以局部基址寄存器设为0X00000001;LAS0局部总线区域描述符设为0X00000102;片选0基址寄存器设为0X00000081。

  驱动程序框架的建立

  1 开发环境的选择

  驱动程序开发选用NuMega公司的DriverStudio,它包含VtoolsD、SoftICE和DriverWorks等开发工具,DriverWorks用于开发KMD和WDM驱动程序,它适用于Windows 98/Me/NT/2000/XP操作系统。DriverWorks,需要相应DDK的支持,把DDK用类的形式进行封装,使用起来非常方便。

  开发环境的建立

  首先要安装软件。必须按照下面的顺序安装:

  安装Microsoft Visual Studio C++ 6.0。在安装过程中,必须选中“注册环境变量”选项。

  安装操作系统对应的DDK(2000系统安装2000DDK,XP系统安装XPDDK)。

  安装DriveStudio3.1(若为XP系统,必须安装3.2以上的版本)。

  接下来,编译库文件。用VC打开库文件Program FilesCompuware DriverStudioDriverWorkssource Vdw Libs.dsw,选择Build|Batch Build(编译|批构件),从中选择需要编译的配置(32位机选“select all i386”)。若编译无错误,就可以进行驱动程序的开发了。

  3 生成驱动程序框架

  从开始菜单启动Driver Wizards,选择DriverWorks Project,开始创建一个驱动程序框架。

  ● 填写驱动程序名称,单击next;

  ● 选择驱动程序类型,这里选择WDM Driver驱动程序,单击next;

  ● 选择WDM Function Driver,单击next;

  ● 选择总线类型,这里选择pci总线。填写pci Vendor ID和pci Device ID,一般可以从硬件的使用说明书中看到,没有的话可以用pciview软件得到。后两项pci Subsystem ID和pci Revision ID可以不填。单击next;

  ● 选择设备类的名称和文件类名称,默认即可,单击next;

  ● 选择需要的功能函数,本设计需要I/O读写,必须添加I/O通信函数。添加读函数PCI_DA_IOCTL_Read()和写函数PCI_DA_IOCTL_Write(),单击next;

  ● 选择队列方式,数据量大时选择排队,点击Next;

  ● 添加资源。资源分为i/o资源和内存资源。添加资源时必须对应硬件相应得基地址寄存器。选择Direct存取方式,单击next;

  ● 为i/o通信方式添加控制代码,若不需要i/o通信,可不添加,单击next;单击Finish,完成驱动程序框架,并自动启动vc。

  4 添加代码完成应用程序和驱动程序的通信

  在DriverWorks中,应用程序使用CDeviceInterfaceClass的实例去获得一个或更多的DeviceInterface实例。CDeviceInterface类抽象了一个单一设备接口,它的成员函数DevicePath( )返回一个路径名指针,它被发送到CreateFile去打开设备,即获取设备句柄。

  打开设备以后,应用程序通过函数ReadFile(),WriteFile()和DeviceIoControl()函数调用访问设备。其中,DeviceIoControl()函数可以用不同的IOCTL命令实现不同的功能。要完成应用程序和驱动程序的通信,还必须添加硬件板卡访问命令。在驱动程序中,主要用inb(),outb()函数进行硬件访问,具体参数可参照vc的msdn。

  在本系统中,主要用DeviceIoControl()来调用驱动程序。相应的通信函数和添加的读写代码如下:

  NTSTATUS PCI_DADevice::PCI_DA_IOCTL_Read_Handler(KIrp I)

  {

  NTSTATUS status= STATUS_SUCCESS;

  //得到IOCTL缓冲区指针

  PUCHAR pOutBuffer=(PUCHAR) I.IoctlBuffer() ;

  //输出缓冲区大小

  ULONG ioOutSize=I.IoctlOutputBufferSize();

  //读取偏移地址为n-1的数据,放入输出缓冲区,传递给应用程序

  pOutBuffer[0]= m_MemoryRange1.inb(ioOutSize-1);

  //读取一个字节数据

  I.Information()=1;

  return status;

  }

  NTSTATUS PCI_DADevice::PCI_DA_IOCTL_Write_Handler(KIrp I)

  {

  NTSTATUS status=STATUS_SUCCESS;

  //得到IOCTL缓冲区指针

  PUCHAR pInBuffer=(PUCHAR) I.IoctlBuffer ();

  //输入缓冲区大小

  ULONG ioInSize=I.IoctlInputBufferSize();

  //将数据写入偏移地址为n-1的存储单元

  m_MemoryRange1.outb

  (ioInSize-1,pInBuffer[0]);

  //写入大小为一个字节

  I.Information()=1;

  return status;

  }

  编译驱动程序,生成一个.inf文件和一个.sys文件,这就是需要安装的驱动程序文件。编译无错误,就可以安装调试驱动程序了。

  5 安装调试驱动程序

  插入自己设计的PCI板卡,重新启动计算机,出现安装新硬件向导。安装已经生成的.inf文件和.sys文件。安装后,查看pci设备的资源,若与自己硬件设置的资源空间相同,则设备驱动安装成功。

  用Windows自带的命令提示符,打开驱动程序框架自带的test应用程序,测试通过驱动程序读写数据。若读取的和写入的数据一致,则驱动程序开发成功。

  结束语

  本文以一种基于PCI总线的D/A数据输出板卡为例,介绍了在Windows 2000/XP下用DriverStudio开发PCI总线WDM驱动程序的基本方法,详细叙述了应用程序和驱动程序之间的通信机制和硬件访问方法;针对板卡的硬件结构和功能用途,介绍了PCI9052总线控制器PCI配置寄存器和局部配置寄存器地址配置的具体方法;给出了利用安装新硬件向导安装驱动程序的方法,实现了上位机和数据输出板卡的通信。

 

关键字:总线控制器  数据锁存器  PCI总线  pci设备  配置寄存器  单击  WDM驱动程序

编辑:孙树宾 引用地址:http://www.eeworld.com.cn/afdz/2008/0716/article_864.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
总线控制器
数据锁存器
PCI总线
pci设备
配置寄存器
单击
WDM驱动程序

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 视频监控 智能卡 防盗报警 智能管理 处理器 传感器 其他技术 综合资讯 安防论坛

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved