zhoujian29
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1624回复:8

如果Space0和Space1的配置是一样的,问题就来了

楼主#
更多 发布于:2004-02-12 10:06
如果EEPROM中有两个本地地址空间,Space0和Space1,range和remap和description和CS#的配置都一样,唯一的不同就是Space0是memory空间,Space1是I/O空间(range的最低位为1)。CS0#连一个8bit的SRAM的使能端。CS1#连一个8bit的锁存器的使能端。

请问:假设一下的操作都是输出数据到SRAM或锁存器
1,如果我用memory方式访问Space0,CS0#自然会有效,那CS1#是不是也会同时有效呢?
2,如果问题1成立,那么,我用I/O方式访问Space1,CS1#自然会有效,那CS0#是不是也会同时有效呢?
3,如果问题1和问题2成立,那么,就是说,不论我用memory方式访问Space0,还是用I/O方式访问Space1,其实访问的是同一个地址空间?就是说,写入到SRAM里的数,就是锁存器锁存的数?

zhoujian29
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-12 11:36
关于9052,
1,我个人认为CS0#不仅能指派给space 0,也能派给space 1,只要CS0#的配置能套住space 1就行了。因为datasheet说:For a chip select to assert, the address must be encompassed within a Local Address Space.
2,但是,CS0#能不能同时指派给space 0和space 1呢?
比如,ISA的memory和I/O空间,虽然地址空间不同,但只要memory的空间能涵盖住I/O的空间,那么,指派给memory的CS0#,不仅在memory操作时会有效,同样在I/O操作时,也会有效。
因为在PLX的《PCI 9052RDK-Lite Design Notes Rev. 1.0 June 2003》中说道:
if both ISA memory and ISA I/O are used, CS3# can be programmed to - 2 - 9052-SIL-DN-P0-1.1 Confidential include both Spaces by setting the encoded Range to a high enough power of 2, and the Base Address to a low enough multiple (such as 0) of that range, to include all Local Bus addresses used for both Spaces 0 and 1
3,在非ISA模式(如复用模式)下,当两个space的配置一样(唯一不同是一个是memory方式,一个是I/O方式),而且指向这两个空间的CS0#和CS1#也一样,那么,无论是用memory方式,还是用I/O方式,CS0#和CS1#都将起效,而且,访问的是同一个空间!
zhoujian29
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-12 12:26
1,我在PDC1000上做了实验,目标是一个8155内的存储器。8155的使能仅和CS0#相连。
2,EEPROM数据见PDC1001.eep,把VID改成了10B5以便让PLXmon识别该卡。space0没改,space1和space0一样(但是range[0]=1表示是I/O),CS0#和CS1#一样。其中,仅CS0#连接到了8155,CS1#没有连接到8155。硬件上没有更改。
按照上面的配置,可以启动,从设备管理器里看PDC100占用的资源,
Space0: 内存范围     f6800000-f68000ff
space1: 输入输出范围 B000-B0ff
跟没改之前一样。
然后运行程序,实验证明,无论是memory访问space0,还是I/O访问space1,其实都是在访问8155!
3,但是,
在PLXmon里,看PCR,base address (1Ch)=0000B001,居然被定义成memory了!就是说这个Space1没有像base address (14h)=0000B401那样在其后面呈现出I/O的标志(复选框打钩,且字符是I/O),而是像base address (18h)=f6800000那样,在其后面呈现出Details按钮。
难道是我哪个地方错了?
附件名称/大小 下载次数 最后更新
2004-02-12_PDC1001.eep (1KB)  2
zhoujian29
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-12 14:21
关于刚才的问题3,我于是又改了一下space1,让I/O空间为16×8bit,基地址仍是0,描述仍是0x102,CS1#改成0x09。重启计算机。

 按照上面的配置,可以启动,从设备管理器里看PDC100占用的资源,
 Space0: 内存范围     f6800000-f68000ff
 space1: 输入输出范围 B000-B00f //原来是B000-B0ff
可见是EEPROM的更改值起效了。

