PCI规范及其开发_第1页
PCI规范及其开发_第2页
PCI规范及其开发_第3页
PCI规范及其开发_第4页
PCI规范及其开发_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PCI 规范及其开发 :PCI 设备 WINDOWS 驱动程序的开发 摘要:本文主要介绍了在 Windows9x 操作系统下开发 PCI 设备驱动程序的方法。关键词: PCI 设备 驱动程序PCI 设备概述 近几年来,随着诸如图形处理、图像处理、三维动画技术的发展,计算机与外设通信需要处理的 数据量迅速增加,基于 ISA 总线的通信方式已经不能满足高速数据传输的要求, PCI 局部总线的 引用就是为了打破高速数据传输的瓶颈。 PCI 总线的英文全称是: Peripheral Component Intercon nect Special Interest Group, 简称 PCISIG ,即

2、外部器件互连。 PCI 是先进的高性能局部总线,可同 时支持多组外围设备,具体表现在:(1) 以 33MHz 的时钟频率操作,( 2) 采用 32 位数据总线,( 3) 数据传送率可高达 132MB /s;(4) 支持突发传输,( 5) 即总线主控设备( 6) 发出地址之后,( 7) 可以连续进行多次数 据传送;(8) 提供了配置空间,( 9) 能够支持即插即用; (10) 支持 3.3V 电压,( 11) 有利于降低系统功耗。为了减少开发难度,缩短开发周期,我们建议选择专用芯片。根据硬件要实现的功能,选择芯片。 以 PLX 公司的产品为例, PCI9052 提供了 5 个局部地址存储空间、支

3、持中断、支持从模式数据传 输;PCI9054和PCI9080在PCI9052的基础上又增加了主模式数据传输、两个独立的 DMA通道 和八个邮箱寄存器等功能。驱动程序的模式和开发工具的选择以上是对 PCI 设备硬件方面的介绍,为了实现 PCI 设备与计算机的通信,还需要开发 PCI 设备驱 动程序。驱动程序是用来管理系统资源的可执行二进制代码,与操作系统拥有相同的级别,不同 的操作系统支持不同类型的驱动程序。 目前在市场上比较流行的操作系统是 Windows9x 和 Windo wsNT 这两种系列。 Windows9x 包括 Windows95 、 Windows98 、 WindowsME

4、; WindowsNT 包括 W indowsNT4.0、Windows2000。Windows95 支持 VXD 类型的驱动程序,而 WindowsNT 支持 WD M 类型的驱动程序, Windows98 兼容 Windows95 的 VXD 驱动程序,同时它又推出一个新的 Win 32 Drivers Mode (WDM) 驱动类型。这个新的类型实际是在 Windows NT 的驱动模型的基础上增 加了即插即用等内容。 WDM 驱动也可以用在 Windows 2000 (先前叫 Windows NT5.0 )中。一个 完善的驱动程序应至少开发 Windows 9X 和 Windows N

5、T 两个版本。目前,虽然 Windows 2000 非常流行,但由于 Windows98 仍占有相当规模的市场,而且它又兼容 Windows95 的 VXD 驱动程 序,因此 VXD 驱动程序仍然实用。本文只介绍基于 Windows9x 系统下 VXD 驱动程序的开发。VXD 是虚拟设备驱动程序的简称, x 代表各种设备的名字, 如虚拟键盘驱动程序 (vkd) ,虚拟鼠标 驱动程序(vmd)等等。开发驱动程序需要对硬件进行操作,由于Intel 80386以上的微处理器有 4个优先级别: 0 级、 1 级、 2 级和 3 级,一般操作系统运行于优先级第 0 级上,而用户程序运行在 第 3级上,

6、Windows9x 操作系统对系统硬件采取了屏蔽的策略,限制了运行于第 3级的应用程序 对系统资源(如中断控制器、内存等)的操作。但 VXD 运行在最高级特权级 第 0级,拥有 操作系统的特权,可以超越这些屏蔽,直接进行系统硬件的操作。 开发设备驱动采用的主要开发工具是微软为设备开发者提供的软件包Device Driver Kit (DDK) 。这个软件包包括有关设备开发的文档、编译需要的头文件和库文件、调试工具和程序范例。在DDK 中还定义了一些设备驱动可以调用的系统底层服务, 如 DMA 服务、中断服务、 内存管理服务、可安装文件系统服务等等。 这些都是编写设备驱动所必须的。 但由于 Wi

