加载中…
个人资料
散人
散人
  • 博客等级:
  • 博客积分:0
  • 博客访问:15,610
  • 关注人气:4
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

2.2 PCI探索之序二

(2011-01-04 16:58:35)

广告时间:

   PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置空间则由Linux内核中的PCI初始化代码使用。内核在启动时负责对所有PCI设备进行初始化,配置好所有的PCI设备,包括中断号以及I/O基址,并在文件/proc/pci中列出所有找到的PCI设备(需要配置CONFIG_PROC_FS),以及这些设备的参数和属性.

  每种外设都是通过读写寄存器来进行控制。在硬件层,内存区和 I/O 区域没有概念上的区别: 它们都是通过向在地址总线和控制总线发出电平信号来进行访问,再通过数据总线读写数据。因为外设要与I\O总线匹配,而大部分流行的 I/O 总线是基于个人计算机模型(主要是 x86 家族:它为读和写 I/O 端口提供了独立的线路和特殊的 CPU 指令),所以即便那些没有单独I/O 端口地址空间的处理器,在访问外设时也要模拟成读写I\O端口。这一功能通常由外围芯片组(PC 中的南北桥)或 CPU 中的附加电路实现(嵌入式中的方法).

 

   上一节讲到access.c里面的访问配置寄存器 , 说到这边干脆说一下啥是配置空间 ,总线是如何操作配置空间的,pci设备的配置空间如下所示.

 

2.2 <wbr>PCI探索之序二
pci总线为用户提供了动态查询pci设备信息的方法. 在x86上,保留了0xCF8~0xCFF的8个寄存器.实际上就是对应地址为0xCF8的32位寄存器和地址为0xCFC的32位寄存器(通过IO访问外设).

在0xCF8寄存中写入要访问设备对应的总线号, 设备号、功能号和寄存器号组成的一个32位数写入0xCF8.然后从0xCFC上就可以取出对应pci设备的信息. 写入到0xCF8寄存器的格式如下:
低八位(0~7):      (寄存器地址)&0xFC.低二位为零
8~10:功能位.      有时候,一个pci设备对应多个功能.将每个功能单元分离出来,对应一个独立的pci device
11~15位:设备号    对应该pci总线上的设备序号
16~23位:总线号    根总线的总线号为0.每遍历到下层总线,总线号+1
31:有效位         如果该位为1.则说明写入的数据有效,否则无效

对于上一节的配置宏里面的出现bus->ops在哪里注册还有待探索.

基本上access.c提供了一个通过IO访问完成对配置空间读写的接口.

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有