基于DSP的PCI驱动程序开发

发布者:快乐之源最新更新时间:2010-02-01 来源: 现代电子技术关键字:PCI接口  DDK  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

  0 引 言

  计算机系统总是通过总线(Bus)实现相互间信息或数据交换的。这些定向的信息流和数据流在总线中流动,就形成计算机系统的各种操作,它能实现各种不同部件和设备之间的互连。

  PCI总线广泛使用在计算机中,一方面是因为该总线的数据吞吐量大,另一方面是因为该总线与具体的处理器无关。PCI总线的设计也使各种PCI外设卡可以直接插入PCI总线插槽中,而不需要考虑各种额外的特殊逻辑,在设计和使用PCI设备时,需要访问和控制硬件设备,如存储器读写、I/O端口访问、中断响应等。

  与工业标准结构(Industry Standard Architecture,ISA)设备不同的是:PCI硬件设备资源的分配不是硬件设计所决定的,而是由Windows操作系统根据PC机中所有硬件设备对资源的占有统一分配的。为了保证系统的安全性、稳定性和可移植性,对应用程序访问硬件资源加以限制。这就要求设计设备驱动程序以跨越操作系统的边界,对物理硬件进行操作。

  1 DSP芯片中集成的PCI接口特点

  1.1 PCI接口的内部结构

  DM642片内集成一个主/从模式的PCI接口,它相当于专用的PCI接口芯片,这样可以不必深究PCI总线规范,将工作重点放在系统功能的实现上。DSP可以通过这个接口实现与PCI主机的互连。

  从图1可以看出,PCI接口的内部结构包括7个部分:

  (1)PCI总线接口模块(PCI Bus InteRFace Unit,PBIN):该模块对主/从模式下的总线交易都不会插入等待周期,可以实现最大的总线传输带宽。

  (2)E2PROM控制器模块:控制器与外部的4线串行E2PROM相连。PCI接口复位时,控制器读取E2PROM中的数据,配置PCI接口。DSP可以通过映射寄存器访问E2PROM。

  (3)DSP从模式写模块:包括一个多路复用器和一个PBIN到DSP的FIFO。它完成的功能是:外部PCI设备通过PCI接口写数据到DSP从设备。外部主设备往DSP的Base0空间执行写操作时,PCI地址与DSPP寄存器中的固定偏移值结合,形成DSP目的地址,在传输过程中目的地址自动递增。

  (4)DSP从模式读模块:包括一个多路复用器和一个DSP到PBIN的FIFO。它完成的功能是:外部PCI设备通过PCI接口能够从DSP从设备读取数据。在外部主设备从DSP的Base0空间执行读操作时,PCI地址与DSPP寄存器中的固定偏移值结合,形成DSP源地址,在传输过程中此地址自动递增。

  (5)DSP主模式模块:包括读/写两个子模块,DSP是该模块的主控方。DSP主模式读这个子模块,完成DSP主设备通过PCI接口从外部PCI从设备中读取数据。DSP主模式写这个子模块完成DSP主设备通过PCI接口写数据到外部PCI从设备。

  (6)PCI I/O接口模块:它包括PCI的I/O寄存器,HSR,HDCR,DSPP。只能由PCI主机通过基址1寄存器或基址2寄存器的空间映射进行访问。

  (7)DSP寄存器接口模块:包含DSP的映射寄存器,用于控制主模式接口,产生PCI中断以及电源管理。

