edbert
驱动牛犊
驱动牛犊
  • 注册日期2003-04-26
  • 最后登录2012-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望26点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
阅读:1924回复:9

PCI Memory 访问?

楼主#
更多 发布于:2004-06-17 17:52
现有一块PCI卡,实现了IO端口和专用内存,我已经能够访问IO ,但是如何访问memory呢?我计划在WDM中的RetrieveResources(...)这个常规自定义函数获得memory基址,然后使用READ/WRITE_REGISTER_ULONG 进行读写,这样行么?
那位可以帮着解释一下?

最新喜欢:

mapoflmapofl
hhm
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于:2004-06-17 20:13
memory地址需要MmMapIoSpace,然后可以用READ/WRITE_REGISTER_ULONG 读写
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
edbert
驱动牛犊
驱动牛犊
  • 注册日期2003-04-26
  • 最后登录2012-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望26点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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);
     ...

这样可以吗?
我如此操作后读写不会死机,但是对同一可读写单元先写后读,数据显然不等同。可能是什么原因?
hhm
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-19 22:37
这个应该没有问题,但不知道你的fesource是否引用了正确的资源地址。
另外如果你对内存读有变这也可能,因为PCI卡硬件是否会修改这里的数据呢?如果要,变是当然的。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
edbert
驱动牛犊
驱动牛犊
  • 注册日期2003-04-26
  • 最后登录2012-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望26点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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映射了。
hhm
edbert
驱动牛犊
驱动牛犊
  • 注册日期2003-04-26
  • 最后登录2012-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望26点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-20 22:07
另外,为了排除硬件的memory访问逻辑有问题,我得首先证明驱动没问题。于是希望对其他已知正确板卡测试。如:显卡。通过资源查看,显卡使用DA000000--DAFFFFFF内存地址(三块中之一),于是我直接在驱动中将dx->memstartAddress改成与之对应的参数,然后使用READ/WRITE_REGISTER_ULONG先写后读,仍然是读写不对等,会是什么问题?如果想借助显卡调试,应该怎样去做?谢了。
hhm
edbert
驱动牛犊
驱动牛犊
  • 注册日期2003-04-26
  • 最后登录2012-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望26点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-22 17:36
现在情形是这样的,写进的值从硬件引出,通过示波器看,是正确的,但是读出的仍不对,可能是硬件的读逻辑有问题,还得再改改。
hhm
edbert
驱动牛犊
驱动牛犊
  • 注册日期2003-04-26
  • 最后登录2012-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望26点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-22 17:37
AllenZh,想给分你,怎么老是给不了?没法登陆论坛。有什么办法?
hhm
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-23 09:09
AllenZh,想给分你,怎么老是给不了?没法登陆论坛。有什么办法?
 

分并不重要,到现在为止我也没有给任何人给过分,所以我也不知道(有几次给分好象都失败了)
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-23 09:12
另外,为了排除硬件的memory访问逻辑有问题,我得首先证明驱动没问题。于是希望对其他已知正确板卡测试。如:显卡。通过资源查看,显卡使用DA000000--DAFFFFFF内存地址(三块中之一),于是我直接在驱动中将dx->memstartAddress改成与之对应的参数,然后使用READ/WRITE_REGISTER_ULONG先写后读,仍然是读写不对等,会是什么问题?如果想借助显卡调试,应该怎样去做?谢了。

你这样操作很危险,弄不好就会死机的。
当然我也曾经在驱动中直接写过显卡,但不是普通驱动。
你通过SoftIce对你的地址操作一下,看硬件是否有响应,同时看结果是否正确
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部