Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2434回复:16

这个问题只要你做过驱动就会,20分不成敬意

楼主#
更多 发布于:2002-07-22 07:49

我做了一个WDM的PCI驱动,正在和硬件联调,我的卡上有一个FPGA做的
RAM,在初始化时应该是由系统分配好卡上的RAM的地址,并在Startdevice这个PnP消息中的resource域中会以 PCM_PARTIAL_RESOURCE_LIST list=&AllocatedResourcesTranslated->List[0].PartialResourceList;
port = resource->u.Port.Start;

的方式传过来,然后用 dx->BufferMemBase=(PULONG)MmMapIoSpace(port, nports, MmNonCached);
把它存起来,在硬件操作的例程中再用RtlCopyMemory把信息写到RAM中或提取出来,我认为BufferMemBase就应该是对应RAM的,结果却不能从该地址读出写进去的东西。请问在WDM里与硬件应怎样打交道。您是用的RtlCopyMemory吗?
还是其他的函数(WRITE_PORT_ULONG我也用过了,也不行,以及 WRITE_REGISTER_ULONG)。谢谢先。

 
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-07-22 08:43
不是RtlCpyMemory。
MmMapIoSpace是map端口的,不是mem address呀。
用错资源了吧。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-07-22 08:51
如果是内存映射的话,应该是
u.Memoey 和MmMapLockedPages吧。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-07-22 10:10
用户被禁言,该主题自动屏蔽!
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-22 13:15

 谢谢两位老大,MmMapIoSpace我已经试过了,MmMapLockedPages我下午就去试,我在DDKhelp里看到一句说,内存映射要用
WRITE _REGISTER_XXX来写,请问TOM老大应该怎样得到正确的内存地址呢?我上次的帖子写错了,是用的
           port=resource->u.Memory.Start;  
          ..................
           MmMapIoSpace(port, nports, MmNonCached );
是不是只要地址获取对了,就可以用RtlCopyMemory?还是只能用WRITE _REGISTER_XXX?老大们用的哪个?我的PCI接口芯片是PLX9054。今天上午我用WRITE_REGISTER_ULONG写寄存器成功了,写片上RAM还是不行。我怀疑是不是硬件有问题(硬件是同一个课题组的人做的)。


  问题解决了一定给分。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-07-22 15:26
汗。。。
没有用过memory map的,说错了。 :D
但是用write_register_xxx是对的。
你用WRITE_REGISTER_ULONG写的寄存器?!不是write_port_xxx?
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-22 18:44
我是用的WRITE_REGISTER_ULONG写映射到内存的PCI寄存器,可以。

通过WRITE_REGISTER_ULONG写映射到系统内存的板上RAM,失败!
用WRITE_PORT_ULONG写I/O映射的寄存器,失败!
用WRITE_PORT_ULONG写I/O映射的板上RAM,失败!


也许我只有考虑是否硬件问题了(硬件不是我做的,真惨!)
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-07-23 08:44
用户被禁言,该主题自动屏蔽!
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-23 19:04

  我是要对卡上的FPGA上的共32个双字的RAM读写,RAM映射到系统Memory中,在设备发START_Device消息时把Memory资源得到,然后对其用MmMapIoSpace映射,最后用WRITE(READ)_REGISTER_XXX读写,但根本不能读回我写的东西,请高手指点一下,我上面的步骤对不对。
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-23 19:08
我问做硬件的了,局部总线是32位。
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-23 19:29
仅仅32个双子,用io空间就可以了。不过用memory是一个道理。
你的方法看着没有问题,用WRITE(READ)_REGISTER_XXX调用以后看看总线能不能收到你的写信号,如果能收到呢就可能是硬件解码错误。
我就是我,没什么可说的。
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-23 19:45
 谢谢Snare,但我怎么看总线能不能收到写信号呢,你是说的系统PCI总线还是局部总线?用示波器看吗?
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-24 13:03
今天又有新鲜事,我把MmMapIoSpace映射后的指针直接使用,不通过任何函数,既:
*(dx->BuffMemBase)=1979626;
直接赋值,结果居然有反应,你猜读回来啥:
居然是:  26969701!倒序了。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-07-24 16:25
可能硬件的问题。
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-24 19:08
我们的硬件工程师出去暑休了,我昨晚自己上阵,结果把一台示波器烧坏了,郁闷啊!
wuqix
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2008-06-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-07-24 22:43
RtlCopyMemory用的也是内存指针来进行复制,如果*(dx->BuffMemBase)有反映,那么这个函数至少在复制一个32bit时也有相同的结果.pci基址空间寄存器的内存映射和板上ram的映射不太一样,MmMapIoSpace这个函数作的事情是把相应的物理地址保留给硬件而不在其中放入程序代码,但至于你用mov #addr的时候总线上的地址到底有没有被硬件解码,则是硬件的问题,与你无关.
Reehac
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-25 00:12
请问斑竹:
   \"MmMapIoSpace这个函数作的事情是把相应的物理地址保留给硬件而不在其中放入程序代码\"
    能不能再解释得清楚一点?我实在有点菜。  
游客

返回顶部