7、ndows 95的 DDK 主要使 用汇编语言描述,代码可读性不强,开发起来比较困难。因此,我们在 Windows 9x 操作系统中 采用了 Numega 公司的产品 VtoolsD。VtoolsD 是基于 C/C+ 的,支持 Borland C+ 和 Visual C+ , 代码可读性强,使用和维护都较 Windows DDK 容易。驱动程序的设计编写设备驱动程序的目的是使被驱动的硬件可以管理系统资源,与PC机系统兼容,正常工作,通过设备驱动程序,多个进程可以同时使用这些资源(如内存、I/O、中断源等),实现多进程并行运行。驱动程序是针对具体硬件设计的,不同硬件有不同的驱动程序,下面仅讨论开

8、发驱动程 序几个必要的通用的步骤。1、PCI 配置空间简介每个 PCI 设备都有自己的配置空间,用于支持即插即用,使之满足现行的系统配置结构。下面对PCI 配置空间做一下简要介绍。配置空间是一容量为 256 字节并具有特定结构的地址空间。这个空间又分为头标区和设备有关区 两部分。头标区的长度是 64 字节,每个设备都必须配置该区的寄存器。该区中的各个字段用来唯 一地识别设备。其余的 192 字节因设备而异。配置空间的头标区 64个字节的使用情况如图 1 示为了实现即插即用,系统可根据硬件资源的使用情况,为 PCI 设备分配新的资源。因此编写设备 驱动程序重点是获得基址寄存器(Base Addr

9、ess)和中断干线寄存器的内容。配置空间共有六个基址寄存器和一个中断干线寄存器,具体用法如下:PCI Base Address 0 寄存器:系统利用此寄存器为 空间,通过这段地址我们可以以内存映射的形式访问PCI Base Address 1 寄存器:系统利用此寄存器为PCI 接口芯片的配置寄存器分配一段 PCI 地址 PCI 接口芯片的配置寄存器。PCI 接口芯片的配置寄存器分配一段 PCI 地址空间,通过这段地址我们可以以 I/O 的形式访问 PCI 接口芯片的配置寄存器。PCI Base Address 2、3、4、5寄存器:系统 BIOS利用这些寄存器分配 PCI地址空间以支持 PCI

10、接口芯片的局部配置寄存器0、 1、 2、 3的访问在所有基址寄存器中,第 0 位均为只读位,表示这段地址映射到存储器空间还是 I/O 空间,如果 是“1”表示映射到 I/O 空间,如果是 “0”则表示映射到存储器空间。中断干线寄存器(Interrupt Line):用于说明中断线的连接情况,这个寄存器的值与标准8259的IRQ 编号( 015)对应。设备识别号 供应商识别号状态寄存器 命令寄存器分类代码 修改版本自测试 头标类型 延时计数 Cache基址寄存器保留保留扩展 ROM 基址寄存器保留保留Max-Lat Min-Gnt 中断引脚 中断干线 图1 配置空间头标区2、设备初始化PCI 设

11、备驱动程序要完成识别 PCI 器件、分配 PCI 硬件资源、响应 PCI 器件中断等功能,这就需 要访问 PCI 配置空间来获得必需的参数。 实现在 Windows9x 操作系统下访问 PCI 配置空间可以利 用 PCI 系统 BIOS 功能调用,通过供应商识别号( VendorID )和设备识别号 ( DeviceID )直接访 问设备,也可以利用配置管理器(Configuration Manager)封装的功能函数,根据供应商识别号(VendorlD )和设备识别号(DevicelD )搜索设备结点树,查询 PCI设备。由于编写PCI系统BIOS 功能调用程序更为简捷,所以本文采用这种方法

