LINUX设备驱动之PCI设备驱动

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LINUX设备驱动之PCI设备

wangxy@

该文档是整理PCI驱动时参考网上资料编写,供大家参考交流学习。

1) PCI总线

总线由电气接口和编程接口组成。先介绍PCI总线的电气接口。该总线具有以下特性:

①总线位宽为32位,可扩充到64位,数据总线和地址总线复用。

②总线的时钟频率为33MHz。随着PCI总线的发展,总线的时钟频率在提

高,PCI-X 1.0总线的时钟频率为66MHz/100MHz/133MHz,到PCI-X 2.0

的时候,总线的时钟频率发展到266MHz/533MHz/1066MHz,不过PCI总

线和PCI-X总线硬件结构上完全兼容。

③支持全自动配置,资源分配,即插即用。

④总线规范独立于微处理器,通用性好。

⑤ PCI设备可以完全作为主控设备控制总线。

⑥采用中央集中式总线仲裁。

⑦⑧⑨⑩

2) PCI设备引脚介绍

图(一) PCI兼容设备引脚示意图

在一个PCI应用系统中,如果某个PCI设备获得了PCI总线的控制权,就称该设备是主设备,被主设备选中以进行数据传输的PCI设备称为从设备,对于PCI兼容设备的引脚主要分为两部分:必需引脚和可选引脚。对应主设备至少需要49个引脚,对应从设备至少需要47个引脚。必需部分对应图(一)中的左侧部分,可选部分对应图(一)中右侧部分。

PCI兼容设备引脚共有100根,下面对这些信号进行一一介绍,介绍前先对引脚信号的类型做一个简介。PCI引脚信号按照数据传输的方向和电路驱动的特性分为五种类型。

①in:输入信号

②out:输出信号

③t/s:双向三态I/O驱动信号(三态:高电平、低电平和高阻抗)

④s/t/s:持续双向三态I/O驱动信号,表示持续且低电平有效的三态信号。

在某个时刻只可属于一个主设备,并被其驱动。这种信号从低电平到高阻抗之前,必需保证至少在一个时钟周期处于高电平状态,即低电平 -> 至少一个时钟周期高电平 -> 高阻抗。另一个主设备要驱动该信号,至少要等该信号的原有驱动者将其释放(变为高阻抗状态)一个时钟周期后,才能开始。如果这种信号处于非驱动状态,在有新主设备驱动它之前应采取上拉措施,

⑤o/d:漏极开路即高阻状态,适用于输入/输出,其可独立输入/输出低电

平和高阻状态,若需要产生高电平,则需使用外部上拉电阻。可作线或,允许多个设备共同使用。

备注一多功能设备的任何一种功能都能连接到任何一条中短线上,中断引脚寄存器决定该功能用那一条中断线去请求中断。如果一个设备只用了一条中断线,就是用INTA,如果用两条就使用INTA和INTB,依,此类推。对于多功能设备,可以是所有功能用一条中断线,也可以每种功能使用自己的中断线,最多四种功能。

备注二在总线主设备和从设备之间,64位传输是动态协商的,在每个地址周期进行一次,而且,只有主存命令支持64位传输,总线主设备使REQ64有效,从设备则通过使ACK64有效加以应答,REQ64和ACK64都是外部上拉的,保证64位和32位单元混用,一旦64位传输建立,就一直保持到这次传输结束。

3) PCI总线上的操作

总线命令

总线命令是由主设备发向从设备,其作用是规定主设备正在请求的传输类型,在地址周期,被编码的总线命它出现在C/BE[3-0]引脚上,从设备的地址出现在AD[]地址数据复用引脚上。

命令的使用规则

所有PCI设备都是配置(读和写)命令的目标设备,必须做出应答。对其他的命令则有选择余地,I/O读或写命令是可选的。命令执行规则保证I/O读或写命令的执行顺序。有重定位功能或寄存器的目标设备要求能通过配置寄存器映射到存储器空间,并响应基本的存储器读或写命令,这就为没有I/O空间(仅X86处理器有)设备的使用提供了一种选择。当这种映射实现时,无论设备映射到I/O空间还是存储器命令执行规则都由系统设计者来保证。

总线主设备可以根据需要使用任选指令,从设备也可根据需要而选用指令,但如果选用了基本指令,就必须支持所有存储器命令,包括高速缓存写命令、高速缓存行读命令和存储器多行读命令。如果不能全部使用,这些为优化性能而设的命令必需转化为基本的存储器命令。例如,一个从设备可以不实现存储器行读命令,但是它必须能接

受该命令的请求,并按存储器读命令来处理。同理,一个从设备可以不实现存储器写但它必须能接受该命令的请求,并按存储器写命令来处理。

对于进/出系统存储器的块数据传输,对能支持高速缓存写和高速缓存行读命令的主设备,建议采用这两天命令,如果由于某种原因,总线主设备不能使用性能已优化的命令,就用存储器读和存储器写命令。

对于使用存储器读命令的总线主设备,对所有命令都可作任意长度的操作,但最优方法如下,如果高速缓存写命令要求实现高速缓存行范围寄存器,存储器读命令也使用它,

使用高速缓存行范围寄存器时的最优方法:

存储器读命令:当突发传输少于半条高速缓存行数据时使用。

高速缓存行存储器读命令:当突发传输半条到三条高速缓存行数据时使用。

存储器重复读命令:当突发传输三条以上高速缓存行数据时使用。

不使用高速缓存行范围寄存器时的最优方法:

存储器读命令:当突发传输两个或更少数据时使用。

高速缓存行存储器读命令:当突发传输三到12个数据时使用。

存储器重复读命令:长突发传输数据时使用。

PCI协议基础

在PCI总线上,总线的基本传输机制是突发传输,一个突发传输由一个地址周期和大于等于一个数据周期组成。PCI总线支持内存空间和

I/O地址空间的突发传输。

编程接口:

每个PCI设备由一个总线编号、一个设备编号及一个功能编号来标识,PCI规范允许单个系统拥有高达256个总线,linux目前支持PCI 域,每个PCI域可拥有最多256个总线,每个总线可支持32个设备,每个设备可具有最多8个功能。每种功能都可以在硬件级由一个16位的地址来标识。驱动程序使用pci_dev

数据结构来访问设备。

总线上每个外设拥有三个地址空间:内存位置、I/O端口和配置寄存器,内存位置和I/O端口由同一PCI总线上的所有设备共享,

大多数PCI总线上的外设会把寄存器映射到某个内存地址区段,此时的内存地址区段就是I/O内存。

分析I/O端口和 I/O内存的区别:

MIPS、ARM和PowerPC等平台的I/O和主存采用的是统一编址的方式,它们将I/O 空间映射到内存,采用与内存相同的汇编指令(load和 store)来读写设备,这种方式称为I/O内存;x86平台的I/O和主存采用的是独立编址的方式,CPU 有专门的线路来访问I/O,而且有专门的汇编指令(in和out)来读写设备,这种方式称为I/O端口。

每种外设都是通过读写寄存器进行控制。在硬件层,内存区域和I/O区域没有概念上的区别,他们都是通过向地址总线和控制总线发送电平信号进行访问,再通过数据总线读写数据。

相关文档
最新文档