基于PCI总线的数字卫星解调卡驱动程序开发

最新更新时间:2013-05-29来源: 与非网关键字:PCI  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
  引言

  PCI总线(即外围部件互连总线)是Intel公司提出的计算机接口总线。它的时钟频率为33MHz,有32位数据总线,可支持突发传输模式,数据传输峰值速率高达132 MB/s。此外,PCI总线还可扩展为64位数据总线,扩展后的数据传输峰值速率高达264 MB/s,并支持即插即用功能而且独立于处理器。由于PCI总线具有诸多优点,它已经成为PC机的标准总线。因此,PCI接口设备的驱动程序开发就显得尤为重要。

  数字卫星解调卡主要用于接收卫星发来的调制信号的数字解调。设计中的桥接芯片可采用PLX公司的PCI9054。本文主要介绍数字卫星解调卡的WDM驱动程序开发方法。

  1 PCI9054接口芯片

  PCI9054是PLX公司推出的PCI接口芯片。它支持本地总线2.2版规范,工作频率为0~33 MHz,可提供C、M、J三种本地工作模式,本地端到PCI总线的猝发传输速率高达132 MB/s。该芯片具有可编程的Serial EEPROM接口,可用于配置PCI9054的部分内部配置寄存器。其配置正确与否直接决定着设备能否正常工作。其中的DeviceID和Vendor ID分别对应设备号和销售商号,计算机主要靠这两个号码识别硬件。该器件内部有6种可编程的FIFO,可以进行数据的发送与接收,而其两种内部配置寄存器PCI Configuration Register和Local Configuration Register,可在本地端支持主模式、从模式租DMA传输方式。PCI9054的内部结构如图1所示。


  PCI9054支持两个独立的DMA通道,以用于完成本地端到PCI总线或者PCI总线到本地端的数据传输。每一个DMA通道包含一个DMA控制器和一个双向FIFO,两种通道都分别支持Block传输模式和Scatter/Gather传输模式。DMA通道0还支持Demand DMA数据传输模式。

  Block DMA要求PCI主机或Local主机能提供PCI和Local的起始地址、传输字节数和传输方向。主机首先设定DMA开始位并启动数据传输,一旦传输完成,PCI9054设定将DMACSR0[4]=1或者DMACSR1 [4]=1(分别对应通道0和通道1)来结束DMA。如果中断Enable位DMAMODE0[10]或者DMAMODE1[10]使能,那么,在传输结束时,PCI9054将向主机申请中断。在DMA传输中,PCI9054既是PCI总线的主控设备,又是Local总线的主控设备。另外,通过编程DMA传输模式还可以完成以下设置或功能:

  (1)将本地总线宽度设为8位、16位或32位;

  (2)设置本地总线为允许/禁止内部等待状态,若允许,则可等待0~15个本地等待状态;

  (3)设置本地总线为突发传输4个双字长度;

  (4)使本地地址采用固定模式或线性增长模式;

  (5)完成PCI内存写和无效操作(commandcode=Fh)或者普通PCI内存写操作(commandcode=7h);

  (6)使用/禁用BLAST#以暂停本地传输;

  (7)在Scatter/Gather DMA传输模式中,当DMA传输完成或终止计数器计数到0时,插入PCI中断(INTA)或者本地中断(LINT);

  (8)工作于DMA清除计数模式。

  2 WDM驱动程序开发工具

  PCI总线的传统开发工具是微软公司提供的DDK(Device Driver Kit),包括Windows98 DDK,Windows2000 DDK和Windows XP DDK。但是,使用其开发驱动程序比较复杂且开发周期长,它只适合发行类产品的驱动开发。
  
  为了简化驱动程序的开发,缩短开发周期,常用的方法是使用Numage公司提供的开发工具Driver Studio,这是一个开发工具包(包含VtoolsD,Driver Works和SoftICE等开发工具)。其中的Driver Works是Compuware公司开发的工具,它提供了一系列类。这些类包含了许多更为底层的操作并且为一般驱动操作提供了服务函数,从而为开发人员提供了一个访问系统核心的标准界面。由于其驱动程序开发采用面向对象的框架结构,因而开发过程比较简单易行。

  3 DMA模式WDM驱动程序开发

  本文介绍的数字卫星解调卡的硬件框图如图2所示。图中,当FPGA中的数据放进FIFO后,要经过PCI9054桥接芯片传输到PC机内存中,但由于应用程序不能直接操作硬件,所以在应用程序和硬件之间必须安装硬件驱动程序来完成应用程序对硬件的访问。可见,驱动程序对于整个设计至关重要,它关系到数据能否准确无误的送到指定的目的地。



  驱动程序完成的主要功能如下:

  (1)接收应用传送的符号率,配置符号率;

  (2)接收应用程序传送的控制字,配置AD9851用作外部FIFO数据传输的时钟;

  (3)设置数据传输为DMA方式,直到接收到应用程序发来的停止数据采集命令为止。驱动要保证数据传输顺利进行。

  本设计使用Driver Works来开发WDM驱动程序。

  3.1 基于Driver Works的WDM驱动程序框架

  这里所要生成的是PCI设备的驱动程序。采用DMA方式传输时,生成WDM驱动程序框架的主要步骤如下:

  (1)从VC++中启动Driver Works,设置驱动程序名称及存放的路径,设计时可取驱动名称为BPSKDRIVER;

  (2)选择工程类型为WDM DRIVER;

  (3)选择驱动类型为WDM Function Driver;

  (4)选择硬件总线类型为PCI,在这里要注意,PCI Vendor ID和PCI Device ID应根据硬件信息填写;

  (5)添加存储器空间和I/O空间所需的类对象,添加DMA资源,使用设备接口打开设备;

  (6)用控制代码完成应用程序和驱动的交互,即在应用程序中使用Device IO Control来完成应用程序向驱动传输数据。

  3.2 DMA传输控制

  (1)DMA传输类的概念及初始化

  按照上述步骤生成WDM驱动的框架后,其大部分例程函数(如Driver Entry、Add Device、Device Control、On Start Device)等已经由软件自动生成并能基本满足设计要求,下面重点介绍DMA传输控制函数。

  设计中,对DMA寄存器的访问可采用I/O方式,并可利用Driver Works提供的KIoRange类产生该类的一个实例,然后在设备启动例程中初始化该实例,即可实现对硬件的两个I/O地址空间的映射,其中一个I/O地址空间用于访问桥接芯片PCI9054的寄存器,另一个I/O地址空间用于访问本地端的设备,其初始化方法如下:

  其中,pResListTranslated、pResListRaw分别是IRQ中系统分配的翻译资源列表和原始资源列表。初始化完成后,就可以使用类的成员函数in,out对端口进行操作。例如:m_IoPortRange0.outd(0x30,0x40100),就可向IO端口0的偏移量为0x30的地址中写入0x40100。

  进行DMA传输需要用到三个DMA传输类,分别为KdmaAdapter、KCommonDmaBuffer和KdmaTransfer。

  KdmaAdapter是DMA适配器对象,可用于表示需要进行DMA传输的设备资源。此对象对于Master设备和Slave设备都是适用的。驱动中,此类函数可在On Start Device中由成员函数Initialize初始化。

  KconnonDmaBuffer是DMA通用缓冲区对象。驱动中,此类可在On Start Device中由成员函数Initialize初始化。通用缓冲区是外部设备和驱动程序之间的一段物理上连续的虚拟内存,这个内存是从系统中分配出来的,是非常珍贵的资源,任何时候都可以被他的设备和驱动程序存取。通用缓冲区包括缓冲区空间大小、虚拟地址、逻辑地址等信息。由于通用缓冲区是非常珍贵的资源,所以它的大小也受到限制。为此,驱动时应对每个DMA请求进行分段,并为每个段提供一个传输段描述符数组。而且,当设备不支持分散/集中时,这个数组中的描述符只能有一个。每个描述符包含一个物理地址和相应的字节数,其结构如下:

  其中的物理地址即逻辑地址,字节数则是相应的逻辑地址范围的长度。

  KdmaTransfer为DMA传输对象,用来管理内存和设备之间的数据传输,但此时的DMA适配器必须可用。适配器对象可用来通知传输数据的类型和使用的DMA通道等。驱动中,此类可在OnStart Device中由成员函数Initialize初始化。在DMA传输中,数据可直接传输到系统物理内存中。管理这些内存的方式有Common Buffer和Packet两种。第一种方式是在物理内存中预先开辟一段连续的内存空间,CPU和PCI都可以对其进行访问,且在一次DMA传输过程中,物理地址保持不变,该方式适合传输大量数据和连续的DMA传输;而在Packet方式中,由于其内存物理地址不确定,因此适合间断性的DMA传输。

  (2)回调函数

  由于DMA传输采用分段传输,所以,每当准备传输一个新段时,KDmaTransfer的对象将通知驱动程序调用回调例程。回调函数的原型由typedef DMAREADY_CALLBACK指定,使用宏DEVMEMBER_DMAREADY可声明回调函数基类的成员函数。通过判断成员函数Bytes Remaining可判断传输是否完成。若返回值为0,则调用成员函数Terminate以完成相应的IRP,否则,回调函数继续传输。

  (3)中断服务

  本驱动需要处理两种中断,第一种是本地中断,它是当FIFO输出半满信号时由FPGA通过LINT#信号发给PCI9054的中断信号;第二种中断是DMA传输结束时由DMA中断控制器产生的。这两种中断可以通过对DMA的中断控制寄存器的特定位处理来区分。判断是否是本地中断时,可以通过判断DMA中断控制寄存器的第15位是否为1来确定,如果INTCSR[15]=1,则为本地中断;判断是否是DMA中断则可通过判断DMA中断控制寄存器的第23位是否为1来确定,如果INTCSR[23]=1,则为DMA中断。不同的中断,其处理方式不同。

  3.3 驱动程序的创建及安装文件的修改

  为了正确的创建WDM驱动程序,首先要建立WDM编程环境,并创建自己的库文件。参考文件中提供了一种WDM编程环境的建立方法,但是,按照书中的方法经常不能成功的建立编程环境,为此,笔者根据自己的经验介绍一种简单易行的方法:

  (1)首先安装DDK;

  (2)在开始菜单中选择Compuware Driver Studio\Develop下的DDK Build Setting;

  (3)在打开的对话框中的DDK Root Directory中设置DDK的根目录(如E:\WINDDK\2600),然后点击Launch Program,并打开Compuware DriverStudio的Driver Works文件夹中Source里的VdwLibs.dsw文件。

  (4)选择Build菜单中的Set Active Project Configuration,并在弹出的对话框中选择合适的Project configurations。而对于现行的32位机,它不需要像Win32 AMD64 Free等这样的工程;

  (5)选好一个工程后,点击OK,然后点击Build with BUILD.EXE即可生成所需的库。然后再根据自己的需要重新选择新的Project configurations,以进行库的创建。

  笔者的这种方法在于使用DDK Build Setting的Launch Program打开VdwILibs.dsw,编译没有出现错误,书中的方法则是先打开VC++,然后打开VdwLibs.dsw,选择Batch Build下的Rebuild All创建库,但是笔者试了几次均不成功。

  库文件生成之后,即可打开创建好的驱动程序,并在VC++的菜单中打开DDK Build Setting,再在DDK Root Directory中设置DDK的路径为实际安装的路径,之后点击Build图标,就可以生成BPSKDRIVER.sys文件了。另外,驱动的类型可以自己设定,Windows系统定义了一系列的设备类名和GUID,找到驱动工程文件中后缀名为.inf的安装文件,将其内容修改成与硬件信息一致就可以了。然后将此文件拷贝到工程中的i386文件夹中。至此,一个完整的驱动就创建成功了。

  4 结束语

  本驱动现在已经经过测试,工作正常。并已经应用于数字卫星解调卡中。WDM编程环境的创建具有笔者自己的见解,并且可以实现一次创建即成功,希望对同类驱动程序的开发具有借鉴作用。

关键字:PCI  驱动程序 编辑:探路者 引用地址:基于PCI总线的数字卫星解调卡驱动程序开发

上一篇:基于CPLD的MIDI音乐播放器的设计
下一篇:四通道I2C多路复用器提供了地址扩展、总线缓冲和故障管理

推荐阅读最新更新时间:2023-10-17 15:44

多媒体PCI接口控制芯片SAA7146A及其应用
摘要:概述了多媒体处理芯片SAA7146A的主要特点,描述了其内部的主要结构和关键功能,介绍了其在视频音频处理领域的开发应用,并给出了在视频图像多媒体中相应实例。 关键词:多媒体 PCI总线 信号处理 图像采集 现在,基于PC机的多媒体应用越来越广泛,各种视频、音频信号处理技术日新月异。其中的关键技术之一就是计算机与各种外围多媒体器件的接口问题。PC机可供选择的总线接口基本上有ISA、PCI、USB三种。其中,ISA总线传输率很低,只有8MB/s,基本上已被淘汰;USB接口虽然对用户来说使用很方便,但它的数据传输率也不够高,USB1.1版的数据传输率只有12MB/s。由于多媒体信号中的视频信号的实时处理对数据传输率要求很高,较
[手机便携]
Synopsys发布完整的PCI Express 4.0 IP解决方案
高质量的基于PCI Express的DesignWare PHY、控制器和Verification IP完整方案以其翻倍至16GT/s的性能助力企业级SoC设计 美国加利福尼亚州山景城,2014年6月 — 亮点: • 业界首款完整支持最新PCI Express 4.0规范的PCI Express® 4.0 IP解决方案,已于6月4日在加利福尼亚州圣克拉拉市举办的2014年PCI-SIG®开发者大会上亮相 • 基于PCI Express 4.0的Synopsys DesignWare®控制器IP提供面向端点、根组件、双重模式(端点/根组件)以及交换开关应用的端口逻辑,具有最小的延迟、门数和功耗 • 基于PCI Express 4
[嵌入式]
基于PCI ExPress总线传输的视频采集系统方案
摘要:提出了基于PCI Express总线传输的视频采集系统设计方案。采用ADV7188进行视频解码,能够采集多种格式模拟视频信号,而且提高视频信号的质量;采用Virtex-5系列的FPGA使系统设计灵活、集成度高且易升级。该系统采用PCI Express与PC进行通信,能够实现多路视频采集和海量数据传输,比高速USB总线的480 Mb/s的数据传输量提高了5倍。 视频采集系统在工业领域应用广泛,随着多媒体技术的快速发展,对视频采集、处理和传输性能的要求也不断提高,如高采集速度、低功耗、抗干扰性、实时性及扩展性等。这里提出了以Virtex-5为核心,由ADV7188为视频解码器,PCIExpress为传输总线
[嵌入式]
基于<font color='red'>PCI</font> ExPress总线传输的视频采集系统方案
msp430和stm32 lcd屏驱动程序
最近使用了一块MSP430F5529单片机做课设,自带的拓展板上有一块12864的COG的LCD屏,记录下使用的驱动程序。 硬件原理图: COG_CS为片选信号,每次数据或指令通信完毕,需要拉低拉高一次。COG_RST为上电复位引脚,正常工作后不控制。 COG_A0是数据命令选择端,低电平表示传输的是数据,高电平表示传输的时命令。 COG_SCLK是时钟信号,上升沿有效。 COG_SDA为数据线,只能写不能读,无法读取COG内部的显存数据。COG_BKLED为背光控制IO,低电平背光点亮,高电平背光熄灭。 驱动程序: 头文件: #ifndef LCD_H_ #define LCD_H_ #define LCD_
[单片机]
msp430和stm32 lcd屏<font color='red'>驱动程序</font>
基于PCI-9846数字化仪的变频器输出性能测试系统
应用领域: 高压大功率电机变频调速领域。 挑战: 单元串联型高压变频器利用若干低压功率单元串联实现高压输出,这种结构使其具有良好的容错性能;将发生故障的单元屏蔽后,通过一定的故障处理方法,可以使系统继续降低容量运行,保证生产的稳定运行。本文设计的系统主要针对采用三种不同的故障处理方法时,对单元串联型高压变频器输出电能质量的各项指标进行实时监测和分析,尤其是单元发生故障后,系统输出电压的性能指标,应尽量与故障前保持一致,以减小故障对系统工作的影响。 解决方案: 基于PCI-9846的变频器输出性能测试系统,利用LabVIEW虚拟仪器软件平台搭建系统主控界面,设计了相应的故障处理方法,可以得到不同
[测试测量]
msp430矩阵式按钮驱动程序
写这个程序的时候,完全没有参考,全部是建立在汇编语言的基础上,一步步的搬移到c语言上的。但是测试后,感觉效果还是十分理想,所以拿出来与众位分享了,希望对一些朋友有所帮助~ #include msp430x14x.h unsigned char LineScan ={0xef,0xdf,0xbf,0x7f}; //列值列举 void ADD() { P4OUT+=1; } void SUB() { P4OUT-=1; } unsigned int key_check(void) //检测是否有按键按下 { unsigned char temp; P
[单片机]
基于PCI软“核”的PCI总线接口设计与实现
PCI总线是通过主桥电路挂接在Host CPU上的局部总线,典型的PCI局部总线系统结构如图1所示。PCI的外部设备既可以作为PCI总线目标设备(Slave),实现基本的传送要求,也可以作为PCI总线的主控设备(Master),访问其他PCI总线设备及系统的其他资源。用户在实际应用中可以根据实际需求来设计设备的功能。 由于PCI总线规范 定义了严格的电气特性和时序要求,因而开发基于PCI总线的接口卡有一定的难度。它要求在接口卡和终端设备之间有一个总线接口控制器,以解码PCI总线线范并完成数据传送,这需要开发人员对PCI总线规范有深刻的理解并具有较高的计算机开水平。开发PCI接口大体有两种方式:使用专用的PCI接口芯片和可编程器
[嵌入式]
VB环境下实现PCI设备底层访问的两种方法
    摘要: 介绍了在VB开发环境下,对PCI设备进行底层访问的两种方法:一种是通过用用户自己编写的动态连接库(DLL)实现,二是利用WINDRIVER提供的VB运行库编写直接访问硬件接口函数,并对两种方法行了比较。     关键词: WINDRIVER PCI 动态连接库 应用程序接口 VB集成化编程语言一种功能强大而容易上手的开发工具,在用户界面、数据库、多媒体、网络编程等方面,VB可谓得心应手。然而VB有限的硬件编程能力以又使得许多硬件开发者对此深感无奈。尤其在工业控制,测控技术等领域,自行设计开发的I/O卡,数据采集卡等在WIN32下的驱动常常需要借助DDK,VtooIsD等工具进行艰苦而又长期的
[嵌入式]
小广播
最新电源管理文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved