aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2768回复:2

原创,驱动程序员所要知道的硬件--PCI篇

楼主#
更多 发布于:2004-05-11 22:17
这篇文章可能比较乱,而且简略,毕竟我不是写书的料,不过还是希望能给人以帮助


所有这些都不是很明确,最好还是可以看看相关规范。

PCI标准,包括PCI32和未来的PCIExpress,对于软件来说比ISA标准采用了更多的软件处理。下面仅仅是我个人的一些经验,并不代表看了下面的东西就可以停止硬件知识的学习。另外,我接触硬件的时间很短,范围也局限于软件的应用,思想上更是软件开路,所以有什么不足之处,还请各位指正、补充。

下面的内容适合于现在的PCI规范,也适合于未来的PCIExpress规范。
PCI规范中,对于软件的规定有详细的说明。其中最重要的部分是三个空间,如果更向底层就要知道两个端口和通讯的协议,但是这些已经在大部分的操作系统中封装好了所以大多数的软件人员可以不必关心。
那么就来看看这三个空间。内存空间和I/O空间是用于软件操作的,通过这两个空间可以访问PCI的本地总线。这些空间的起始地址通常由配置空间(后面提到)所存储的基地址决定。内存空间的访问就好像是对普通内存的访问,I/O空间的访问则好像是访问端口。这两个空间相对简单,可以分别理解为一段内存和一段端口地址。
对于软件来说,最复杂的还是PCI的配置空间。配置空间中存储了设备标识、厂商标识、基地址、中断号等信息,所有的这些信息都是对软件有用的。这里仅仅简单说明一下厂商标识、设备标识、基地址、中断号这四个内容,其他的如总线控制、命令字、延迟时间等暂时不考虑。
厂商标识、设备标识唯一决定了一块设备。每一个生产PCI设备的厂商(除去某些不法厂商或者仿制者)都会有唯一的标识,而每一种类型的设备也会有唯一的标识。例如Intel的标识是8086,显卡的标识是0001(记不太清了)。通过这个标识就可以根据PCI规范找到该设备。而对于系统中存在多个相同设备的情况,可以另外加一个索引号来查找设备。
基地址的作用是指明本地总线在系统中的映射。基地址的最后一位指明了该段基地址是内存基地址还是I/O基地址。中断号则指明了当前设备使用的那一个中断。
提到PCI总线就一定会提到PCI桥。如果要挂更多的设备就要用PCI桥来扩展总线。通常使用的PCI桥是Intel的21150。不过程序员不用关心桥的存在,因为他是透明的,可以认为它不存在。挂接了桥之后,总线号就由0变到1,挂在这个总线上的设备就是在一号总线上。在PCI的规范中,使用总线号、设备号、功能号可以标识唯一的一个设备。通常南北桥结构的微机中,系统的主要设备AGP显卡、南桥等都是挂在0号总线上的。
上面是规范的内容,下面是在计算机中操作pci设备?
首先是初始化。在硬件的设计中,配置空间的大部分内容已被写好,但是基地址的32位以上部分、中断号等还是根据系统的不同而不同。在x86系统引导时,bios完成了pci设备的初始化工作,包括为每一个设备分配一个与其它设备不重复的基地址。而中断号是由硬件的插槽位置决定的,也就是有硬件接线决定的。
在操作系统引导之后,有些系统会重新对PCI总线上的设备初始化,而有些系统则不作任何初始化工作。
然后就是驱动的工作了。驱动首先要查找到所支持的设备,并进行设备的初始化。然后(或者在初始化之前)挂接中断。设备产生中断之后进行相应的处理。
最后看一下中断复用。PCI设备的中断不象ISA设备,PCI设备是中断复用的,所谓复用就是指多个设备使用同一个中断。软件支持复用无非是对每一个可能产生中断的设备进行查询,而操作系统中恰恰就是这么做的。以VxWorks为例,操作系统中对于每一个PCI中断(共4个)都挂接了一个中断服务程序(使用intconnect挂接的),这些中断服务程序的作用就是来了中断之后遍历一个链表,这个链表就是所有该中断上PCI设备的服务程序(这就是为什么PCI设备的中断要用pciintconnect来挂接)。当用户使用pciintconnect时,系统会将这个处理程序的指针加到相应列表中去,而使用pciintdisconnect则会将其从链表中删除。当某一个设备来中断之后,pci中断处理程序会挨个调用链表中的程序,而链表中的服务程序则判断是不是自己的设备来的中断,并进行相应处理。
。。。。。
大约就这些吧,有什么遗漏或不明之处还请各位指出。


[编辑 -  5/13/04 by  aquariuscamus]
我的邮件地址:hwybird@sohu。com,两三天看一次
wuqingtao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-22
  • 最后登录2004-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-13 17:48
写的太好了!
我有一问:能不能具体解释一下PCI总线是怎么分配device no 和 function no的,同时,PCI设备的位置号(UI Number)又是怎么分配的?
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-13 21:07
根据PCI的规范,总线号可以是0到255,从CPU端出来的总线是第0号,接下来通过一个桥接芯片就变成第一号,以此类推。
每条总线上可以挂接0到255个设备(这里对上文更正一下),但是通常情况下只挂四个。
每个设备可以提供0到255种功能,根据设备而定,一般的来说会只有一个,而多媒体设备,例如BT878或者某些声卡都有多个功能。

总线号、设备号、功能号都是硬件连接定义的,软件开发仅仅用来标识一个设备,可以不关心,至于位置号我没有听说过,可能是说法不太相同。在LINUX下倒是将三个号组合在一起形成一个标识。
我的邮件地址:hwybird@sohu。com,两三天看一次
游客

返回顶部