PCI接口的内部结构

  其他几个模块都与PCI总线接口模块相连,而PCI总线接口模块对外通过PCI总线与外部设备相连,这样。DSP就可以通过主/从模式的读或写来完成与外部-设备之间的数据传输。

  1.2 PCI接口中的寄存器

  PCI接口中包括3类寄存器:

  (1)PCI配置寄存器:只能被外部PCI主机(Host)访问。

  这些寄存器提供了PCI接口的配置信息,只能由外部主机访问,可以从外部E2PROM自动加载,或者直接设置为默认值。

  (2)PCI I/O寄存器:只能被外部PCI主机(Host)访问。

  PCI I/O寄存器只能由PCI主机通过基址l寄存器(Basel Address Register)或基址2寄存器(Base2Address Register)的空间映射进行访问。

  (3)映射在DSP外设空间的PCI寄存器,用于DSP控制PCI接口可以由外部PCI主机访问,也可以由DSP访问。

  2 驱动程序设计

  设备驱动程序提供连接到计算机硬件的软件接口。它是操作系统的信任部分,由I/O管理器(I/O Manag-er)管理和调动。

  用户应用程序以一种规范的方式访问硬件,而不必考虑如何控制硬件。驱动程序总是使设备看起来像一个文件,可以打开设备的一个句柄,然后应用程序可以在设备句柄最后关闭之前向驱动程序发出读写请求。

  I/O管理器每收到一个来自用户应用程序的请求就创建一个I/O请求包(IRP)的数据结构,并将其作为参数传递给驱动程序。

  2.1 设备驱动程序的组成部分

  可以把一个完整的驱动程序看作是一个容器,它包含许多例程。当操作系统遇到一个I/O请求包(I/ORequest Packet,IRP)时,它就调用这个容器中的例程来执行该IRP的各种操作。驱动程序包含以下几个基本例程:

  (1)DriverEntry例程:它是驱动程序的初始化入口点,必须叫作DriverEntry。它负责驱动程序的初始化,用来初始化驱动程序范围内的数据结构和资源。它主要有以下三个功能:设置Adddevice,Unload和其他例程的入口指针;可以从注册表中获取一些需要的信息以初始化驱动程序;初始化其他的在驱动程序范围内的数据结构和资源。所有的驱动程序都必须包含它。当装载驱动程序时,PnP管理器为每个驱动程序调用一次 DriverEntry例程。

  (2)AddDevice例程:在驱动程序初始化以后,PnP管理器调用驱动程序的Add Device例程来初始化由该驱动程序所控制的设备。在Add Device例程中,驱动程序创建一个设备对象作为目标设备,并将设备对象附着到设备堆栈中。

  (3)PnP例程:PCI设备都是即插即用设备,PCI设备的驱动程序必须具备PnP例程。PnP管理器使用PnP例程来管理驱动程序启动、停止和删除设备。

  (4)分发例程(Dispatch):用于管理驱动程序与应用程序之间的通信,从而实现应用程序控制PCI设备的目的。

  严格地说,驱动程序中只有“初始化”模块Drivet-Entry例程是一定不能少的。在实际工作中,所有驱动程序都有分发例程处理用户I/O请求。

  2.2 IRP处理

  I/O请求包(IRP)是驱动程序操作的中心,是一个预先定义的数据结构,带有一组对它进行操作的I/O管理器例程。一个IRP有固定的首部和可变数目的 IRP栈单元。IRP的固定部分含有IRP的固定属性,每个栈单元含有大多数有关的IRP参数。当IRP由多个驱动程序处理时,使用多个IRP栈单元。每个驱动程序从当前IRP栈单元得到它的IRP参数。如果把IRP沿当前设备的驱动程序栈向下传递,必须在当前驱动程序中使用正确的参数设置下一个栈单元,然后在此驱动程序中利用函数IoCalldriver()调用更低层的驱动程序。驱动程序不必处理所有的IRP,但至少需要处理“创建”和“关闭”这两个 IRP。I/O管理器接收I/O请求,然后在把它传递到合适的驱动程序栈中的最高驱动程序之前,分配并初始化IRP。驱动程序处理IRP的过程如图2所示。