memory访问f6800000,和I/O访问B000,读回来的值是一样的。可见I/O访问B000,不仅使CS1#有效,同时也将使CS0#有效(CS0#有效时才能读8155)。

但是,
在PLXmon的命令行中键入“vars”
发现如下(见附图9052_PCR.gif):
Plx 00ea0000  ---- Plx register address
s0  00eb0000  ---- Space0 address
s1  ffffffff  ---- Space1 address

问题:
1,为什么Space1 address没有虚地址值呢?是不是I/O端口在“vars”命令中是不会显示出来的?
2,为什么在查看PCI Configuration Registers的窗口中,见附图,Space1没有像base address (14h)=0000B401那样在其后面呈现出I/O的标志(复选框打钩,且字符是I/O),而是像base address (18h)=f6800000那样,在其后面呈现出Details按钮。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-02-12 14:28
用户被禁言,该主题自动屏蔽!
zhoujian29
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-12 14:47
谢谢cat猫及时的邮件回复,对我帮组很大。
刚才我试着用两种方式去读8155的RAM,结果如下:
memory读方式:
Read from 0xf6800000 is 0x 3d-8b-57-18
Read from 0xf6800004 is 0x 53-fb-1d-42
Read from 0xf6800008 is 0x ac-d0-33-dd
Read from 0xf680000c is 0x b3-33-5f-90
Read from 0xf6800010 is 0x fc-7a-06-68
Read from 0xf6800014 is 0x c4-43-c0-51

I/O读方式
Read from 0xb000 is 3d8b5718
Read from 0xb004 is 53fb1d42
Read from 0xb008 is acd033dd
Read from 0xb00c is b3335f90
Read from 0xb010 is ffffffff
Read from 0xb014 is ffffffff

可见,在前16个byte里,两种方式读出的数据是一样的
但是在第17个byte之后(地址空间为0xb010-0xb014),memory仍然能争取读出数据,但I/O就读不出正确数据了。
我没有用示波器去看,但我估计:
在I/O读地址空间为0xb010-0xb014时,
1,CS1#肯定无效,但CS0#仍然有效。因为CS0#寄存器没有指定说要跟什么操作方式相关,而只跟某一Local Address Space(这里是space0,而且space0涵盖了space1)有关
2,为什么CS0#仍然有效的情况下,I/O读地址空间为0xb010-0xb014时却不能正确读出数据呢?我理解为,这时,I/O读操作已经越界了,所以9052的本地端就不会出现读操作了。只要I/O读操作是在BIOS已经分配好了的0xb000-0xb00f之内,那么就可以在9052的本地端出现读操作了。
不知道这样的理解对不对?
zhoujian29
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-02-12 17:54
可能正如tom猫所说的那样,“Plxmon的vars命令好象不能列出端口的,你看9052的内部寄存器的IO端口也没有列出。”

所以在local configuration register中,当我把IO端口的地址改到0x300~30f,这样就和8155的RAM的0x0~0x255彻底没有交叉了,但重启计算机后仍然没有从vars命令中看到这个IO端口。我想了一下,这跟PLXmon自己的定义有关,比如,在memory display窗口中,就只有S0是可以访问的“存储器空间”,因为S1被我配置成了“IO空间”,所以不能在memory display窗口中被访问(S1是不能被选中的)。

不过有趣的是,S1映射到PCI的实地址仍然是0xD000~0xD00f。就是说,在PCI端用I/O访问0xd000地址,那么在local端就成了访问0x300。

更有趣的是,虽然访问S1时,8155并未使能,但不知什么原因,读S1的回读值,从offset=0的地址开始读,读回的值是0,1,2,...,D,E,F的有序整数!地址越界后回读值就是可以理解的全FF了。
待会我把8155拔下来(local端唯一的设备),再看看哈
dnykang
驱动牛犊
驱动牛犊
  • 注册日期2002-01-08
  • 最后登录2006-11-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-02-18 11:36
zhoujian29你好,怎样创建一设备控制器呀?
zhoujian29
驱动牛犊
驱动牛犊
  • 注册日期2003-10-16
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-02-18 17:14
"设备控制器"? what?
游客

返回顶部