12、。PCI 系统 BIOS 功能提供了 BIOS 的访问与控制的具体方法,所有软件(设备驱动程序、扩展 RO M 码)将通过标准中断号 1AH 调用 BIOS 功能访问特殊部件。在驱动程序中调用 VtoolsD 系统服 务 Exec_VxD_Int ()来实现 PCI 系统 BIOS 的 1AH 中断。首先,通过PCI设备的供应商识别号(VendorlD八 设备识别号 (DevicelD )和索引号(Index) 查找特定设备所在的总线号(Bus Num)、设备号(Device NUM )、功能号(Function Num)和寄存器号(Register Num )。总线号是从0到255的数值,在

13、一个系统中,可把多达256条的PCI 总线用桥连接在一起。 由于编号是从 0开始的, 所以当系统有 N 条总线时, 总线号会达到 N-1; 设备号是在 0到 31之间分配的任意值, 并不拘于从 0开始按顺序分配; 功能号分配从 0到 7的值。 代码如下:ALLREGS* pRegisters; / pRegisters 是指向寄存器结构体的指针pRegisters->REAX =0xb102; / 0xb102 是功能号pRegisters->RECX =0x1001; / 假设 Device ID=0x1001 pRegisters->REDX=0x102b; / 假设 V

14、endor ID=0x102b Exec_VxD_Int(0x1a,pRegisters); / 调用 1AH 中断返回值是 pRegisters->REBX 。 BH 寄存器是总线号, BL 寄存器的高 5位是设备号,低 3位是功能 号。然后,向配置空间地址寄存器 CF8h 写入总线号、设备号、功能号、索引号, 从配置空间数据寄 存器 CFCh 读出配置空间的内容。配置空间地址寄存器(CF8h)格式如下:Bit31 30-24 23-16 15-11 10-8 7-2 10使能位 保 留 总线号 设备号 功能号 寄存器号 00使能位为 “1”表示允许访问配置空间数据寄存器(CFCh)存

15、放要读写的数据。代码如下:DWORD d=0;d=pRegisters->REBX;(d<<=8)|=0x80000000;for (short i=0;i<16;i+) / 读取 64 字节配置空间_outpd(0xcf8,d+4*i); / 按 DWORD 类型一次读取四个字节dprintf("%8x",_inpd(0xcfc); / 打印输出3、内存的读写Winsows 工作在 32 位保护模式下,保护模式与实模式的根本区别在于 CPU 寻址方式上的不同, 这也是 Windows 驱动程序设计中需要着重解决的问题。 Windows 采用了分段、

16、分页机制,这样使 应用程序产生一种错觉,好象程序中可以使用非常大的物理存储空间。这样做最大的好处就是一 个程序可以很容易地在物理内存容量不一样的、配置范围差别很大的计算机上运行,编程人员使 用虚拟存储器可以写出比任何实际配置的物理存储器都大得多的程序。 每个虚拟地址由 16 位的段 选择字和 32 位段偏移量组成。通过分段机制,系统由虚拟地址产生线性地址。再通过分页机制, 由线性地址产生物理地址 (如图 2)。线性地址被分割成页目录 (Page Directory) 、页表 (Page Table) 和页偏移 (Offset) 三个部分。当建立一个新的 Win32 进程时,操作系统会为它分配一

17、块内存,并建 立它自己的页目录、页表,页目录的地址也同时放入进程的现场信息中。当计算一个地址时,系 统首先从 CPU 控制器 CR3 中读出页目录所在的地址,然后根据页目录得到页表所在的地址,再 根据页表得到实际代码数据页的页帧,最后再根据页偏移访问特定的单元。硬件设备读写的是 物理内存,但应用程序读写的是虚拟地址,所以存在着将物理内存地址映射到用户程序线性地址 的问题。15 0 31 0 31 0 31 0图2 虚拟地址转换为物理地址 从物理地址到线性地址的转换工作是由驱动程序来完成的。驱动程序的内存映射部分主要是调用 VxD 的系统服务 MapPhysToLinear 。在 VtoolsD

18、 中这个函数的定义如下: PVOID MapPhysToLineag(CONST VOID * PhysAddr,DWORD nBytes,DWORD Flags); 其中第一个参数 PhysAddr 就是要映射的内存的物理地址的起始位置,这个物理地址可以从 PCI 配置空间的基址寄存器中获得, nBytes 是内存区域的长度, Flags 必须设置为 0。这个函数返回的 就是这段物理地址映射的线性内存地址。如果指定的内存不能存取,函数将返回 FFFFFFFFH 。 如: PDWORD pBase = (PDWORD)MapPhysToLinear(PVOID)PhysAddress,Phys

19、Size,0); 将 pBase 传递给调用驱动的用户程序,用户程序就可以像使用指针一样利用pBase 访问内存。4、I/O 端口的操作在 PC 机上, I/O 寻址方式与内存寻址方式不同,所以处理方法也不同。 I/O 空间是一个 64K 字节 的寻址空间, I/O 寻址没有实模式与保护模式之分,在各种模式下寻址方式相同。在 Windows9x 系统下,运行于第 3级的应用程序也可以直接使用 I/O 指令访问 I/O 空间。在设备初始化访问配 置空间时,已用到了 I/O 指令,在对硬件进行配置时,也可以根据从配置空间基址寄存器 PCI Ba se Address 1 中返回的 I/O 端口基地址使用 I/O 指令。5、响应中断VTOOLSD 提供了 VHardwareInt 类,虚拟 IRQ ,处理硬件中断。在 Windows9x 中, VPICD 虚拟 了物理可编程中断控制器的端口,从而可以控制物理中断控制器。虚拟 IRQ 的编程思路:首先从 VHardwareInt 类中派生出一个类,重载 OnHardwareInt 函数;然后,动态创建一个派生类对象实 例;最后钩挂处理程序,这就是需要编写的中断服务程序。(关于 VHardwareInt 类可参考

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论