驱动程序处理IRP的过程

  IRP首先到达最高层的驱动程序1,驱动程序1使用函数IoGetCurrentIrpStackLocation()获得指向当前栈单元的指针。

  然后驱动程序1使用IoCallDriver()函数调用下一个驱动程序。I/O管理器现在改变“当前IRF’栈单元”指针,所以驱动程序2看到向下的第二个IRP栈单元(驱动程序1为它设置的栈单元)。这个过程继续,直到最底层的的驱动程序4收到这个IRP。

  驱动程序4现在处理这个IRP。当它完成IRP的处理时,驱动程序4调用IoCompleteRequest()函数。指示它已经完成IRP的处理。IRP再沿设备栈向上传递,直到它最终弹出栈顶,回到用户。

  2.3 IRP的完成

  当一个驱动程序完成对IRP的处理时,它必须告诉I/O管理器,这称为IRP完成。如下面代码所示,必须设置IRP IoStatus域结构中的几个域。IoStatus,Status设置为一个NTSTATUS状态码,IoStatus.In-formation通常存储传输的字节数。如:

  Irp一>loStatus.Status=S T ATUS_SUCCESS

  Irp一>IoStatus.Information=info;

  IoCompleteRequest(Irp,IO_NO_INCREMENT);

  调用IoCompleteRequest()表明低层驱动程序已经完成了IRP的请求,并将这个IRP返回给I/O管理器。IO_No_INCREMENT是个系统定义的常量,指定启动该IRP的优先级,需要驱动程序快速处理。

  3 驱动程序功能实现

  当把板卡第一次插到计算机的PCI插槽以后,计算机的系统总线会检测到有个新设备没有安装驱动程序,并提示安装驱动程序。正确地安装驱动程序以后,用户就可以在应用程序中与驱动程序进行通信。

  3.1 打开设备

  在应用程序中调用系统提供的函数CreateFile()。如果系统根据设备名确实检测到设备并成功打开了这个设备,则返回一个指向这个设备的有效句柄;如果调用失败,则返回一个错误信息。

  3.2 读/写设备

  读/写设备包括读/写设备的配置空间、读/写设备的非配置空间,其中,非配置空间包括I/O空间、存储空间。

  设备被打开以后,应用程序就调用DeviceloCon-trol()函数来达到访问设备的目的。DeviceIoControl()函数有8个参数,其中第3个参数是应用程序传递给驱动程序的数据缓冲区地址,在这个数据缓冲区存放的是应用程序要读写的设备的空间、偏移量、长度,这些都需要在应用程序中配置好。

  这个调用由I/O系统服务接收。I/O管理器从这个请求构造一个合适的I/O请求包(IRP)。在最简单的情况下,I/O管理器只是把IRP传递给一个设备驱动程序,这个驱动程序调用硬件,并完成IRP的处理。I/O管理器把数据和结果返回给Win 32和用户应用程序。现在一个分层的设备驱动程序栈是很常见的。每个驱动程序把该请求划分为更简单的请求。高层次的驱动程序调用低层次的驱动程序,最后,最低层的驱动程序与硬件直接打交道完成用户的请求。I/O管理器把数据和结果返回给Win 32和用户应用程序。设备程序调用如图3所示。

设备程序调用

  当应用程序读/写设备时,驱动程序工作的流程图如图4所示。

驱动程序工作的流程图

  首先,获取当前IRP栈单元的指针;然后再读取I/O控制代码,判断应用程序想达到什么样的目的:是读/写配置空间,还是读/写非配置空间,然后再调用相应的处理程序。

  4 结 语

  这里采用微软的驱动程序开发包Device Driver Kit(DDK)是因为它是其他几种工具的基础,它要求开发人员深刻了解驱动底层,虽然不易掌握,但开发出来的驱动程序通用性好,兼容性强。板卡与PC机的通信速度得到了很大的提高。

关键字:PCI接口  DDK  驱动程序 引用地址:基于DSP的PCI驱动程序开发

上一篇:采用FPGA实现发电机组频率测量计的设计
下一篇:基于TMS320F240 DSP的激励器控制系统

推荐阅读最新更新时间:2024-05-02 20:59

