分享

几个搞了好久才明白的pci驱动基本知识点

 clover_xian 2012-05-03
几个搞了好久才明白的pci驱动基本知识点
2008-03-17 10:42

接手pci驱动已经好久了,可是长期的惰性真的很难改掉,每天工作时间算算居然不足半小时!

老板不来实验室了,我就闲中更闲,kill the precious time...

其实,框架我已经都搭好了,只是停留在设备地址和总线地址的解析上。非常想弄清楚,所谓的pci配置空间,究竟是在pci总线上,还是在pci芯片卡上?现在我觉得,这个问题好像很傻冒,把总线搞的和硬件一样了。总线难道也有寄存器么?所谓总线支持的空间,应该是总线能寻址的pc上的存储空间把!pci总线支持存储器地址空间,io地址空间和配置空间。那这个配置空间应该也是pc上的一块存储区,通过pci总线能访问而已。

cy师兄说做驱动其实不需要担心这些问题,只要把数据按照基址+偏移传下去或传上来就行。可是我总纠结于哪个寄存器、哪块地址空间具体在什么位置。。。都是自己没做过硬件,对系统结构的知识也忘得差不多了:( 我还是想弄清楚的!

好不容易明白了一些东西:

1、pci芯片的配置寄存器分为pci配置寄存器pci configuration registers和局部配置寄存器local configuration registers。这个我看pci9054 databook时一直以为local configuration registers是说dsp上的寄存器。。。太久没做事情了,这个英文和中文都断点了。。。

2、6个pci bar(0-5),其中bar2-5对应4个局部空间0-3,再加上外部rom,pci总线可以访问5个局部地址空间。一个4个寄存器集合定义了每个空间和空间的特性:

pci bar

局部范围local range

局部基地址local base address

局部总线区域描述符local bus region descriptor(指定了局部总线特性,如总线宽度,猝发,预取,和几个等待状态)

3、seeprom不能访问pci bar,seeprom可访问局部配置寄存器,bar是主机bios动态分配的。

4、PCI初始化软件:PCI主机总线初始化软件通过写PCI Base Address Register写全1然后,读回一个值来决定请求的地址空间。PCI9054在不需要的地址位返回0,来指定请求的地址空间。PCI软件(不是驱动,也不是应用程序,是pci的系统软件)通过编程PCI Base Address Register来映射局部地址空间到PCI地址空间。

例如:一个IMB局部地址空间02300000h023FFFFFHLLPCI总线的PCI地址78900000h789FFFFFH来访问。

1. SEEPROM按如下方式设置范围和Local Base Address Register

范围=FFF00000h1MB,译码高PCI地址的高12位)

局部地址(重映射)=023xxxxxh(对于PCI到局部的局部基地址访问)

2. PCI初始化软件写全1PCI基地址寄存器,然后读取返回值。PCI9052返回一个FFF00000HPCI软件写PCI基地址寄存器:

PCI基地址=789xxxxxhPCI基地址用来访问局部地址空间)

5、pci是小端

还是模糊的:

1、pci总线配置空间大小256字节,这个是说每个pci设备在pci总线配置空间分配的都有256把

2、bar0、bar1是指向全部的内存、io空间么?bar2-5是刚开始就指定了地址?那怎么确定哪个是在io哪个是在内存?我又怎么使用呢?

3、pci配置寄存器和局部配置寄存器是否只能由seeprom和pci总线访问?我的驱动能够读写么?是不是可以通过irp来读,但是不能改写?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多