ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:6212回复: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...
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-09 22:40
如果你已经安装了MMU组件,不需要进行内存的影射。

如果对PCI的I/O空间访问,不需要进行内存影射(详见PCI规范)

如果需要影射,那么需要在内存管理初始化之前通知系统,也就是在sysLib.c中完成,如果你使用的是x86体系架构的目标机,可以参考FEI(82557)网卡在sysLib.c中的内存影射部分,依样画瓢就可以了

大体内容一时记不太清楚了,大约的过程就是从PCI设备的配置空间中读入内存影射空间,使用MmuAdd加入到MMU数组中即可,

注意!一定要在系统初始化内存布局之前完成
我的邮件地址:hwybird@sohu。com,两三天看一次
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-10 14:26
谢谢,我给你发了问题,但没有解决。
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-11 00:43
??发了什么问题?在哪里?
我的邮件地址:hwybird@sohu。com,两三天看一次
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分
5楼#
发布于: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分
6楼#
发布于:2004-05-12 14:07
解决了,是由于硬件需求空间设置太大,谢谢了板主,
对了在shell下我没办法用pciHeaderShow看
需要加什么组件,我应该都加了。
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-12 16:22
再核实一下,
我在PCI配置空间里读到基地址0的值为0xef130000,我测试了一下空间大小,从PCI配置空间基地址0写0xffffffff值,再从PCI配置空间基地址0读出来的值为0xfffe0000;
但经过sysMmuMapAdd()后基地址0的值变成了0xfffe0000,这样对吗?
我现在用0xfffe0000这个地址,我觉得和我读出不同,

aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-05-13 00:12
对于PCI设备,基地址的值是在系统上电的时候,由BIOS管理分配的,所以什么值都无所谓,只要不和其它的冲突就行。(详细请参考PCI规范,不详细的可以看我刚发的文)

你的测试方法是对的,可以正确的返回PCI设备所需内存的长度,你的设备需要10000的空间(好大啊,不过对于图像处理西片应该差不多)。我们做过的显卡驱动也需要16M的说。

但是一般的规范操作时都会在之后再将原来的值写回去。系统中说的4K或是8K那是对主存而言的分页。

发给你的确实是个网卡驱动,因为我在宿舍上网,一时找不到合适的程序了,嘿嘿。
我的邮件地址:hwybird@sohu。com,两三天看一次
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-13 00:21
关于pciHeaderShow,应该是加入PCI configuration组件(硬件的总线里),另外加上pci show routines(开发工具的显示里)吧?我没用过,应该是这样的
我的邮件地址:hwybird@sohu。com,两三天看一次
ysl206
驱动牛犊
驱动牛犊
  • 注册日期2003-06-27
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于: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中断服务程序。为啥,
shaohua
驱动牛犊
驱动牛犊
  • 注册日期2001-04-12
  • 最后登录2008-11-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-26 20:26
我也遇到相同的问题,能详细地告诉我解决办法吗?
shaohua@bentium.net
maple_wasp
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-03-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-01-25 18:03
如果是x86板子应该 + 0x20, 即
INUM_TO_IVEC(vwDevice[unit].ivec + 0x20)
,其它板子也可能要加一定的偏移量,其实也就是加上 IRQ0
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-01-25 19:52
我记得应该加E0,你读出来的是中断级别,所要连接的是中断号,在PC。H中有定义宏,可以帮你做这个转换,不要自己做,因为这个便宜两根据机器硬件不同而不同
我的邮件地址:hwybird@sohu。com,两三天看一次
lhsundriver
驱动牛犊
驱动牛犊
  • 注册日期2005-10-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望181点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2010-04-12 10:56
study
hdjasfhkjasdhfkj
游客

返回顶部