在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
EETOP诚邀模拟IC相关培训讲师 创芯人才网--重磅上线啦!
查看: 9484|回复: 29

pci老问题,还是不清楚。

[复制链接]
发表于 2003-11-15 17:41:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
如果是pc端的pci设备配置的大概过程:
1  把 busnumber,device number,function number ,doubleword写到配置地址端口(0cf8h--0cfbh),并设置势能位为1。 这里的doubleword是标识在目标功能的配置空间的目标双字(不太清楚到底是什么东东)
2  从配置数据端口执行单字节,双字节或四字节io读或写到该端口(这句是什么意思?配置数据端口0cfch--0cffh)
还有个强制性的首部寄存器。它里面的内容是不是有一些是固定的,不能改变。 而base address 0-5的值,是bios分配的么? 其他的内容呢? 是不是要知道base address 0 才能够配置这里的寄存器。把这个寄存器配置完,是不是pci的配置就算完成了。

重要的是,如果是嵌入式的,以上这些步骤是不是需要自己写程序来完成? 那样的话,怎么才能得到base address 0。

pnp是不是有帮助。通过查找pnp能够得到base address 0。但我又不清楚了,pci都没配置,哪来的base address 0 呢????
发表于 2003-11-17 15:04:40 | 显示全部楼层

pci老问题,还是不清楚。

    1.目标双字的内容找本PCI的书,看看“配置空间”那章;
    cf8 cfb 是实现配置读写的方法,通过向这两个寄存器写数据,可以在PCI总线上产生配置读,配置写的时序;(c/be="1010" "1011")
    2.配置空间定义了某些值可以改变,某些值不可改变;
    可能有第三方的工具支持查找这些信息,不过最好自己完成;
   
建议还是看看书,推荐《PCI总线与多媒体计算机》电子工业出版社 曾繁泰 冯保初 著,重点推荐第四章“配置空间”;
 楼主| 发表于 2003-11-17 16:37:11 | 显示全部楼层

pci老问题,还是不清楚。

1.目标双字的内容找本PCI的书,看看“配置空间”那章;
   我看了看,可能是因为是新人,刚做这个有些东西还不太明白。pci设备有的配置寄存器,而这个配置寄存器可能放到配置空间中,也可能是io空间还有可能是存储器空间。 而上面提到的这个标识在目标功能的配置空间的目标双字(doubleword),是在配置空间的中的双字,书中并没有说到底哪个双字呀? 还是说任何一个双字都可以!
   不知道我理解的对不对? 那这个双字就是配置寄存器中的一个双字了?
   菜鸟一个,望高手多多指教。书上有些东西还看不太明白。
 楼主| 发表于 2003-11-17 16:52:32 | 显示全部楼层

pci老问题,还是不清楚。

2.配置空间定义了某些值可以改变,某些值不可改变;
  不知道我上面说的配置空间和配置寄存器之间的关系说的对不对。这里你说配置空间定义了值是否能够改变,但我不明白“从配置数据端口执行单字节,双字节或四字节io读或写到该端口”这个数据端口中的数据是什么? 唉,可能我表达的有问题。不知道各位是否明白。
  
  简单说:
  地址端口提供要配置的地址
  数据端口提供的是要配置的数据么? 不应该,那它提供的是什么东西?
  
发表于 2003-11-18 12:28:32 | 显示全部楼层

pci老问题,还是不清楚。

你不明白的那句话我也不明白,不过空间关系是很简单的,
对于主控器来说,有3个空间----配置空间/io空间/memory空间
主控器最开始只能访问配置空间,那里记载了io空间和memory空间的基地址,
主控器也可以通过向配置空间的io/memory基地址寄存器写一个数据作为空间的新地址
来人为的配置基地址。
基地址寄存器是32位,不知道和你的“双字”有没关系。
发表于 2003-11-18 16:12:05 | 显示全部楼层

pci老问题,还是不清楚。

[这个贴子最后由caodb在 2003/11/18 04:13pm 第 1 次编辑]

我觉得你还是没有理解“配置空间”的概念;
“配置空间”是每一个PCI设备都要提供的一个64BYTE的寄存器,位于硬件设备中,我对它理解的是这样:
1.告诉系统本硬件的名称,生产厂商,设备类型,版本,是否支持背靠背传输等等信息;
2.告诉系统本硬件所需要IO,中断,MEMERY等资源的数量;
3.接受系统赋予的以上资源的基地址;
配置空间中有些数据是可以改变的,比如设备的IO基地址,有些是不能随便修改的,比如硬件的名称和版本号;
系统通过向cf8 cfc进行操作来读取或者向配置空间写数;
向cf8写数(32bit)是选定对哪个PCI设备的哪个配置寄存器进行操作;然后如果读cfc寄存器,系统将选定的配置寄存器的内容返回(32bit),如果写cfc寄存器(32bit),系统将会把此数据写入相应的配置空间寄存器;
对配置空间进行操作必须以32位为单位来进行,也许就是你所说的“双字”;
 楼主| 发表于 2003-11-19 08:46:53 | 显示全部楼层