stm32f103的RTC驱动程序
具体问题 这段时间在弄自己的一个《宝宝的气象站》的项目,使用了ESP8266的WiFi模块,使其能够将数据传输到OneNET后台并显示。网络通信使用的是OneNET提供的EDP通信组件,但是RTC遇到了问题。从NTP服务器获取的时间与本地RTC获取的时间有差异。NTP使用的是1970年1月1日作为起始时间点。本地RTC的起始点是2000年1月1日。这样就需要将NTP获取的秒减去两个时间的间隔。 代码 mip_rtc.h /** ***************************************************************************** * @文 件: mip_rtc.h *
[单片机]
DS12887(时钟日历芯片) c语言驱动程序
****************DS12887 时钟日历芯片调试******************/ 管脚配置: MOT: 接地 CS: 接地 地址:0xFF00 AS: 接单片机 ALE R/W: 接 RW DS: 接 RD RESET: 接高 IRQ: 空 SQW: 空 */ #i nclude REG51.h #i nclude absacc.h /*************************/ #define TM_SEC XBYTE #define TM_MIN XBYTE #define TM_HOU XBYTE #define DAY XBYTE #define DATE XBYT
[单片机]
嵌入式数据采集系统中的ADS8364驱动程序设计
1 引言 数据采集系统的工作原理就是将被测对象(外部世界或现场)的各种参量(可以是物理量,也可以是化学量,生物量)通过各种传感元件做适当转换后,再经信号调理、采样、量化、编码、传输等步骤,最后送到服务器进行数据处理和存储记录的过程。用于数据采集的成套设备称为数据采集系统(Data Acquisition System,DAS)。 数据采集系统一般包括传感器、放大器、滤波器、A/D采样转换电路、微处理器等元件。数据采集系统基本组成示意图如图1所示。A/D转换电路在数据采集系统中起着至关重要的作用,它的转换精度和工作可靠度直接关系着整个采集系统的工作性能。由于篇幅有限,本文仅就该数据采集系统中的A/D转换芯片ADS8364的驱动
[单片机]
嵌入式数据采集系统中的ADS8364<font color='red'>驱动程序</font>设计
基于WinCE的II2C驱动程序设计
引言   随着以计算机技术、通信技术和软件技术为核心的信息技术的迅速发展,嵌入式系统在各行业得到了广泛的应用,极大地推动了行业的渗透性应用。嵌入式系统是“以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”,由嵌入式硬件和嵌入式软件两部分组成。嵌入式软件包括嵌入式操作系统和嵌入式应用软件。Microsoft的桌面操作系统已经为人们熟悉和使用,嵌入式的操作系统 Windows CE.net也日益风行。Windows CE.net是Microsoft推出的功能强大的紧凑、高效、可伸缩的32位嵌入式操作系统,主要面对各种各样的嵌入式系统和产品。该系统所具有的多线程、多
[嵌入式]
CAN总线在嵌入式Linux下驱动程序的实现
1 引言 基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进行通信。文章采用CAN总线,基于嵌入式系统 32位的S3C44B0X微处理器,通过其SPI接口,MCP2510 CAN控制器扩展CAN总线;将嵌入式操作系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X微处理器没有内存管理单元MMU,采用uClinux嵌入式操作系统。这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操作系统下驱动程序的实现。文章重点解决了CAN
[单片机]
CAN总线在嵌入式Linux下<font color='red'>驱动程序</font>的实现
linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)
1. Based on linux2.6.32, only for mem(SDR) 2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论 4. 基于手上的一个项目来讨论,这里只讨论共性的地方 虽然linux支持三种省电模式:standby、suspend to ram、suspend to disk,但是在使用电池供电的手持设备上,几乎所有的方案都只支持STR模式(也有同时支持standby模式的),因为STD模式需要有交换分区的支持,但是像手机类的嵌入式设备,他们普遍使用nan
[单片机]
linux<font color='red'>驱动程序</font>之电源管理之标准linux休眠与唤醒机制分析(一)
基于MEGA16的LCD1602驱动程序(四位数据线)
//编译器:ICC-AVR v6.31A //目标芯片 : M16 //时钟: 8.0000MHz /*------------------------------------------------------------- LCD引脚定义 1---GND 2---VCC 3---VO 4---RS 5---RW 6---EN 7到14--D0-D7 15--背景灯+ 16--背景灯- -----------------------------------------------------------------*/ #include #include /*--------------------------------
[单片机]
mini2440LED驱动程序开发
/*********************************************************实验源代码 ********************************************************************/ 一、源代码: /***********************mini2440_leds.c*********************** *******************************************************************/ #include linux/miscdevice.h #include
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved