阅读:6329回复:14
pc上用vxworks调式PCI卡,需要物理地址转换成虚拟地址
我在PC下用vxworks系统调试PCI卡,
发现PCI卡后从配置地址中读取membase ,iobase ,intr 我用sysMmuAdd(membase,)转换了一下,但没有作用,地址没有变化,我用4K的空间,之后用membase+offaddr读取寄存器出现死机现象,我想membase还需要转换一下,membase应该是物理地址,需要转换成虚拟地址才行,请问各位高手这样认为对吗?并问一下需要的函数用什么。我知道对于ARM用mmuPhyToVirt(); 也请各位高手指点交流,谢谢。 yuansl@isantai.com |
|
最新喜欢:beamda... |
沙发#
发布于:2004-05-09 22:40
如果你已经安装了MMU组件,不需要进行内存的影射。
如果对PCI的I/O空间访问,不需要进行内存影射(详见PCI规范) 如果需要影射,那么需要在内存管理初始化之前通知系统,也就是在sysLib.c中完成,如果你使用的是x86体系架构的目标机,可以参考FEI(82557)网卡在sysLib.c中的内存影射部分,依样画瓢就可以了 大体内容一时记不太清楚了,大约的过程就是从PCI设备的配置空间中读入内存影射空间,使用MmuAdd加入到MMU数组中即可, 注意!一定要在系统初始化内存布局之前完成 |
|
|
板凳#
发布于:2004-05-10 14:26
谢谢,我给你发了问题,但没有解决。
|
|
地板#
发布于:2004-05-11 00:43
??发了什么问题?在哪里?
|
|
|
地下室#
发布于:2004-05-11 09:14
你收到了没有,我又刚发过来了。谢谢
|
|
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图象压缩卡,同时非常感谢你的帮助,等解决了我一定通知你。 |
|
6楼#
发布于:2004-05-12 14:07
解决了,是由于硬件需求空间设置太大,谢谢了板主,
对了在shell下我没办法用pciHeaderShow看 需要加什么组件,我应该都加了。 |
|
7楼#
发布于:2004-05-12 16:22
再核实一下,
我在PCI配置空间里读到基地址0的值为0xef130000,我测试了一下空间大小,从PCI配置空间基地址0写0xffffffff值,再从PCI配置空间基地址0读出来的值为0xfffe0000; 但经过sysMmuMapAdd()后基地址0的值变成了0xfffe0000,这样对吗? 我现在用0xfffe0000这个地址,我觉得和我读出不同, |
|
8楼#
发布于:2004-05-13 00:12
对于PCI设备,基地址的值是在系统上电的时候,由BIOS管理分配的,所以什么值都无所谓,只要不和其它的冲突就行。(详细请参考PCI规范,不详细的可以看我刚发的文)
你的测试方法是对的,可以正确的返回PCI设备所需内存的长度,你的设备需要10000的空间(好大啊,不过对于图像处理西片应该差不多)。我们做过的显卡驱动也需要16M的说。 但是一般的规范操作时都会在之后再将原来的值写回去。系统中说的4K或是8K那是对主存而言的分页。 发给你的确实是个网卡驱动,因为我在宿舍上网,一时找不到合适的程序了,嘿嘿。 |
|
|
9楼#
发布于:2004-05-13 00:21
关于pciHeaderShow,应该是加入PCI configuration组件(硬件的总线里),另外加上pci show routines(开发工具的显示里)吧?我没用过,应该是这样的
|
|
|
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中断服务程序。为啥, |
|
11楼#
发布于:2004-08-26 20:26
我也遇到相同的问题,能详细地告诉我解决办法吗?
shaohua@bentium.net |
|
12楼#
发布于:2005-01-25 18:03
如果是x86板子应该 + 0x20, 即
INUM_TO_IVEC(vwDevice[unit].ivec + 0x20) ,其它板子也可能要加一定的偏移量,其实也就是加上 IRQ0 |
|
13楼#
发布于:2005-01-25 19:52
我记得应该加E0,你读出来的是中断级别,所要连接的是中断号,在PC。H中有定义宏,可以帮你做这个转换,不要自己做,因为这个便宜两根据机器硬件不同而不同
|
|
|
14楼#
发布于:2010-04-12 10:56
study
|
|
|