pci老问题,还是不清楚。

[这个贴子最后由wdy9927在 2003/11/19 08:48am 第 1 次编辑]

谢谢2位。有点明白了。
今天又看到一个例子觉得对理解这个有帮助。
==================
BOOL findpci(DWORD DeviceVendor,PCIINF *pciinf)
{
DWORD io_cf8;
DWORD io_cfc;
int i;
DWORD buf[16];
io_cf8=0x80000000;
for(;
{
DWORD_OUT(0xcf8,io_cf8);//向0xcf8输出双字 io_cf8
io_cfc=DWORD_IN(0xcfc); //从0xcfc读入双字
if(io_cfc==DeviceVendor)//find  pci9052
{
  for(i=0;i<16;i++)
  {
   DWORD_OUT(0xcf8,io_cf8+4*i);
   buf=DWORD_IN(0xcfc);
  }
  pciinf->VendorID=(WORD)(buf[0]&0xffff);
  pciinf->DeviceID=(WORD)((buf[0]&0xffff0000)/0x10000);
                     。
                     。
                     。
=============================
它这是先把你的pci设备地址给 cf8。然后cfc对应的数据就是cf8地址对应的那个双字(32bit)。如果直接读那就是 VendorID,DeviceID。但如果把offset加上的话那就能取得,象caodb所说的pci设备配置空间的所有的东西。
应该是这样吧。
我开始的时候就是没有搞清楚cfc到底是干什么的。 现在清楚了,可以把cf8对应的数据读出,写入也可以吧。
 楼主| 发表于 2003-11-19 09:05:14 | 显示全部楼层

pci老问题,还是不清楚。

可还有问题。
pci设备配置空间中有io基地址,memory基地址等。 最开始的时候它们是根据eeprom来确定这些基地址的空间,地址么?然后pci主机在根据用eeprom配置的内容来在pci上最后配置他们的基地址。
就是这样
--------------------------
eeprom会在pci卡上电的时候配置82559,主要配置了pci卡的vendorID和deviceID,这是系统用来标识pci卡的,很重要,你的程序就靠这个标识来找到pci卡。还配置了local端的4个space的local基地址和大小
--------------------------
现在假如eeprom已经配置好了io基地址。 pci主机往这个io基地址的寄存器写入0xffffffff,再读出这个值。如果是0,说明这个基地址没有用到,pci不用去管它。如果有值,再根据这个值,就 能得出pci中的基地址,和io空间。
问题是:1 我说的这个对否?是从eeprom先配置这些基地址么?然后pci在根据eeprom配置的值,加工。
        2 往里面写0xffffffff再去读它,为什么还有可能是0,或别的值,我觉得应该就是0xfffffffff呀?! (以前看过哪位说过这个,但找不到了)
      
发表于 2003-11-19 09:27:56 | 显示全部楼层

pci老问题,还是不清楚。

1,对。
2,如果我没记错,应该是用来确定基地址是否允许更改的,
对于有一些设备,这个值是不能被更改的,此时会读出0。
发表于 2003-11-19 10:06:20 | 显示全部楼层

pci老问题,还是不清楚。

这取决于硬件是怎样设计的;
1.在硬件上电时,硬件回给基地址寄存器赋一个初始值,比如0xfc00,同时在配置空间中说明所需要的资源数目(比如需要256个IO端口);
2.在系统(比如win2k)启动时(注意这个时刻要晚于上电),系统会对所有的硬件进行配置,协调所有的硬件设备的资源,如果0xfc00-0xfcff这个IO地址段已经被系统分配给其他硬件,那么系统会分配一个新的IO基地址给硬件(比如0xcd00),这个数将会写入硬件的配置空间寄存器;
3.此时硬件有两种选择:接受或者放弃,某些硬件对基地址有要求,那么它会放弃,而大多数的硬件会接收新的基地址;
4.系统通过再次读取基地址寄存器来判断硬件是否接受了设置,如果硬件放弃,系统会选择一个新的基地址给硬件,重复2-4的过程,注意如果硬件始终不接受的话,系统会提示配置失败;
5.系统启动后,本地程序会读出硬件的基地址,从而对硬件的IO地址进行操作,这是必须判断系统配置是否成功,通常的做法是在硬件的某个IO端口设置一个固定数,如读bas+4,会读出0x12345678,本地程序通过读取此端口来判断系统是否配置硬件成功;如果不成功的话,程序必须对硬件进行手工配置;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-9 22:43 , Processed in 0.032634 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表