PCI驱动开发
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Byte3
Byte2
Byte1
Byte0
Device ID
Vendor ID
PCI Status
PCI Command
Class Code
Revision ID
Built-In Self Test
Header Tyine Size
Base Address Register 0 ~ 5
PCI 驱动开发 1. PCI 简介 PCI 总线标准是一种将系统外部设备连接起来的总线标准,是 PC 中最重要的总线,实际上 是系统的各个部分如何交互的接口。传输速率可达到 133MB/s。在当前的 PC 体系结构中, 几乎所有的外部设备采用的各种各样的接口总线,均是通过桥接电路挂接到 PCI 系统上。 在这种 PCI 系统中,Host/PCI 桥称为北桥,连接主处理器总线到基础 PCI 局部总线。PCI 与其他总线的接口称为南桥,其中南桥还通常含有中断控制器、IDE 控制器、USB 控制器和 DMA 控制器等。南桥和北桥组成主板的芯片组。
{ slotNumber.u.bits.DeviceNumber = deviceNumber; for ( functionNumber = 0; functionNumber < PCI_MAX_FUNCTION;
functionNumber++ ) { slotNumber.u.bits.FunctionNumber = functionNumber; if (!HalGetBusData(PCIConfiguration, busNumber, slotNumber.u.AsULONG, &pciData, sizeof(ULONG) )) { deviceNumber = PCI_MAX_DEVICES; break; } if (pciData.VendorID == PCI_INVALID_VENDORID ) { continue; } if ( ( VendorId != PCI_INVALID_VENDORID ) && ( pciData.VendorID != VendorId || pciData.DeviceID != DeviceId )) { continue; } pPciDeviceLocation->BusNumber = busNumber;
2. PCI 配置空间 每个 PCI 设备都有自己的配置空间,用于支持即插即用,使之满足现行的系统配置结构。下 面对 PCI 配置空间做一下简要介绍。 配置空间是一容量为 256 字节并具有特定结构的地址空间。这个空间又分为头标区和设备有 关区两部分。头标区的长度是 64 字节,每个设备都必须配置该区的寄存 器。该区中的各个 字段用来唯一地识别设备。其余的 192 字节因设备而异。配置空间的头标区 64 个字节的使 用情况如图 1 示。 为了实现即插即用,系统可根据硬件资源的使用情况,为 PCI 设备分配新的资源。因此编写 设备驱动程序重点是获得基址寄存器(Base Address)和中断干线寄存器的内容。配置空间 共有六个基址寄存器和一个中断干线寄存器,具体用法如下: PCI Base Address 0 寄存器:系统利用此寄存器为 PCI 接口芯片的配置寄存器分配一段 PCI 地址空间,通过这段地址我们可以以内存映射的形式访问 PCI 接口芯片的配置寄存器。
Reserved Space
Reserved Space
Expansion ROM Base Address
Reserved Space
Reserved Space
Max. Latency
表 1 PCI 配置空间
Min. Grant
Interrupt Pin
Interrupt Line
3.设备初始化 PCI 设备驱动程序要完成识别 PCI 器件、寻找 PCI 硬件的资源和对 PCI 器件中断的服务。在 驱动程序初始化过程中,使用 HalGetBusData()函数完 成寻找 PCI 设备的工作。在初始 化过程中,使用器件识别号(Device ID)和厂商识别号(Vendor ID),通过遍历总线上的 所有设备,寻找到指定的 PCI 设备,并获取设备的总线号,器件号与功能号。通过这些配置 信息,可以在系统中寻址该设备的资源配置列表。 在此之后,驱动程序需要从配置空间获取硬件的参数。PCI 设备的中断号、端口地址的范围 (I/O)方式、存储器的地址与映射 方式等,都可以从硬件资源列表数据结构中获取。在 Windows NT 中,调用 HalAssignSlotResources()函数来获得指定设备的资源列表数据结 构指针,然后通过遍历该列表中的所有资源描述符,获取 该设备的 I/O 端口基地址与长度, 中断的中断级、中断向量与模式,存储器基地址与长度等硬件资源数据。我们设计的 DMA 通信采用总线主控方式进行通信,在 设备初始化时需要对 DMA 适配器进行初始化,使用 HalGetAdapter()获得操作系统分配的适配器对象指针。 示例代码如下: // 遍历总线,获得指定设备的总线号,器件号与功能号 for ( busNumber = 0; busNumber < MAX_PCI_BUSES; busNumber++ ) { for ( deviceNumber = 0;deviceNumber < PCI_MAX_DEVICES;deviceNumber++ )
PCI Base Address 1 寄存器:系统利用此寄存器为 PCI 接口芯片的配置寄存器分配一段 PCI 地址空间,通过这段地址我们可以以 I/O 的形式访问 PCI 接口芯片的配置寄存器。 PCI Base Address 2、3、4、5 寄存器:系统 BIOS 利用这些寄存器分配 PCI 地址空间以支 持 PCI 接口芯片的局部配置寄存器 0、1、2、3 的访问。 在所有基址寄存器中,第 0 位均为只读位,表示这段地址映射到存储器空间还是 I/O 空间, 如果是“1”表示映射到 I/O 空间,如果是“0”则表示映射到存储器空间。 中断干线寄存器(Interrupt Line):用于说明中断线的连接情况,这个寄存器的值与标准 8259 的 IRQ 编号(0~15)对应。