用I/O命令访问PCI总线设备配置空间
发布时间:2008/5/27 0:00:00 访问次数:720
     李 刚 吴彦鸿
    
     来源:《电子技术应用》
     摘要:通过对pci协议配置机制的分析,提出一种直接用i/o命令访问pci总线设备配置空间的方法,给出了相应的c语言程序,并在实际应用中得到验证,从而在大多数情况下避免了复杂的驱动程序开发。
    
    
     关键词:pci总线
     配置空间 操作系统
     pci总线推出以来,以其独有的特性受到众多厂商的青睐,已经成为计算机扩展总线的主流。目前,国内的许多技术人员已经具备开发pci总线接口设备的能力。但是pci总线的编程技术,也就是对pci总线设备的操作技术,一直是一件让技术人员感到头疼的事情。pci总线编程的核心技术是对相应板卡配置空间的理解和访问。一般软件编程人员基于对硬件设备原理的生疏,很难理解并操作配置空间,希望硬件开发人员直接告诉他们怎样操作;而pci总线硬件开发人员虽深刻地理解了其意义,在没有太多编程经验地前提下,也难于轻易地操作pci板卡。结果大多是硬件技术人员花费大量时间和精力去学习ddk、windrver等驱动程序开发软件。
     作者在开发pci总线接口设备时,经过对pci总线协议的深入研究,从协议本身的角度出发,找到一种方面而快捷的pci配置空间操作方法,只使用简单的i/o命令即可找到特定的pci总线设备并对其所有的配置空间进行读写操作。一旦读得其配置空间的内容,即可中得到担任系统对该pci总线设备的资源分配。
     1 pci总线配置空间及配置机制
     为避免各pci设备在资源的占用上发生冲突,pci总线采用即插即用协议。即在系统建立时由操作系统按照各设备的要求统一分配资源,资源分配的信息由系统写入各pci设备的配置空间寄存器,并在操作系统内部备份。各pci设备有其独自的配置空间,设计者通过对积压设备(或插槽)的isdel引脚的驱动区分不同设备的配置空间。配置空间的前64个字节称为配置空间的预定自区,它对每个设备都具有相同的定义且必须被支持;共后的空间称为设备关联区,由设备制造商根据需要定义。与编程有关的配置空间信息主要有:
     (1)设备号(device id)及销售商号(vendor
     id),配置空间偏移量为00h,用于对各pci设备的区分和查找。为了保证其唯一性,vendor
     id应当向pci特别兴趣小组(pci sig)申请而得到。
     (2)pci基地址(pci base address),配置空间偏移量为10~24h,设备通过设定可读写的高位数值来向操作系统指示所需资源空间的大小。比如,某设备需要64k字节的内存空间,可以将配置空间的某基地址寄存器的高16位设成可读写的,而将低16位置为0(只可读)。操作系统在建立时,先向所有位写1,实际上只有高16位被接收而被置成了1,低16位仍为0.这样操作系统读取该寄存器时,返回值为ffff0000h,据此操作系统可以断定其需要的空间大小是64k字节,然后分配一段空闲的内存空间并向该寄存器的高16位填写其地址。
     其它可能与编程有关的配置空间的定义及地址请参阅参考文献[1]。
     由于pc-at兼容系统cpu只有内存和i/o两种空间,没有专用的配置空间,pci协议规定利用特定的i/o空间操作驱动pci桥路转换成配置空间的操作。目前存在两种转换机制,即配置机制1#和配置机制2#。配置机制2#在新的设计中将不再被采用,新的设计应使用配置机制1#来产生配置空间的物理操作。这种机制使用了两个特定的32位i/o空间,即cf8h和cfch。这两个空间对应于pci桥路的两个寄存器,当桥路看到cpu在局部总线对这两个i/o空间进行双字操作时,就将该i/o操作转变为pci总线的配置操作。寄存器cf8h用于产生配置空间的地址(config-address),寄存器cfch用于保存配置空间的读写数据(config-data)。
     配置空间地址寄存器的格式如图1。
     cf8h(局部总线):
     当cpu发出对i/o空间cfch的操作时,pci桥
     李 刚 吴彦鸿
    
     来源:《电子技术应用》
     摘要:通过对pci协议配置机制的分析,提出一种直接用i/o命令访问pci总线设备配置空间的方法,给出了相应的c语言程序,并在实际应用中得到验证,从而在大多数情况下避免了复杂的驱动程序开发。
    
    
     关键词:pci总线
     配置空间 操作系统
     pci总线推出以来,以其独有的特性受到众多厂商的青睐,已经成为计算机扩展总线的主流。目前,国内的许多技术人员已经具备开发pci总线接口设备的能力。但是pci总线的编程技术,也就是对pci总线设备的操作技术,一直是一件让技术人员感到头疼的事情。pci总线编程的核心技术是对相应板卡配置空间的理解和访问。一般软件编程人员基于对硬件设备原理的生疏,很难理解并操作配置空间,希望硬件开发人员直接告诉他们怎样操作;而pci总线硬件开发人员虽深刻地理解了其意义,在没有太多编程经验地前提下,也难于轻易地操作pci板卡。结果大多是硬件技术人员花费大量时间和精力去学习ddk、windrver等驱动程序开发软件。
     作者在开发pci总线接口设备时,经过对pci总线协议的深入研究,从协议本身的角度出发,找到一种方面而快捷的pci配置空间操作方法,只使用简单的i/o命令即可找到特定的pci总线设备并对其所有的配置空间进行读写操作。一旦读得其配置空间的内容,即可中得到担任系统对该pci总线设备的资源分配。
     1 pci总线配置空间及配置机制
     为避免各pci设备在资源的占用上发生冲突,pci总线采用即插即用协议。即在系统建立时由操作系统按照各设备的要求统一分配资源,资源分配的信息由系统写入各pci设备的配置空间寄存器,并在操作系统内部备份。各pci设备有其独自的配置空间,设计者通过对积压设备(或插槽)的isdel引脚的驱动区分不同设备的配置空间。配置空间的前64个字节称为配置空间的预定自区,它对每个设备都具有相同的定义且必须被支持;共后的空间称为设备关联区,由设备制造商根据需要定义。与编程有关的配置空间信息主要有:
     (1)设备号(device id)及销售商号(vendor
     id),配置空间偏移量为00h,用于对各pci设备的区分和查找。为了保证其唯一性,vendor
     id应当向pci特别兴趣小组(pci sig)申请而得到。
     (2)pci基地址(pci base address),配置空间偏移量为10~24h,设备通过设定可读写的高位数值来向操作系统指示所需资源空间的大小。比如,某设备需要64k字节的内存空间,可以将配置空间的某基地址寄存器的高16位设成可读写的,而将低16位置为0(只可读)。操作系统在建立时,先向所有位写1,实际上只有高16位被接收而被置成了1,低16位仍为0.这样操作系统读取该寄存器时,返回值为ffff0000h,据此操作系统可以断定其需要的空间大小是64k字节,然后分配一段空闲的内存空间并向该寄存器的高16位填写其地址。
     其它可能与编程有关的配置空间的定义及地址请参阅参考文献[1]。
     由于pc-at兼容系统cpu只有内存和i/o两种空间,没有专用的配置空间,pci协议规定利用特定的i/o空间操作驱动pci桥路转换成配置空间的操作。目前存在两种转换机制,即配置机制1#和配置机制2#。配置机制2#在新的设计中将不再被采用,新的设计应使用配置机制1#来产生配置空间的物理操作。这种机制使用了两个特定的32位i/o空间,即cf8h和cfch。这两个空间对应于pci桥路的两个寄存器,当桥路看到cpu在局部总线对这两个i/o空间进行双字操作时,就将该i/o操作转变为pci总线的配置操作。寄存器cf8h用于产生配置空间的地址(config-address),寄存器cfch用于保存配置空间的读写数据(config-data)。
     配置空间地址寄存器的格式如图1。
     cf8h(局部总线):
     当cpu发出对i/o空间cfch的操作时,pci桥