Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588925
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-05-15 00:14:55

PCI设备中,除了配置空间外,还有两个物理空间:内存空间和I/O空间。为了访问这两个地址空间,就必须使用基址寄存器。头标类型0中涉及3种基址寄存器:内存空间基址寄存器、I/O空间基址寄存器和扩展ROM基址寄存器。

 

PCI设备可以在地址空间中浮动是PCI局部总线中最重要的功能之一。它能够简化设备的配置过程。在系统上电时,与设备无关的系统软件必须确定有哪些设备存在,同时建立一个统一的地址映射关系,并确定一个设备是否有扩展ROM。

 

1.   地址映射

加电软件在引导操作系统之前必须建立一个统一的地址映射。也就是说,必须确定在系统中有多少存储器以及系统中的I/O控制器要求多少地址空间。当这些信息确定之后,加电软件便可以把I/O控制器映射到合理的地址空间并引导系统。为了使这种映射能够做到与响应的设备无关,从而在配置空间的头标区中安排了一个供映射时使用的基址寄存器。

 

在所有的基址寄存器中,位0均为只读位并且用来决定能够是存储器空间还是I/O空间。如果该位为0,则表示映射到存储器空间;若为1则表示映射到I/O地址空间。

 

2.   存储器基地址寄存器

映射到存储器空间的基址寄存器可以是32位宽度,也可以是64位宽度(支持映射到一个64位地址空间时)(如图6)。

 


图6  32/64存储器基地址寄存器格式

 

其中位0要用硬件方法使其恒为0。而位2和位1两位用来表示映射类型,具体如下:

 

位2和位1
 映射类型
 
00
 基地址寄存器为32位宽,可以在32位表示的存储器地址范围的任何地方进行映射
 
01
 保留
 
10
 基地址寄存器为64位宽,可以映射到以64位表示的存储器空间的任何地方
 
11
 保留
 

 

至于位3,若数据是可预取的,就应将它置为1,否则清0。该寄存器的区域各位用来将一设备映射到存储器空间。

 

基地址寄存器中用于32位存储器译码器的位【31::4】和用于64位存储器译码器的位【63::4】称为基地址单元。它的作用是:确定与译码器相关的存储器的大小;给译码器分配地址。如果存储器设备需要小于4K的存储空间,规范建议存储器范围强行设为4KB。

 

3.   I/O基地址寄存器

映射到I/O空间的基址寄存器宽度总是32位(如图7):

 

 


图7  I/O基地址寄存器格式

 

其中位0值为1(用硬件实现的),位1为保留位并且其读出值必须为0,其余各位用来把设备映射到I/O空间。

 

当基地址寄存器位0的返回值为1时,表示这是一个I/O译码器,而不是存储器译码器,位1保留并总是返回0,【31::2】是基地址单元,并用于确定需要的I/O块容量,设置它的起始地址。

 

规范要求映射它的控制寄存器组到I/O空间的 设备不必请求每个I/O基地址寄存器超过256个单元。

 

4.   确定块容量和分配地址范围

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

 

5.   扩展ROM基地址寄存器

有些PCI设备,尤其是那些准备用于PC结构扩展板上的设备,需要EPROM作为扩展ROM。为此,在配置空间偏移地址30H处开始定义了四个字节的寄存器,用来处理这个扩展ROM的基地址和大小。(如图8)

 


图8 扩展ROM基地址寄存器格式

 

该寄存器和32位基地址寄存器相比,除了位的编码和用途不同之外,其它功能完全相似。它的高21位对应于扩展ROM基地址的高21位。一个设备实际实现的位数取决于该设备要求多大的地址空间。例如,一个设备要求它的扩展ROM映射到一64KB存储区域时,它就应该实现此寄存器的高16位,其它5位用硬件方法使它们恒为0。凡是支持扩展ROM的设备必须实现这个寄存器。

 

与设备无关的配置软件通过对扩展ROM基址寄存器的地址位上写入全“1”,然后再读回以确定设备要求多大的地址范围。所有的无关位上都返回0,从而有效地指出了地址边界,也就知道了设备要求的这一块地址空间的大小。一个设备要求的地址空间范围不能超过16MB。

 

这个寄存器的位0用来控制相应的设备是否能够接受对其扩展ROM的访问。当该位为0时,禁止访问设备的扩展ROM地址空间;当该位为1时,允许将本寄存器的其它位作为参数进行地址译码。命令寄存器中的存储器空间位优先于扩展ROM的使能位,但是,如果存储器空间位和扩展ROM的的使能位同时为1时,设备就必须响应对其扩展ROM的访问。扩展ROM的使能位在复位后应该为0。

 

6.   实例:读取PCI 8139C网卡上扩展ROM的内容

有了上面的基础知识,我们可以试着读取手上的PCI 8139C网卡上的扩展ROM的内容,源代码为ReadROM.ASM(见附件)。该程序在MASM6.11下编译,可以在DOS下运行。

 

该程序读取总线1、设备号7、功能号0的逻辑设备上的扩展ROM内容。将扩展ROM映射到0F000000H,然后将ROM使能和存储空间使能,最后程序进入到安全模式下,从0F000000H处读出数据。

 

有两点需要注意:

1)            虽然可以通过向扩展ROM基地址上写入0FFFFFFFFH,然后读出数据来判断ROM大小,但是根据实验结果是,多块8139C总是返回512K大小。

2)            该程序只能对256K,及其以上大小(如512K)的ROM读有效,对于128K的EPROM,读出的数据并不是ROM开始的数据。至于原因,我们下面的章节会具体解释。

阅读(916) | 评论(0) | 转发(0) |
0

上一篇:VxWorks定时器

下一篇:VxWorks and LPC2106

给主人留下些什么吧!~~