pci协议总结.pdf

上传人:赵** 文档编号:36408045 上传时间:2022-08-27 格式:PDF 页数:23 大小:1.79MB
返回 下载 相关 举报
pci协议总结.pdf_第1页
第1页 / 共23页
pci协议总结.pdf_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《pci协议总结.pdf》由会员分享,可在线阅读,更多相关《pci协议总结.pdf(23页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-一一. . PCIPCI 引脚引脚必要的引脚在左边,任选的引脚在右边必要的引脚在左边,任选的引脚在右边为了表达方便,将 PCI 信号按数传方向及驱动特性划分为五种类型,各种类型的规定如下:in:输入信号。out:输出驱动信号。t/s:表示双向三态输入输出驱动信号。sts:持续三态Sustained Tri-State ,表示持续的并且低电平有效的三态信号。在*一时刻只能属于一个主设备并被其驱动。 这种信号从有效变为浮空 高阻状态之前必须保证使其具有至少一个时钟周期的高电平状态。 另一主设备要想驱动它, 至少要等到该信号的原有驱动者将其释放变为三态一个时钟周期之后才能开场。同时, 如果此信号处

2、于持续的非驱动状态时, 在有新的主设备驱动它之前应采取上拉措施, 并且该措施必须由中央资源提供。o/d:漏极开路Open Drain可作线或形势允许多个设备共同使用,二二. . 1 1系统引线系统引线CLK in:时钟输入,为所有PCI 上的接口传送提供时序。其最高频率可达66MHz,最低频率一般为 0DC ,这一频率也称为PCI 的工作频率。对于PCI 的其他信号,除、 、 、之外,其余信号都在 CLK 的上升沿有效或采样RST in: 复位, 用来使 PCI 专用的特性存放器和定时器相关的信号恢复规定的初始状况。每当复位时, PCI 的全部输出信号一般都应驱动到第三态。2 2地址和数据引线

3、地址和数据引线AD0AD31 t/s:地址、数据多路复用的输入输出信号。在FRAME*有效时,是地址周期;在 IRDY*和 TRDY*同时有效时,是数据周期。一个PCI 总线的传输中包含了一个地址信号周期和一个或多个数据周期。PCI 总线支持突发方式的读写功能。地址周期为一个时钟周期,在该周期中AD0AD31 线上含有一个 32 位的物理地址。对于 IO 操作,它是一个字节地址;假设是存储器操作和配置操作,则是双字地址。在数据周期, AD0AD7 为最低字节, AD24AD31 为最高字节。当IRDY*有效时,表示写数据稳定有效,TRDY*有效表示读数据稳定有效C/BE03*t/s:总线命令和

4、字节使能多路复用信号线。在地址周期,这四条线上传输的是总线命令;在数据周期,传输的是字节使能信号,用来表示在整个数据期中,AD0AD31 上哪些字节为有效数据。3. 3.接口控制管脚接口控制管脚出问题时常测这些管脚出问题时常测这些管脚FRAME*:帧周期信号。Master 驱动,表示一次访问的开场和持续时间。 FRAME*无效时,是传输的最后一个数据周期。IRDY*:Master 主设备准备好信号。TRDY*:Slave 从设备准备好信号。当这两者同时有效时,才能进展完整的数据传输,否则即为等待周期。在写周期,IRDY*信号有效时,表示有效的数据信号已在AD0AD31 中建立;在写周期,TRD

5、Y*信号有效,表示 Slave 已做好了接收数据的准备。在读周期,IRDY*信号有效时,表示 Master 已做好接收数据的准备。.z.-在读周期,TRDY*信号有效,表示有效数据已被送入AD0AD31 中,STOP*:停顿数据传送信号,由从设备发出。当它有效时,表示Slave 请求 Master 终止当前的数据传送。IDSEL:初始化设备选择信号。在读写配置空间时,用作Slave 的片选信号Slave 通常把 IDSEL 连到 AD31:0上的一根(AD00 31是 PCI 总线的共享地址和数据线,每一次PCI 传送都分为地址周期和数据周期。在地址周期,采用0 型读写时,AD00 31的容如

6、下,AD00和AD01总为“00,因为配置读写是以双字为单位的,AD02AD07是要读写的PCI 配置空间的存放器号AD08AD10是设备的功能号在一块 PCI 卡上有多个功能设备时,为了进一步区分不同的设备就要用到这几位,由于Realtek8029 是单功能设备,故这几位全为 0,AD11AD31是设备选择位,其中必须有且仅有一位为“1,如图2 所示,这在物理上表现为总线的AD11AD31中有一根为高电平如果输出高电平的这根线与*块 PCI 卡的 PCI IDSEL 引脚相连, 这块卡就会被激活, 这样, 在紧接着的数据周期中,它就会将其 PCI 配置空间相应存放器中的容放到总线上以供读取。

7、DEVSEL*:设备选择信号,由从设备驱动,该信号有效时,当前 Slave 设备已被选中4 4仲裁信号仲裁信号REQ*t/s:总线请求信号。该信号一旦有效即表示驱动它的设备要求使用总线。它是一个点到点的信号线,任何主设备都应有自己的 REQ*信号。GNT* t/s: 总线允许信号。 用来向申请占用总线的设备表示其请求已获批准。这也是一个点到点的信号线,任何主设备都应有自己的 GNT*信号。5 5错误报告信号错误报告信号PERR*:s/t/s数据奇偶校验错误报告信号, 但是该信号不报告特殊周期中的数据奇偶错。一个设备只有在响应设备选择信号 DEVSEL*和完成数据期之后,才能报告一个 PERR*

8、 。对于每个数据接收设备,如果发现数据有错误,就应在数据收到后的两个时钟周期将 PERR* 激活。该信号的持续时间与数据期的多少有关,如果是一个数据期,则最小持续时间为一个时钟周期;假设是一连串的数据期并且每个数据期都有错,则 PERR*的持续时间将多于一个时钟周期。由于该信号是持续的三态信号,所以该信号在释放前必须先驱动为高电平。另外,对数据奇偶错的报告不能丧失也不能推迟。.z.-SERR* o/d:系统错误报告信号。该信号用于报告地址奇偶错,特殊命令序列中的数据奇偶错,以及其他可能引起灾难性后果的系统错误。SERR*是漏极开路信号,由返遣错误的单元驱动,在一个 PCI 时钟有效。SERR*

9、信号的发出和时钟同步, 因而满足总线上所有其他信号的建立时间和保持时间的要求。6 6中断信号中断信号中断在 PCI 总线上是可选用的,低电平有效,用漏极开路方式驱动。同时,此类信号的建立和撤销是与时钟不同步的。PCI 为每一个单功能设备定义一根中断线。对于多功能设备或连接器,最多可有4 条中断线。对于单功能设备,只能使用,其余 3 条中断线无意义。PCI 局部总线有四条中断线,定义如下:od:中断 A,用于请求一次中断。表 81 给出了总线编码及类型说明。其中,命令编码中的 1 表示高电平,0表示低电平。3IO 读命令:该命令用来从一个映射到 IO 地址空间的设备中读取数据。41O 写命令:该

10、命令用来向一个映射到 1O 地址空间的设备写入数据。5保存命令:保存命令编码留作将来使用。PCI 的任何设备都不能将它们挪作它用,任何设备也不允许对保存命令出反响。6存储器读命令:该命令用来从一个映射到存储器地址空间的设备读取数据。7存储器写命令:该命令用来向一个映射到存储器空间的设备写入数据。8配置读命令:该命令用来从每个设备的配置空间读取数据。9配置写命令:该命令向每个设备的配置空间写入数据。10、存储器多行读命令:该命令的作用是试图在主设备断开连接之前读取多行高.z.-速缓存数据。存储控制器应保证,只要效,就连续不断地发存储器请求。该命令预定用于大块连续数据的传输。11双地址周期DAC:

11、命令该命令用于传送64 位地址给支持 64 位寻址的设备。只支持 32 位寻址的目标把这种命令当作保存待,而对该命令不响应。12存储器一行读命令:该命令与存储器读命令不同之处在于它还表示主设备要求读取多于两个 32 位的 PCI 数据周期,即进展据传送。此时,一次读一行缓存围所有数据,而不是一个单一的存储器周期。13存储器写无效命令:该命令与存储器写命令不同之处是它要保证最小的传输量是一个高速缓存的行, 即主设备要在一次 P 中将寻址的高速缓存行的每个字节都写入,写入后发布写无效命令,用于维护 Cache 一致性的写无效协议。所有 PCI 设备都是配置(读和写)命令的目标,都必须做出应答。对其

12、他的命令则有选择响应。命令执保证 IO(读和写)命令的执行顺序。有重定位功能或存放器的目标设备应能通过配置存放器映射到存储空就为没有 IO 空间设备的使用提供了一种选择。当这种映射实现时,无论设备映射到 IO 空间还是存储器命令执行规则都对系统设计者提供保证。总线主控可以根据需要使用任选指令,目标(从设备)也可根据需要而选用指令,但如果它选用了根本指令,它就必须支持所有存储器命令。否则,就必须利用别名将这些为优化性能而设的命令存储器一行储器多行读和存储器写无效命令,转变为根本的存储器命令。例如,一个从设备可以不实现存储器一行令,但是它必须能承受该命令的请求,并按存储器读命令来处理。 同理,一个

13、从设备可以不实现存储器写但它必须能承受该命令的请求,并按存储器写命令来处理。对于系统存储器的数据读写, 建议在主设备支持的情况下尽量采用存储器写.z.-无效命令和存储器行读命果主设备确实不能支持上述优化性能的命令, 可采用存储器读写命令。对于使用存储器读命令的主设备,所有命令可进展任何长度的访问。三pci 协议1 PCI 总线的传输控制PCI 总线上所有的数据传输根本上都是由以下三条信号线控制的:FRAME*:由主设备驱动,指明一个数据传输的起始和完毕。IRDY*:由主设备驱动,允许插入等待周期TRDY*:由从设备驱动,允许插入等待周期。一般来说, PCI 总线的传输遵循如下管理规则:1FRA

14、ME*和 IRDY* 定义了总线的忙、闲状态。当其中一个有效时,总线是忙的;两个都无效时,总空闲状态。2一旦 FRAME*信号被置为无效,在同一传输期间不能重新设置。3除非设置了 IRDY* 信号,一般情况下不能设置 FRAME*信号无效。4一旦主设备设置了 IRDY*信号,直到当前数据期完毕为止。主设备不能改变 IRDY*信号和 FRAME* 状态。2 PCI 的编址PCI 定义了三个物理地址空间:存储器地址空间、I/O 地址空间和配置地址空间, 前两个是一般总线都有空间; 第三个是用以支持 PCI 硬件配置的特殊空间。PCI 总线的编址是分布式的,每个设备都有自己的地址译码,从而省去了中央

15、译码逻辑。PCI 支持两种设备地址译码:正向译码和负向译码。所谓正向译码就是每个设备都监视地址总线上的访问地址是否落在它围,因而速度较快。而负.z.-向译码是指该设备要承受未被其他设备在正向译码中承受的所有访问,因此,码方式只能由总线上的一个设备来实现。 由于它要等到总线上其他所有设备都拒绝之后才能译码, 所以速度然而, 负向译码对于标准扩展总线这类设备是很有用的,因为这类设备必须响应一个很零散的地址空间。 正和反向译码设备都不对保存的总线命令发出 DEVSEL*响应信号。1IO 地址空间在 IO 地址空间,全部 32 位 AD 线都被用来提供一个完整的地址编码字节地址 , 使得要求地址准确一

16、级的设备不需多等一个周期就可完成地址译码 产生 DEVSEL*信号,也使负向地址译码节省了一个时钟在 IO 访问中,AD0AD1 这两位很重要,并要与 C/BE03 配合,才能进展一次有效的访问。启动 IO 传输的主设备应确保 AD10正确指示本次传输的最低有效字节(即起始字节)。字节允许信号和 AD10一起指明传输的数据宽度和双字中被选中的字节,下表表示了 AD10和初始数据相位中字节允许的有效组合。(2存地址空间在存储器访问中,所有的目标设备都要检查 AD0AD1,要么提供所要求的突发传输顺序, 或者执行设备断开操作。对于所有支持突发传输的设备都应能实现线性突发性传输顺序,用AD2AD31

17、 译码得到一个双字地址的访问。在线性增长方式下,每个数据周期过后,按一个DWORD4 个字节增长,直到对话完毕。在存储器访问期间,AD0AD1 的含义如下:当AD0AD1 为 00 时,突发传输顺序为线性增长方式; AD0AD1 为 01 时,为高速缓存行切换方式; A 为 1*时,为保存。.z.-在存储器地址空间, AD312提供一个双字边界地址, 而 AD10不参与地址译码,用来指明主设备要求的数据传输顺序,见表 96。在线性增加模式下,每个数据相位后, 地址增加一个双字(即加 4, 对 32 位传输)或增加两个双字(即加8,对 64 位传输),直到传输完毕。3配置地址空间在配置的地址空间

18、中,要用 AD2AD7 将访问落实到一个 DWORD 地址寻址 64 个双字存放器。当一个设备收到配置命令时,IDSEL 信号成立且 AD0AD1为 00,则该设备即被选为访问的目标。否则就不参与当前的对话。如果译码出来符合*桥路的编号,且 AD0AD1 为 01,则说明配置访问是对该桥后面的设备,即不与桥直接连接的设备。4字节校正用字节使能信号 C/BE*03 来指出哪些字节带了有意义的数据,在每个数据周期,可以自由改变字节能,使之对传输数据的实际含义和有效局部进展界定,这一功能称作字节校正或字节对齐。5总线的驱动与过渡为了防止多个设备同时驱动一个信号到 PCI 总线上而产生竞争,在一个设备

19、驱动到另一个设备之间设个过渡期,又称为交换周期。在时序图上,交换期用 来表示。在每个地址周期和数据周期,所有的 AD 线都必须被驱动到稳定的状态数据,即使是在当前数据传涉及到的字节所对应的AD 线也不例外。在实际应用中,如果对功耗要求较高时,为尽量减少由于总线上信所造成的功耗,对当前总线周期中不用的字节用与前一周期一样的数据去驱动它们。.z.-四四 PCIPCI 总线的数据传输过程总线的数据传输过程PCI 的数据传输过程包括读传送、写传送、传送终止等。本节只介绍 PCI 总线上的读读操作。时序图 820 中示出了参与 32 位传送的各种重要信号之间的关系。实线表示正被当前总线主控或目标驱动号;

20、虚线表示没有设备驱动的信号,但假设此虚线处在基准位置时,仍然可表示它具有一个稳定的值;当三态虚线画在高、低状态之间时,说明它的值是不稳定的如,AD 线或线;当一实线变成连续的点画线说明它由原来的被驱动状态变成了现在的三态;当一实线由低向高跳变后成为连续的点画线时, 则说明该信过预充电变为高电平,然后变成三态释放。图 820 表示了 PCI 总线上的一次读操作中有关信号的变化情况。PCI 采用地址数据复用技术, 每一个 PCI 总线传送由一个地址相位和一个或多个数据相位组成。地址相位由 FRAME*变为有效的时钟周期开场。在地址相位,总线主设备通过 CBE30*发送总线命令。 如果是总线读命令,

21、 在地址相位后需要一个交换周期,该周期过后,AD3l0改由从设备驱动,以接纳从设备的数据。对于写操作没有过渡期,直接从地址相位进入数据相位。数据相位的个数取决于要传送的数据个数, 一个数据相位至少需要一个 PCI 时钟周期, 在任何一个数据相位都可以插入等待周期。FRAME*从有效变成无效表示当前正处于最后一个数据相位。总线操作完毕有多种方式。在大多数情况下,由从设备和主设备共同撤消准备就绪信号 TRDY*和 IRDY*。 如果从设备不能继续传送, 可以设置 STOP*信号,表示从设备撤消与总线的连接。所寻址的从设备不存在或者 DEVSEL*信号一直为无效状态都可能导致主设备完毕当前总线操作,

22、使 FRAME*和 IRDY*变为无.z.-效,回到总线空闲状态。从图中可看出,一旦信号有效,地址周期就开场,并在时钟 2 的上升沿处稳定有效。在地址周期 AD0AD31 上包含有效地址, C/BE*03 上含有一个有效的总线命令。 数据期是从时钟 3 的上升沿处开场此期间, AD0AD31 线上传送的是数据, 而线上的信息指出数据线上的哪些字节是有效的即哪几个是当前要传输的。要特别指出的是,无论是读操作还是写操作,从数据周期的开场一直到传输的完成,CBE*的输出缓冲器必须始终保持有效状态。图 96 中的 DEVSEL*信号和 TRDY*信号由被地址相位所发地址选中的从设备提供,但要保证 TR

23、DY*在 DEVSEL*之后出现,IRDY*信号是发起读操作的主设备根据总线的占用情况发出的。数据的真正传输是在 IRDY*和 TRDY*同时有效的时钟前沿进展的。当这两个信号之一无效时,就表示需要插入等待周期,此时, 不进展数据传输。这说明一个数据相位可以包含一次数据传输和假设干个等待周期。图中所示的时钟 4、6、8 处各进展了一次数据传输,而在时钟 3、5、7处插入了等待周期。在读操作中的地址相位和数据相位之间,AD 线上要有一个总线交换周期,这通过从设备强制 TRDY*实现,即让 TRDY*的发出比地址晚一拍。在交换周期过后且 DEVSEL*信号变为有效时,从设备必须驱动 AD 线。尽管

24、主设备在时钟7 处道下一个数据相位是本次传送的最后一个,但由于*种原因它暂时不能完成该次传输(此时 IRDY*无效), 所以主设备还不能撤消 FRAME*, 只有在时钟 8 处,IRDY*变为有效后,FRAME*信号才能撤消,从而通知从设备这是最后一个数据相位。写时序:.z.-所示是 PCI 总线写操作时序的一个例子。 从中可以看出, 总线上的写操作与读操作相类似, 也是 FRAME*的有效表示写操作周期中地址相位的开场, 但地址相位后不需要交换周期,因为数据和地址都是由同一主设备提供的。在图 97 中,第一个和第二个数据相位中没有等待周期,而在第三个数据相位中连续插入了 3 个等待周期,注意

25、,第一个等待周期是由传输双方共同引起的。 告诉从设备最后一个数据相位的方法与读操作时一样, 即当 FRAME*撤消后,还需要 IRDY*处于有效状态。这里,主设备在时钟 6 处使 IRDY*恢复有效,通知从设备这是最后一个数据相位,但由于从设备未准备好,最后一次数据传输到时钟 8 才完成。从图中 AD 和 CBE*的波形可看出,主设备发送数据可以延迟,但字节允许信号不受等待周期的影响,不得延迟发送。上述的读写操作均是以多个数据相位为例来说明的。如果是一个数据相位, FRAME*信号在没有等待周期的情况下, 应在地址相位(读操作应在交换周期)过后即撤消。对于一个数据相位,中间亦可插入等待周期。.

26、z.-3)PCI3)PCI 总线传输的终止过程总线传输的终止过程无论是主设备还是从设备, 都可以提出终止传输的要求, 但不一定得到响应。也就是说,双方均无权单方面终止传输,而需要相互配合,但传输的最终停顿控制要由主设备完成。(1) 由主设备引发的终止主设备是通过撤消 FRAME*并建立 IRDY*来提出终止请求的,这样做是为了通知从设备,现在己进入了传输周期中最后一个数据相位。此后,IRDY*一直保持有效直到 TRDY*信号有效,完成最后一个数据的传输。接着便撤消IRDY*,从而到达完全终止的条件(FRAME*和 IRDY*同时无效),完毕传输,进入总线空闲状态。主设备一般在以下情况下会提出终

27、止传输: 次数据传输即将完毕(剩下一个数据未传输)。总线上有更高优先级的总线占用请求, 而总线仲裁器取消当前主设备的总线控制权(移去了 GNT*信号)。主设备发出了 FRAME*后在规定的时间没有检测到目标设备的DEVSEL*响应信号。(2)由从设备引发的终止从设备可以通过 STOP*信号请求终止传输。一旦 STOP*有效,就必须保持有效到主设备置FRAME*无效。 IRDY*和TRDY*之间的关系与STOP*和FRAME*之间的关系无关。所以,在从设备请求终止期间数据仍可以传送,这仅取决于当时 IRDY*和 TRDY*的状态。.z.-从设备可由下面两种原因请求终止传输: 从设备正处于不能传送

28、数据的状态。例如,设备的数据缓冲器满,暂时不能接收数据,或者因数据缓冲器空而不能发送数据等。 待传送条件满足后, 重新启动传输。 这种情况称为 “重入(Retry)。由于从设备的响应速度太慢,在 PCI 引导时间长度(8 个时钟周期)不能作出响应以及在猝发传输中, 从设备检测到下一个数据的地址已经超出规定的围等原因而提出终止传输请求。此种情况称为“解除连接(Disconnect)。五五PCIPCI 驱动程序的特点驱动程序的特点1设备的总线构造设备采用什么总线构造非常关键,因为不同的总线类型 如 ISA 和 PCI 在许多硬件工作机制上是不同的, 所以驱动程序设计也不同。2存放器要了解设置的控制

29、存放器、数据存放器和状态存放器,以及这些存放器工作的特性。3设备错误和状态要了解如何判断设备的状态和错误信号,这些信号要通过驱动程序返回给用户。4中断行为要了解设备产生中断的条件和使用中断的数量。5数据传输机制最常见的数据传输机制是通过 I/O 端口port,也就是通过 CPU 的 IN/OUT 指令进展数据读写。PC 的另一种重要的传输机制是DMA,但 PCI 规不包括附属 DMA 的说明。6设备存许多设备自身带有存,PCI 设备大多是采用映射的方式映射到PC 系统的物理存。有的设备还要通过驱动程序设置设备的接口存放器。3 3PCIPCI 设备驱动程序的功能设备驱动程序的功能硬件驱动程序的功

30、能虽然千差万别, 但根本功能就是完成设备的初始化、对端口的读写操作、中断的设置、响应和调用以及对存的直接读写。.z.-一设备初始化PCI 设备驱动程序要实现识别 PCI 器件、 寻址 PCI 器件的资源和对 PCI 器件中断的效劳。在 PCI 设备驱动程序的初始化过程中,利用指定器件识别号deviceid商识别号vendorid、检索号 inde*搜索PCI 器件,通过调用PCBIOS 确认其存在,并确定其物理位置:总线号、器件号和功能号,这是该器件功能在系统中的唯一寻址标志。利用总线号、 器件号和功能号可以寻址该器件功能的 PCI 配置空间设备驱动就需要从配置空间获得硬件的参数。PCI 设备

31、的许多参数,包括所用的中断号,端口地址的围及 I/O 方式、存储器的地址及存储器映射方式等,都可以从 PCI 配置空间的各基址所对应的寻址空间中得到。 读写配置空间可以调用 BIOS 中断 1AH, 也可以先向配置空间地址存放器(0CF8H)写入总线和设备号。在前面搜索 PCI 器件时得到的和存放器号,再对配置空间数据存放器(0CFCH)进展读写。对设备驱动来说,最重要的是获得基址存放器(BADR),不能认为 PCI器件资源总是设计设备时设置的初值, 系统可能会根据硬件情况为 PCI 设备分配新的资源。我们所设计的 PCI 设备使用的基址 1-3 都是按 I/O 空间映射的,而基址 4 是按存

32、方式映射的。确定一个端口是按什么方式映射的,可以读对应端口的配置存放器。读出后,判断其 0 位,如果 0 位为数值 0,表示其是按存方式设置的,否则为 I/O 方式设置的。存方式和 I/O 方式的配置存放器的含义参见有关文献。如果要获得基址的大小,可以向基址存放器写入 FFFFH,然后读基址存放器,如果是存方式,从第 4 位开场的 0 的数目表示基址的大小,如果是 I/O 方式,则从第 2 位开场的 0 的数目表示基址的大小。2端口操作.z.-在 PC 机上,I/O 端口寻址空间和存寻址空间是不同的,所以处理方法也不同。I/O 空间是一个 64K 字节的寻址空间,它不象存有实模式和保护模式之分

33、,在各种模式下寻址方式一样。在 Windows 9*下,用户程序可以直接使用 I/O 指令, 而不一定非通过专门的驱动程序来完成,所以如果软件对硬件的操作完全是通过 I/O 端口操作来完成的,甚至可以不用专门设计驱动程序,直接由应用程序来完成对硬件的控制。由于 PCI 总线是 32 位的总线标准,在进展 I/O 操作时通常要进展双字DWORD操作,而且以前大多数 C/C+编译软件都没有提供双字的函数,所以需要构造双字操作读写函数 inpd/outpd。2端口操作在PC 机上,I/O 端口寻址空间和存寻址空间是不同的,所以处理方法也不同。 I/O空间是一个 64K 字节的寻址空间,它不象存有实模

34、式和保护模式之分,在各种模式下寻址方式一样。在 Windows 9*下,用户程序可以直接使用 I/O 指令,而不一定非通过专门的驱动程序来完成,所以如果软件对硬件的操作完全是通过I/O 端口操作来完成的,甚至可以不用专门设计驱动程序,直接由应用程序来完成对硬件的控制。由于 PCI 总线是 32 位的总线标准,在进展 I/O 操作时通常要进展双字DWORD操作,而且以前大多数 C/C+编译软件都没有提供双字的函数, 所以需要构造双字操作读写函数 inpd/outpd。 3 存的读写Winsows工作在 32 位保护模式下, 保护模式与实模式的根本区别在于 CPU 寻址方式上的不同, 这也是 Wi

35、ndows 驱动程序设计中需要着重解决的问题。 Windows 采用了分段、分页机制参见第三章。这样做最大的好处就是一个程序可以很容易地在物理存容量不一样的、 配置围差异很大的计算机上运行,编程人员使用虚拟存储器可以写出比任何实际配置的物理存储器都大得多的程序。每个虚拟地址由 16位的段选择子和 32 位段偏移量组成。通过分段机制,系统由虚拟地址产生线性.z.-地址。再通过分页机制,由线性地址产生物理地址。线性地址被分割成页目录(Page Directory)、页表(Page Table)和页偏移(Offset)三个局部。当建立一个新的Win32 进程时,操作系统会为它分配一块存,并建立它自己

36、的页目录、页表,页目录的地址也同时放入进程的现场信息中。 当计算一个地址时, 系统首先从 CPU控制器 CR3 中读出页目录所在的地址,然后根据页目录得到页表所在的地址,再根据页表得到实际代码数据页的页帧,最后再根据页偏移访问特定的单元。硬件设备读写的是物理存,但应用程序读写的是虚拟地址,所以存在着将物理存地址映射到用户程序线性地址的问题。 从物理地址到线性地址的转换工作也是由驱动程序来完成的。在 Windows 95 下,使用 DDK 的 VMMCallMapPhysToLinear进展地址映射。驱动程序的存映射局部主要是调用 V*D 的系统效劳MapPhysToLinear。在 Vtool

37、sD 中这个函数的定义如下:PVOIDMapPhysToLineagCONSTVOID*PhysAddr,DWORDnBytes,DWORDFlags;其中第一个参数 PhysAddr 就是要映射的存的物理地址的起始位置,而 nBytes 是存区域的长度,Flags 必须设置为 0。这个函数返回的就是这段物理地址映射的线性存地址。如果指定的存不能存取,函数将返回 FFFFFFFFH。 4中断的设置、响应与调用对中断的设置、响应与调用应该在驱动程序中完成。对中断的调用象前面调用 BIOS 的 1AH 中断读取配置存放空间可以由 DDK 的 E*ecInt 完成。PCI 设备驱动程序应当从 PCI

38、 配置存放器的中断存放器INTLN和中断引脚存放器INTPIN中获得有关中断的信息。DDK 还提供了响应中断事件的效劳。如在 Windows 95 中, VPICD 效劳用来管理所有硬件中断事件。 PC 机的硬件中断需要确定硬件中断的 IRQ,对一个特定的 IRQ 中断源,VPICD 或者提供缺省的中断处理函数,或者允许其它 V*D 重载中断处理函数。在 VtoolsD 中,要处理.z.-硬件中断应该从 VHardwareInt 继承一个类。在这个类中,VtoolsD 提供了编写中断响应程序所需的功能。4 设备驱动的调用编写设备驱动并不是最终的目的,总是需要由用户程序来调用驱动并实现一定的功能

39、。一般调用设备驱动是使用CreateFile 函数翻开设备文件,得到一个文件句柄。翻开设备文件后,调用DeviceIoControl 函数就可以同设备驱动程序交换数据了。完成硬件操作之后, 可以调用 CloseHandle(hV*D);关闭设备驱动。5设备驱动的进一步封装以上是对驱动程序的初步设计。但考虑到在上面调用设备驱动时使用的DeviceIoControl 函数仍是比拟复杂的,程序也不太容易具有通用性。而且,在有些开发工具中,如 Visual Basic,不包括直接读写 I/O 端口的语句,所以可以考虑根据不同软件的需要对驱动程序进展不同的封装。比方用 DLL, Active*, VCL

40、 和C+类库类库进展封装。 DLL 可以在大多数软件环境中进展调用。 Active*可以在Visual Basic 等可视编程环境中使用。VCL 可以在 Delphi 和 C+ + Builder 中使用。考虑到许多用户使用 Visual C+,所以也可使用 C+类库方式。六六.PCI.PCI 配置空间配置空间256 字节的 PCI 配置空间分为 64 字节的头标区和 192 字节的设备相关区两局部。 头标区的各个存放器用来唯一地识别设备;设备相关区则保存一些与设备相关的数据。配置空间的头标区又分为两局部:前 16 个字节的定义在各种类型的 PCI 设备中都是一样的;剩余的字节随设备类型不同而

41、有所不同。位于偏移地址 0EH处的头标类型字段规定了头标区的布局构造。目前,规定义了三种头标类型。头标类型设备.z.-210PCI-CardBus 桥PCI-PCI 桥除上述桥外的所有设备因为 PCI 网卡的头标类型是 0,所以下面我们就来详细说说其布局构造,至于其他类型的头标请读者自行阅读。图 3 就是头标类型 0 的头标区的布局。头标区中的存放器根据功能可分成下面几组:1.设备的识别1供给商代码:该存放器用于识别 PCI 设备的制造商,具体代码由 PCI SIG.pcisig.分配。0FFFFH 是无效的供给商代码。2设备代码。该存放器用来标识*供给商生产的具体设备,代码由各供给商定义。供

42、给商代码和设备代码,读者可以到.pcidatabase./查阅。图 3 头标类型 0 的头标区的布局.z.-3版本号。该存放器用来定义指定设备的版本信息。4头标类型。该字段的第 7 位为“1标识该设备是多功能设备,为“0标识为单功能设备;该字段的 06 位就是上文表中所述的头标类型。5设备分类代码。用来标识设备的总体功能和特定的存放器级编程接口。上面 5 个字段均为只读类型,所有的 PCI 设备都必须实现其功能。2.设备控制和设备状态1命令存放器为一个设备发出和响应 PCI 总线命令提供粗略的控制。图 4 就是命令存放器格式。图 4 命令存放器格式我们比拟感兴趣的位有:a.位 0I/O 空间控

43、制:控制对 I/O 空间访问的响应。该位为 0 时,制止设备响应对 I/O 空间的访问;该位为 1 时,允许设备响应 I/O空间的访问。缺省设置为 0。b.位 1存储器空间控制:控制一个设备对存储器空间访问的响应。该位为 0时,制止响应;该位为 1 时,允许设备响应对存储器空间的访问。缺省设置为 0。2状态存放器用来记录 PCI 总线有关的状态信息。3.基址存放器PCI 设备中,除了配置空间外,还有两个物理空间:存空间和 I/O 空间。为了访问这两个地址空间,就必须使用基址存放器。头标类型 0 中涉及 3 种基址存放器:存空间基址存放器、I/O 空间基址存放器和扩展 ROM 基址存放器。4.其

44、他存放器.z.-其他存放器包括一些本文不涉及到的存放器,如中断引脚、中断线等等。有兴趣的读者可以自行阅读。四四.PCI.PCI 配置空间的访问配置空间的访问上面说过,PCI 规使用从 0CF8H0CFFH 这 8 个 I/O 地址来访问所有设备的PCI 配置空间。这 8 个字节实际上构成了两个 32 位存放器:0CF8H 存放器叫做“配置地址存放器;0CFCH 叫做“配置数据存放器。当要访问配置空间的存放器时, 先向地址存放器写上目标地址,然后就可以从数据存放器中读写数据了。我们说过,PCI 配置空间对应于一个 PCI 逻辑设备,所以要访问一个配置空间的*个存放器,必须要指定:PCI 总线号、

45、PCI 设备号、PCI 设备功能号和存放器号。配置地址存放器的格式如下:31使能位30 24保存23 16总线号15 11设备号10 8功能号7 2存放器号0100第 0、1 位上的“0是用来要求你只能按双字4 字节来读写配置空间存放器。第31 位“使能位用来决定是否允许访问配置空间:为“ 1时表示可以访问;为“0时表示不可以访问。例如,为了读总线号 0、设备号 17H、功能号 0 的 30H 存放器,你可以使用下面的代码:MOV EA*, 8000B830HMOV D*, 0CF8HOUT D*, EA*MOV D*, 0CFCHIN EA*, DA.z.-六六. .基址存放器基址存放器PC

46、I 设备中,除了配置空间外,还有两个物理空间:存空间和I/O 空间。为了访问这两个地址空间,就必须使用基址存放器。头标类型 0 中涉及 3 种基址存放器:存空间基址存放器、I/O 空间基址存放器和扩展 ROM 基址存放器。PCI 设备可以在地址空间中浮动是 PCI 局部总线中最重要的功能之一。它能够简化设备的配置过程。在系统上电时, 与设备无关的系统软件必须确定有哪些设备存在,同时建立一个统一的地址映射关系,并确定一个设备是否有扩展 ROM。1. 地址映射加电软件在引导操作系统之前必须建立一个统一的地址映射。也就是说,必须确定在系统中有多少存储器以及系统中的 I/O 控制器要求多少地址空间。当

47、这些信息确定之后,加电软件便可以把 I/O 控制器映射到合理的地址空间并引导系统。 为了使这种映射能够做到与响应的设备无关,从而在配置空间的头标区中安排了一个供映射时使用的基址存放器。在所有的基址存放器中, 位 0 均为只读位并且用来决定能够是存储器空间还是 I/O 空间。如果该位为0,则表示映射到存储器空间;假设为1 则表示映射到I/O 地址空间。2. 存储器基地址存放器映射到存储器空间的基址存放器可以是 32 位宽度,也可以是64 位宽度支持映射到一个 64 位地址空间时如图 6。图 6 32/64 存储器基地址存放器格式.z.-其中位 0 要用硬件方法使其恒为 0。而位 2 和位 1 两

48、位用来表示映射类型,具体如下:位 2 和位 100映射类型基地址存放器为 32 位宽,可以在 32 位表示的存储器地址围的任何地方进展映射0110保存基地址存放器为 64 位宽,可以映射到以 64 位表示的存储器空间的任何地方11保存至于位 3,假设数据是可预取的,就应将它置为 1,否则清 0。该存放器的区域各位用来将一设备映射到存储器空间。基地址存放器中用于 32 位存储器译码器的位【31:4】和用于 64 位存储器译码器的位【63:4】称为基地址单元。它的作用是:确定与译码器相关的存储器的大小;给译码器分配地址。如果存储器设备需要小于4K 的存储空间,规建议存储器围强行设为 4KB。3.I

49、/O 基地址存放器映射到 I/O 空间的基址存放器宽度总是 32 位如图 7:图 7 I/O 基地址存放器格式其中位 0 值为 1用硬件实现的,位 1 为保存位并且其读出值必须为 0,其余各位用来把设备映射到 I/O 空间。.z.-当基地址存放器位 0 的返回值为 1 时, 表示这是一个 I/O 译码器, 而不是存储器译码器,位1 保存并总是返回 0,【31:2】是基地址单元,并用于确定需要的 I/O 块容量,设置它的起始地址。规要求映射它的控制存放器组到 I/O 空间的设备不必请求每个 I/O 基地址存放器超过 256 个单元。4. 确定块容量和分配地址围要确定存储器的容量或 I/O 空间大

50、小可以通过简单地向基地址存放器写入全“1并回读来确定。假设返回一个是 0 值,则表示未实现基地址存放器;如果读回地值为非 0,则编程人员通过从基地址单元的最低有效位向上扫描返回值以找到第一个被成功置“1的位来确定所需存储器的容量或 I/0 空间的大小。假设存放器的位 0 是一个加权二进制 1,则位 1 的值就是 2,位 2 的值就是 4,依此类推。这样,在基地址单元中第一个发现的 1 所对应的加权二进制值便是所需的空间数。这也是存放器的第一个可读/可写位,在它之上的所有位钧定义为可读/可写位。这个信息发现后,程序将 32/64 位存储器起始地址或 32 位 I/O 地址写入基地址存放器中。5.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com