新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PCI9052接口芯片的配置及驱动程序开发

PCI9052接口芯片的配置及驱动程序开发

作者:时间:2012-03-21来源:网络收藏

2.1 在操作系统体系结构中的位置

操作系统结构可分为五层模型:

(1)用户应用程序;

(2)IO管理层;

(3)

(4)HAL(硬件抽象层);

(5)硬件。

图2给出了Windows2000操作系统开发者所关心的特征,一般情况下,软件要么在用户模式中执行,要么在内核模式下执行。从驱动开发的角度上看,WDM模型为存在于Win-dows2000系统中的驱动程序提供了一个参考框架。作为Windows2000系统结构开发人员,由于操作系统为应用程序,而在驱动程序和硬件之间提供有系统服务接口和平台相关操作,因此,设计时只需要关注应用程序和设备驱动程序的开发。

2.2 设备资源

PCI设备的硬件资源分配与管理是驱动程序很重要的部分,设备的硬件资源包括内存空间、I/O空间和中断。由于PCI总线为PnP总线,PCI设备的硬件资源是由PCI配置机构动态分配给PCI配置寄存器的,因此,驱动程序首先需要取得这些资源才能操作硬件。当PnP管理器检测到PCI设备时,系统就会发送IRP_MN_START_DEVICE的IRP给驱动程序,驱动程序调用ONStartDevice以启动例程处理,并在启动例程里获取该IRP栈,同时把它包含的系统分配给该设备的资源信息。

用DriverStudio开发驱动程序时,应在Wizard中设置好PCI设备的资源。对于实际的设备卡,其基地址寄存器0和1分别固定用于局部寄存器的内存映射地址和I/O映射地址,基地址寄存器2则用于设备卡的内存映射地址,并使用局部中断引脚来产生PCI中断,以分别生成对应的KIoRange类、KMemoryRange类和KInterrupt类。这些配置信息由配置管理器发送到OnStartDevice中重载该成员函数,而开发者则不必再处理。在一般情况下,驱动程序无需再访问PCI设备的配置空间,如果需要访问,则可通过类KPciConfiguration,该类包含了通过向PCI总线发送渎写配置空间的IRP操作。也可定义类KRe-sourceAssignment来获取PCI的端口地址和中断号以及内存地址和大小,并把得到的资源放在用户自己定义的变量中。

2.3 WDM驱动程序对硬件资源的访问

获取设备的硬件资源以后,就可以对硬件资源进行访问了。对硬件的访问一般包括I/O端口访问和内存访问,它们分别对应PCI配置空间的I/O空间和内存空间。从图2可以看出,当应用程序需要访问设备时,它就会调用Win32API函数(如ReadFile)。Win32子系统模块通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务则调用内核模式来支持例程。即在调用ReadFile函数时,首先到达系统的人口点,然后调用系统服务接口,最后由系统调用内核模式的服务例程。执行时首先检查传递给它们的参数,然后创建一个“I/O请求包(IRP)”的数据结构,并把这个数据结构送到某个驱动程序的入口点执行IRP设备驱动程序,最后再访问硬件。对于PIO方式的设备,一个IRP_MJ_READ操作将直接读取设备的端口或设备的内存寄存器。一般会使用硬件抽象层(HAL)来访问硬件。IRP贯穿于驱动程序之间,它在应用程序、驱动程序和设备之间起着桥梁作用,可称之为内核态的“消息”。驱动程序完成一个I/O操作后,可通过调用一个特殊内核模式服务例程来完成该IRP,完成操作时再处理IRP的最后工作,以它使等待的应用程序恢复运行。

用DriverStudio开发驱动程序时,可根据配置声明KIoRange类、KMemoryRange类和KInterrupt类来实现对内存空间、I/O空间、中断的操作。在本例中,基地址寄存器0和1固定用于芯片的操作寄存器内存映射地址和I/O映射地址,基地址寄存器2则用于双口RAM的内存映射。通过一个外部引脚即可产生中断。标识两个KMem-oryRange类实例、一个KIoRange类实例和一个KInterrupt类实例的具体实现细节如下:

(1) I/O端口的访问

I/O端口的访问流程如图3所示,应用程序通过API函数DeviceIoControl的调用,并调用驱动程序的分发例程DeviceControl,同时通过KIoRange类来实现对I/O映射空间的访问。需要注意的是,当DeviceloControl异步调用的时候,必须在驱动程序中添加取消例程,并在DeviceControl例程中阻止一个应用程序对其的多次调用。KIoRange类的成员函数outb、inb、outw、inw、ind、outd可分别用于从端口读或写一个字节、字和双字数据。在WDM中,对于I/O端口,系统可将其看成寄存器,一般用于数字传输量比较小的地方。在对PCI设备的访问中,I/O端口的访问通常比较频繁。



评论


相关推荐

技术专区

关闭