- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PCI总线的扫描流程
PCI 总线的扫描流程
从开始到现在,与 PCI 总线已经相处很长一段时间了,以前从来没有认真的去分析一
下它的扫描过程,只知道这个流程是标准的规范的,今天趁自己的时间比较充足,那就在这
里好好的总结一下,本人认定决定以及肯定的会对大家认真负责滴,不会像两会的代表们一
样只会睡觉举手。为了能够更贴近实践,so 本文会结合代码讲述分析PCI 扫描的整个流程,:
PCI/ PCIX/ PCIE 简介
在跟踪代码之前我们首先要介绍三个家伙:PCI,PCIX ,PCIE ,这三位出场的时间不同,
就像 iphone 的产品一样,每个时间都会有最好的产品应运而生,但是在不同的时代都是当
时的主角,就现在而言PCIE 无疑是最闪亮的主角。但是它们都是为了处理器与外设之间的
交互更加方便快捷而规定的总线规范。三者最大的区别是 PCI/PCIX 数据为并行传输,PCI
数据线宽度为32 位,可扩充为64 位,PCIX 为64 位,而PICE 为差分信号的串行传输。
PCI/PCIX 同一时刻只能一个设备传输,而PCIE 为点对点的传输方式,每个设备都会有自己
独立的传输通道,互不影响。
PCI 总线频率为33M 或66M,带宽为33MHz*32bit/8 = 133MB/s
PCIX 总线分为66M,100M,133M 三种,总带宽提升至1.066GB/s。PCIX 在历史潮流上并
没有占据多久的时间,因为PCIE 得横空出世。
PCIE 为点对点的传输方式,PCI Express 带宽 (双向传输模式) :
1 lane - x1 :500MB/s
4 lane - x4 :2GB/s (2000MB/s)
8 lane - x8 :4GB/s (4000MB/s)
16 lane - x16 :8GB/s (8000MB/s)
PCI/PCIE 设备扫描过程
准备工作
作为设备驱动开发者,我更加感兴趣的是PCI 设备的是如何初始化的,是如何建立cpu
与PCI/PCIE 设备之间访问关系的。好了,现在就我们一起开始探索的旅程吧。
环境:MIPS 体系 XLP832 处理器
Linux2.6.32 操作系统
uboot
其实PCI 扫描已经有很规范的代码和流程了,我在这里只是配合代码去分析一下流程。
首先我们需要明白几个概念:CPU 空间,PCI 空间(配置空间,MEM 空间,IO 空间)
CPU 空间主要分为存储空间(内存,flash 空间等)和IO 空间。这里我就不解释三者之间的
区别了吧,统一寻址空间的不同分配而已。
PCI 的IO 空间就是将PCI 设备的存储空间映射到CPU 的IO 空间,这样访问系统IO 空间
第1 页
就可以得到PCI 存储空间的内容
PCI 的MEM 空间就是将PCI 设备的存储空间映射到CPU 的存储空间,这样访问系统内存
就可以得到PCI 存储空间的内容。
PCI 配置空间:每个设备都有自己的配置空间,PCI 设备配置空间为256 字节,PCIE 扩展
至4k 字节,配置空间为小字节序,即低地址存放低字节,高地址存放高字节。这里很多寄
存器的内容是由PCI 设备厂商配置的,可以参看PCI 配置空间寄存器的详细介绍。
对于嵌入式系统来说,所有的PCI 设备在boot 阶段就已经扫描完成了,当然内核在初
始化的时候也就是我们的 do_initcalls 会重新进行扫描,但是扫描流程是一样的,因此我们
就先从boot 开始吧。
UBOOT 的PCI 扫描
pci_init_board()是进行pci 扫描的起始函数,这个函数中会用到几个重要的结构体:
struct pci_controller {
struct pci_controller *next;
int first_busno;
int last_busno;
volatile unsigned int *cfg_addr;
volatile unsigned char *cfg_data;
struct pci_region regions[MAX_PCI_REGIONS];
int region_count;
struct pci_config_table *config_table;
vo
文档评论(0)