没有合适的资源?快使用搜索试试~ 我知道了~
Linux内核PCI代码分析.doc
4星 · 超过85%的资源 需积分: 11 153 下载量 121 浏览量
2011-04-10
18:15:52
上传
评论 7
收藏 605KB DOC 举报
温馨提示
试读
64页
Linux 内核PCI设备 linux 2.6.23-PCI总线枚举源代码分析 linux设备驱动之pci设备的中断请求 linux设备驱动之pci设备的驱动架构
资源推荐
资源详情
资源评论
Linux 内核 PCI 设备
本文介绍了的基本概念,并从内核的角度出发,介绍了设备的初始化
以及配置。
1.PCI 介绍
随着计算机应用的不断更新和发展(比如百兆网卡、视屏流等),计算机内数据传输
的带宽要求越来越高,传统内部总线带宽已经远远不能满足这些应用的需要,因此人们推
出了总线标准。
是的缩写,它因为高性能、低成本以及良好的
扩展性而在计算机系统中被广泛使用。上至服务器,下至嵌入式设备都能找到它的身影。
图显示了一个标准总线的组织结构图。
图 1. 标准 PCI 总线的组织结构图
从图中我们可以看出总线架构主要被分成三部分:
设备。符合总线标准的设备就被称为设备,总线架构中可以包含
多个设备。图中的、都是一个设备。设备同时也分为主设
备和目标设备两种,主设备是一次访问操作的发起者,而目标设备则是被访问者。
总线。总线在系统中可以有多条,类似于树状结构进行扩展,每条总
线都可以连接多个设备桥。上图中有两条总线。
桥。当一条总线的承载量不够时,可以用新的总线进行扩展,而
桥则是连接总线之间的纽带。图中的桥有两个,一个桥用来连接处理器、
内存以及总线,而另外一条则用来连接另一条总线。
2.PCI 总线操作
总线操作表示主设备向目标设备所发起的操作请求,最多有 种类型。主要类型
有:方式读写,方式读写, !方式读写等。
PCI 配置空间
对于软件开发者来说,该如何对设备进行编程呢?总线标准中定义了一套配
置空间寄存器用于读取或者设置设备的信息。每个设备桥都有自己的配置空间寄
存器。
配置空间共有 " 字节,设备类型不同,其配置空间的布局也不尽相同。设备类型的
区分可以通过配置空间内的#$寄存器(%&)进行,该寄存器值为%%表示当前
设备是一个设备,%表示当前设备是一个桥。
配置空间的前 ' 字节是配置空间起始段,它对于每种类型的设备都是相同的。显示了
设备的配置空间起始段。
图 2. PCI 设备的配置空间起始段
图显示了桥的配置空间起始段。
图 3. PCI 桥的配置空间起始段
配置空间寄存器有些是只读的,有些是可写的,下面介绍几个在编程时会用到的寄存
器。()!* 中有定义+
,-,和.,寄存器
这两个寄存器分别存放了设备信息和厂商信息(值在%%%%%和%////之间,但不能
取%////),因此软件开发者可以通过读取这两个寄存器的值,并与%////比较,从而
判断当前设备是否有效。
和0*寄存器
寄存器存放了设备的配置信息,比如是否允许方式的总线操作、
是否为主设备等。0*寄存器存放了设备的状态信息,比如中断状态、错误状态等。
#$寄存器
这个寄存器前面曾经提过,它定义了设备类型,比如设备、桥等。
'.1***寄存器
这个寄存器有三个作用。)该寄存器存放了访问空间的起始地址。)该
寄存器存放了访问空间的大小,这个数据可以通过下面的方式读出:往寄存器
里写%////////;读出寄存器的值,并取反;将上一步的值加上 后就是该空间的大小。
)该寄存器定义了这段地址空间的访问类型(方式还是方式)。
设备最多有 个1***寄存器,而桥最多有 个1***寄存器。
"021*2,01*2和1*2寄存器
这三个寄存器只在桥配置空间中存在,因为桥会连接两条总线,上行的
总线被称为1*,下行的总线被称为01*,1*2和
01*2寄存器分别存储了上行和下行总线的编号,而021*
2寄存器则是存储了当前桥所能直接或者间接访问到的总线的最大编号。
厂商标识(. +
用来唯一标识 设备生产厂家的数值。,! 的 厂商标识为 %% 而
的为 %3%3。
设备标识(,- +
用来唯一标识设备的数值。,!' 快速以太设备的设备标识为 %%%%4。
状态(0*+
此域提供 标准定义中此设备的状态信息。
命令(+
通过对此域的写可以控制此设备,如允许设备访问 内存。
分类代码(**+
此域标识本设备的类型。对于每种类型的视频,00 等设备都有标准的分类代码。
如 00 设备分类代码为 %%%%。
基地址寄存器(1***5!**+
这些寄存器用来决定和分配此设备可以使用的 与 内存空间的类型,数
量及位置。
中断引脚(+
卡上的四个物理引脚可以将中断信号从插卡上带到 总线上。这四个引脚标
准的标记分别为 、1、 及 ,。中断引脚域描叙此 设备使用的引脚号。通常
特定设备都是采用硬连接方式。这也是系统启动时,设备总使用相同中断引脚的原
因。中断处理子系统用它来管理来自该设备的中断。
中断连线(+
本设备配置头中的中断连线域用来在 初始化代码、设备驱动以及 中断处
理子系统间传递中断处理过程。虽然本域中记录的这个数值对于设备驱动毫无意义
但是它可以将中断处理过程从 卡上正确路由到 操作系统中相应的设备驱
动中断处理代码中。
对配置寄存器读写的底层函数
-**中有几个底层函数,这些函数通过寄存器%/3和%/读写目标设
备上的配置寄存器对配置寄存器的读写可以按字节,按位字,按位长字的读写。
6 ))5&,(*788+)2*)) !)66*7(*)2*92*8
*!- 8*89-+
6 )):5$&(*788+)2*);) !)66*7(*)2*
92*8*!- 8*89-+
))5&,(2838+
))5&,(;88+
))5&,(;88'+
)):5$&(2838+
)):5$&(;88+
)):5$&(;88'+
3.PPC 对于 PCI 的支持
通常会提供一个(或更多的)控制器来连接总线,通过控制器,
<可以发起 !读写操作来访问所连接的所有设备桥的配置空间。每个
设备桥都会用(总线号,设备号,功能号)这一组合来进行编号,因此在控制器
中输入设备对应的(总线号,设备号,功能号)就能寻址到具体的 设备桥。以
3"'3为例,它提供了两个寄存器来实现 !操作,分别是/=),,5和
/=),$寄存器,如果想对某个设备发起读写操作,则首先将该设备的(总线号,设备
号,功能号)写入/=),,5中,这代表寻址一个具体的设备,同时在/=),,5
中写入需要操作的配置空间寄存器的编号,最后从/=),$中读取写入相应的数据即
可。
Linux 内核对 PCI 的支持
内核(版本)在初始化之初就对所有设备进行了扫描并且配制,具体操
作分为下面几个步骤。
编译时的 PCI 配制
如果想要内核支持,首先需要对其配制文件进行相应的修改,在 !文件中
需要配置下面的宏参数。
提供了配制全局控制宏参数/=),它控制着控制器和设备
是否能够被配制的流程,因此该宏值需要被设置成“>?。
对于某些处理器来说,比如3"@@、3@@等,它们提供了两个或者更多的
控制器,因此在 !文件中专门提供了诸如
/=)3")、/=)3)等宏参数,它们控制着第二个
(或更多的)控制器的配置流程,因此如果需要使用第二个(或更多的)
控制器时,需要将相应的宏值设置成“>?。
在编译内核之前,如果在 !文件中提供了以上宏参数的设置,则编译出来的内核
映像提供了对于支持的功能。
4.PCI 相关数据结构
提供了三类数据结构用以描述控制器、设备以及总线。
PCI 控制器
控制器用)结构来描述,它有以下几个主要的属性:
:该属性标志控制器的编号。
:该属性指向下一个控制器,通过属性,控制器可以形成一个单
向链表。
*)2*:该属性标志了连接在该控制器上第一条总线的编号。
*)2*:该属性标志了连接在该控制器上最后一条总线的编号。
*:该属性标志了当前控制器所对应的配制空间读写操作函数。
)*:该属性标志了当前控制器所支持的地址空间。
)*:该属性标志了当前控制器所支持的地址区间。
!):该属性标志了当前控制器发起 !访问方式时所需要写入
的地址空间。
!):该属性标志了当前控制器发起 !访问方式时所需要读写
的数据空间。
2*:该属性标志了当前控制器所连接的总线,它对应的数据结构是
)2*。
PCI 总线
总线用)2*结构来描述,它有以下几个主要的属性:
:可通过该属性索引到上层总线。
* :该属性标志了连接的上行桥(对应的数据结构是)-)。
:该属性标志了总线连接的所有子总线链表。
-*:该属性标志了总线连接的所有设备链表。
*:该属性标志了总线上所有设备的配制空间读写操作函数。
2:该属性标志了当前总线的编号。
:该属性标志了上行总线编号。
*:该属性标志了下行总线编号。
*2:该属性标志了能够访问到的最大总线编号。
*:该属性标志了地址空间。
PCI 设备
设备用)-结构来描述,它有以下几个主要的属性:
!2)*:定义了一个全局列表来索引所有的设备,该属性标志了这个
全局列表的首指针。
2*:该属性标志了当前设备所在的总线(对应的数据结构是)2*)。
- :该属性标志了设备编号和功能编号。
-:该属性标志了供应商编号。
剩余63页未读,继续阅读
zyrtnt
- 粉丝: 2
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页