为什么任意申请一块cpu中的未用io就可以作为PCI控制寄存器,因为对cpu上所有未使用的空闲io的读写操作,都将被路由到PCI总线,在pci总线上产生地址读写时序[luther.gliethttp]. 1300系统中有一个内部总线,这个总线共4G空间,1300作为主设备时,其空间分为三部分,
第一部分是MMIO(主要是那些特殊的寄存器,比如控制video,audio,和其他iic之类的),
第二部分是物理内存(即板上的SDRAM)。
其余的部分为PCI空间,也就是说,除了MMIO和内存之外,所有的其他访问都会寻址到PCI上去,在PCI总线上产生时序。
如果1300作为从设备挂在主机的PCI总线上时,则会把其物理内存通过PCI配置空间寄存器影射到主机的寻址空间中。
下面该段摘自:http://bbs.driverdevelop.com/read.php?tid-18161.html 很抱歉我这几天没来。我不是做PCI开发的,所以也不是很熟悉。只是有些粗略的概念。关于PCI的MEMORY如何访问,还要看你用的是什么接口芯片,
有的可以通过所映射的内存地址直接访问,
有的则要通过端口访问,
还有的虽然映射到一段内存地址中,
但要通过对相应的地址写命令字才可访问,
也就是说,把内存
地址当端口来操作。你需要看看你所用的借口芯片的资料,还需要测试一下。
老罗很早就提到过这个东西,应该是电子设计课程上面。
当时就看他在黑板上画时序图,实际上不懂。后来因为做jtag卡,用windriver
的时候知道了更多的pci的东西,但是那些BAR0,BAR1还是很模糊。
这次,是必须知道了。我得自己亲自写code在pci总线上把某块特殊的卡找到。
这里,对一些概念稍稍清楚些。
这个对话:
-----------------I asked nickst and hhl-----------------------
1. pci configuration register like vendor id, bar0, bar1,.....
都是在pci卡上的吗?是不是在那个rom里面?
2. pci上的io space, memory space都会被映射到cpu 的memory space,
这个地址通常被bar0, bar1...指定
3. 问题, 一个32位系统,他的pci卡上ram如果有8G,是不是没法访问到?
因为4G空间问题。
(我唯一能想到的是,除非那8G又挂在那个pci卡的某个总线上,通过
某个controller来选择访问)
4. 1300过去内存是挂在什么总线上的?
----------------------------answer-------------------------
nickst 说:
1 PCI 配置空间的寄存器一般都在接口芯片里。即便是有外接的ROM,也是在上电时有PCI接口芯片读入的
2 是
3 我觉得没法访问,除非有controller。
4
1300系统中有一个内部总线,这个总线共4G空间,1300作为主设备时,其空间分为三部分,第一部分是MMIO(主要是那些特殊的寄存器,比如控制video,audio,和其他iic之类的), 第二部分是物理内存(即板上的SDRAM)。其余的部分为PCI空间,也就是说,除了MMIO和内存之外,所有的其他访问都会寻址到PCI上去,在PCI总线上产生时序。 如果1300作为从设备挂在主机的PCI总线上时,则会把其物理内存通过PCI配置空间寄存器影射到主机的寻址空间中。 以上是我的理解,可能有不确切之处。
---------------我说-------------------------------------
恩,大家都是英雄,英雄所见略同
这下觉得清晰了。
-------------------------------------------------------
另外:
我在想,每块pci卡应该都有自己的一个基准地址,这个基准地址不一定是0,
而是相对bar0, bar1,。。。。就是说,在pci configuration header里面
有标准的256bytes, 其中有base address register. 造pci卡的人,他的卡
上面的所有资源寻址都是基于bar的。 这样,无论bar在系统里面是多少,
bar+1永远是pci卡上面的同一个地方。 yeah!!!
阅读(2425) | 评论(0) | 转发(0) |