ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:6229回复:14

pc上用vxworks调式PCI卡,需要物理地址转换成虚拟地址

楼主#
更多 发布于:2004-05-09 15:31
我在PC下用vxworks系统调试PCI卡,
发现PCI卡后从配置地址中读取membase ,iobase ,intr
我用sysMmuAdd(membase,)转换了一下,但没有作用,地址没有变化,我用4K的空间,之后用membase+offaddr读取寄存器出现死机现象,我想membase还需要转换一下,membase应该是物理地址,需要转换成虚拟地址才行,请问各位高手这样认为对吗?并问一下需要的函数用什么。我知道对于ARM用mmuPhyToVirt();
也请各位高手指点交流,谢谢。
yuansl@isantai.com

最新喜欢:

beamdavebeamda...
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-10 14:26
谢谢,我给你发了问题,但没有解决。
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-11 09:14
你收到了没有,我又刚发过来了。谢谢
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-12 10:41
谢谢了,你说的
前面的做法都很对,而且很规范,后面的我有个疑问
//地址转换,我用VM_PAGE_SIZE设为4K或8K都用过,sysMmuMapAdd()调用了几次,但都不行,好象地址都没有转换。
#define VM_PAGE_SIZE                   4*1024                   //8K for PC,4k for PPC
#define PCI_DEV_MMU_MSK         (~(VM_PAGE_SIZE - 1))   /* Mask MMU page */
#define PCI_DEV_ADRS_SIZE       VM_PAGE_SIZE    // one page
前三个定义无关紧要,PCI设备所应设的空间一般没有那么大,256到2048或者更多一点,我见过的也就到0xFFF
PCI设备所应设的空间一般都是4k

       for(i=0;i<3;i++) //这里为什么要循环三遍,而增加的地址都是一个??  这里和我的采集芯片有关,好象需要两次才能解决问题。因而我就用了三次。
       {
        sysMmuMapAdd ((void *)(membaseCsr0  ),PCI_DEV_ADRS_SIZE,
                          VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
                          VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT);      
        }

我不是很清楚你的采集卡,应该说使用了三个基地址的PCI卡很少,如果没有还是不要映射了,会出错。----我这个采集卡用了系统的3个基地址(我用PC上可以查出来的),但好象在配置采集卡时需要一个基地址即可,

对于你发的例子我看了像网卡的,在例子中你用空间也是4K,根据vxworks帮助,对于PC一般好象用8K,对于PPC用4K,但一般书上都说一般都用到4K空间(一页)。但是我的卡还是死机,我现在快疯了,我调试了快一个月,用了各种方法都不行,我的卡是VW2010MPEG4图象压缩卡,同时非常感谢你的帮助,等解决了我一定通知你。
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-12 14:07
解决了,是由于硬件需求空间设置太大,谢谢了板主,
对了在shell下我没办法用pciHeaderShow看
需要加什么组件,我应该都加了。
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-12 16:22
再核实一下,
我在PCI配置空间里读到基地址0的值为0xef130000,我测试了一下空间大小,从PCI配置空间基地址0写0xffffffff值,再从PCI配置空间基地址0读出来的值为0xfffe0000;
但经过sysMmuMapAdd()后基地址0的值变成了0xfffe0000,这样对吗?
我现在用0xfffe0000这个地址,我觉得和我读出不同,

ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-14 11:21
请教一下,中断服务不能运行,是什么原因,谢谢

1、Vw2010IntConnect = (FUNCPTR) pciIntConnect;

2、    if((Vw2010IntConnect((VOIDFUNCPTR *)(INUM_TO_IVEC(vwDevice[unit].ivec)),(VOIDFUNCPTR)vwebIntr, (int)unit))==ERROR){
       printf(\"%%intConnect fail in taskEncoding fun.\\n\");
return ERROR;
}
vwDevice[unit].ivec是从PCI空间中读出的,我打印了是正确的。
我挂不上中断,进不了vwebIntr中断服务程序。为啥,
游客

返回顶部