PCI总线的扫描流程.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

dajuhyy + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档