PCI驱动程序开发实例

PCI驱动程序开发实例,第1张

  引 言

  PCI总线广泛使用在计算机中,一方面是因为该总线的数据吞吐量大,另一方面是因为该总线与具体的处理器无关。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从设备。

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

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

  

PCI驱动程序开发实例,第2张

 

  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请求。

  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2454461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-04
下一篇 2022-08-04

发表评论

登录后才能评论

评论列表(0条)

保存