免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7191 | 回复: 11
打印 上一主题 下一主题

关于pci 配置寄存器组 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-28 15:07 |只看该作者 |倒序浏览
UHCI 的配置寄存器组已经在总线枚举时被设置!有一点不明!如图所示!

而在 UHCI spec 中:

为什么两个图中的某个寄存器对应不上!例如:上图中 0x0h处 寄存器保存的是 vendor id,而在下图中
0x0h 表示的是 UHCI 的命令寄存器?
这难道不冲突吗?

论坛徽章:
0
2 [报告]
发表于 2010-11-28 15:19 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2010-11-29 13:31 |只看该作者
回复 2# epegasus


    这么理解您看对吗?
   PCI spec 规定 每个PCI 设备必须都得有配置寄存器组(即所有的设备厂商必须按照规定生产设备)!配置寄存器组中有6个Base Address Registers 用于映射设备的总线地址!而对于UHCI 却只有一个 即0x20-0x23 处,表示此 BAR寄存器在配置寄存器组中的偏移!此寄存器存放着UHCI 被映射到 I/O space 的地址 即总线地址!此时cpu 可直接通过out /in 等指令来访问UHCI 中的寄存器!(在总线枚举时由于cpu 不知道设备的总线地址,以及pci-bridge 的窗口没有被设置,所以只能通过 host bridge 向设备的配置寄存器组中写入数据)! 若用 base 表示 UHCI 的总线地址,addr 表示UHCI 中寄存器的偏移,那么 inw(base + addr) 就表示读取 UHCI 中配置寄存器组中的偏移为 addr 的寄存器的值!
这么理解不知道对不对!请大侠指正!谢谢!

论坛徽章:
0
4 [报告]
发表于 2010-11-29 14:07 |只看该作者
基本上是这样.不过有几点是可变更的.
>>此寄存器存放着UHCI 被映射到 I/O space 的地址 即总线地址!
配置寄存器用法PCI规范上有.BAR就是PCI设备内存在PCI总线或物理地址中的偏移.
对于X86还有个IO地址空间.是和物理地址并行的地址空间.PCI同时也支持.也就是PCI总线地址空间本来就有2个空间. 但是通常只把设备内存分配到物理地址空间而把IO地址空间不使用

>>所以只能通过 host bridge 向设备的配置寄存器组中写入数据
这句话中要特别标明设备是指PCI总线设备.配置寄存器组也是PCI总线设备配置寄存器组


>>若用 base 表示 UHCI 的总线地址,addr 表示UHCI 中寄存器的偏移,那么 inw(base + addr) 就表示读取 UHCI 中配置寄存器组中的偏移为 addr 的寄存器的值!
这里必须强调"总线地址"PCI总线.而不是USB总线.
这里的"UHCI 中配置寄存器组"其实就是上面所说的PCI设备的内存.
--另外这条的理解不一定和实现完全一致. UHCI不是总线. 而是个控制器. 如果它作为一个PCI设备,则可以按上理解.有时候它并不以一个PCI设备出现.而可能直接就是集成在北桥或南桥中.这个时候它的控制寄存器组就直接呈现在物理地址空间.于是省略掉了前面的PCI配置过程. 可以直接访问了.

论坛徽章:
0
5 [报告]
发表于 2010-11-29 16:04 |只看该作者
回复 4# epegasus


    谢谢您的讲解!还有一处不明!
   对于 UHCI 来说 假设其 pci 总线地址为 base ! 那么 base+0x00 是否对应配置寄存器组中的 vendor id 呢?
   在 uhci spec 上说:
   
    表示对于UHCI 在I/O space 的地址 base + 0x00 对应的是 UHCI 的命令寄存器!
   请问这怎么理解?

论坛徽章:
0
6 [报告]
发表于 2010-11-29 17:04 |只看该作者
回复 5# zd零


    建议你把那个帖子再读读.

UHCI 的配置寄存器组 和 PCI设备配置空间根本就是2个东西
这里你可以把前者看成PCI设备上的内存
BAR和上面的base根本就是2个东西. 因为在BAR寄存器里写入了下面这个base 所以你可以直接在物理内存中访问base里面的值.

PCI的BAR本身也不是你能直接访问的.你要通过PCI配置空间寻址间接访问.
BAR是个寄存器,不是地址

论坛徽章:
0
7 [报告]
发表于 2010-11-30 10:16 |只看该作者
回复 6# epegasus

    以下是我根据您的讲解和帖子还有uchi spec 自己的一点理解!不是是否到位,请指点!谢谢!

    PCI 设备的配置寄存器组中的 BAR 寄存器在总线枚举时被设置!对于UCHI:BAR 中存放着 UHCI 在在总线上的地址!
有了此地址(base)cpu 就可以直接访问 UHCI 的 I/O registers!(UHCI 设备上的内存)
inw(base + 0x00) 指令直接访问 UHCI 的 I/O registers
如图:



PCI 设备的配置空间寄存器,基本上只用在总线枚举过程中,当由 BIOS 或者 Linux kernel 向 PCI 设备的配置空间中 BAR 寄存器写入总线地址(base)后!CPU 就可访问

到 UCHI 的 I/O registers!(如上图)!而此时PCI 设备的配置空间对于CPU 来说已经没什么用了(只起到片选的作用),如果我们现在要访问 PCI 设备的配置寄存器组中寄存器的话,只能通过host

bridge 来访问(向 host bridge 中写入一个综合地址)!例如调用 pci_read_config_word()函数!

至于这个base 对应到 UHCI 中的哪个位置由UHCI 完成这个映射!

说明:
对于任何一个PCI 设备 其内部都有 I/O 寄存器          ----> 由cpu 直接访问
                                    PCI 配置寄存器      ----> host bridge 直接访问

如果要对UHCI 进行编程 只是对其内部的 I/O registers 进行读写数据!

论坛徽章:
0
8 [报告]
发表于 2010-11-30 11:44 |只看该作者
是这样.上面说是2个帖子.第2个发错了.
http://linux.chinaunix.net/bbs/thread-985872-1-1.html

论坛徽章:
0
9 [报告]
发表于 2010-11-30 12:23 |只看该作者
回复 8# epegasus


    <pci系统体系> 您有电子版的吗?有的话能否发给我一份呢?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2010-11-30 13:10 |只看该作者
回复 1# zd零


    这哥们头像太有创意了 ,我等到星期天,也搞个有创意的头像来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP