阅读:1999回复:9
PCI Memory 访问?
现有一块PCI卡,实现了IO端口和专用内存,我已经能够访问IO ,但是如何访问memory呢?我计划在WDM中的RetrieveResources(...)这个常规自定义函数获得memory基址,然后使用READ/WRITE_REGISTER_ULONG 进行读写,这样行么?
那位可以帮着解释一下? |
|
最新喜欢:mapofl
|
沙发#
发布于:2004-06-17 20:13
memory地址需要MmMapIoSpace,然后可以用READ/WRITE_REGISTER_ULONG 读写
|
|
|
板凳#
发布于:2004-06-19 15:21
我大概也就是按照这个思路进行的,部分源码如下:
case CmResourceTypeMemory: dx->bHaveMem = true; dx->GotPortOrMemory = true; dx->memStartAddres = resource->u.Memory.Start; dx->memLength = resource->u.Memory.Length; break; ... 然后在StartDevice(..)中: if(dx->bHaveMem) dx->membase = (PULONG)MmMapIoSpace(dx->memStartAddress,dx->memLength,MnNonCached); ... 这样可以吗? 我如此操作后读写不会死机,但是对同一可读写单元先写后读,数据显然不等同。可能是什么原因? |
|
|
地板#
发布于:2004-06-19 22:37
这个应该没有问题,但不知道你的fesource是否引用了正确的资源地址。
另外如果你对内存读有变这也可能,因为PCI卡硬件是否会修改这里的数据呢?如果要,变是当然的。 |
|
|
地下室#
发布于:2004-06-20 21:54
板子没有使数据改变,写进什么,读出应该是什么。
另外,在加载驱动程序的时候,我在ListResource 和RetrieveResource查看了资源的内存分配,ListResource中传入的资源参数是IrpStack->Parameters.StartDevice.AllocatedResources,而RetrieveResource传入的是IrpStack->Parameters.StartDevice.AllocatedResourcesTranslated, 结果发现两者在单步查看时暴露的资源是一样。如:在设备管理器中查看的内存资源为FFEDFFCO-FFEDFFF,IrpStack->Parameters.StartDevice.AllocatedResources给出的也是FFEDFFCO-FFEDFFF,IrpStack->Parameters.StartDevice.AllocatedResourcesTranslated给出的还是FFEDFFCO-FFEDFFF,这样有没有错?(因为AllocatedResources和AllocatedResourcesTranslated居然一样),然后我才MmMapIoSpace.反正结果就是不对。为什么呢? 现在已经把板子改成只用Memory方式,取消IO了,故也不涉及io映射了。 |
|
|
5楼#
发布于:2004-06-20 22:07
另外,为了排除硬件的memory访问逻辑有问题,我得首先证明驱动没问题。于是希望对其他已知正确板卡测试。如:显卡。通过资源查看,显卡使用DA000000--DAFFFFFF内存地址(三块中之一),于是我直接在驱动中将dx->memstartAddress改成与之对应的参数,然后使用READ/WRITE_REGISTER_ULONG先写后读,仍然是读写不对等,会是什么问题?如果想借助显卡调试,应该怎样去做?谢了。
|
|
|
6楼#
发布于:2004-06-22 17:36
现在情形是这样的,写进的值从硬件引出,通过示波器看,是正确的,但是读出的仍不对,可能是硬件的读逻辑有问题,还得再改改。
|
|
|
7楼#
发布于:2004-06-22 17:37
AllenZh,想给分你,怎么老是给不了?没法登陆论坛。有什么办法?
|
|
|
8楼#
发布于:2004-06-23 09:09
AllenZh,想给分你,怎么老是给不了?没法登陆论坛。有什么办法? 分并不重要,到现在为止我也没有给任何人给过分,所以我也不知道(有几次给分好象都失败了) |
|
|
9楼#
发布于:2004-06-23 09:12
另外,为了排除硬件的memory访问逻辑有问题,我得首先证明驱动没问题。于是希望对其他已知正确板卡测试。如:显卡。通过资源查看,显卡使用DA000000--DAFFFFFF内存地址(三块中之一),于是我直接在驱动中将dx->memstartAddress改成与之对应的参数,然后使用READ/WRITE_REGISTER_ULONG先写后读,仍然是读写不对等,会是什么问题?如果想借助显卡调试,应该怎样去做?谢了。 你这样操作很危险,弄不好就会死机的。 当然我也曾经在驱动中直接写过显卡,但不是普通驱动。 你通过SoftIce对你的地址操作一下,看硬件是否有响应,同时看结果是否正确 |
|
|