阅读:2434回复:16
这个问题只要你做过驱动就会,20分不成敬意我做了一个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)。谢谢先。 |
|
沙发#
发布于:2002-07-22 08:43
不是RtlCpyMemory。
MmMapIoSpace是map端口的,不是mem address呀。 用错资源了吧。 |
|
板凳#
发布于:2002-07-22 08:51
如果是内存映射的话,应该是
u.Memoey 和MmMapLockedPages吧。 |
|
地板#
发布于:2002-07-22 10:10
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于: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还是不行。我怀疑是不是硬件有问题(硬件是同一个课题组的人做的)。 问题解决了一定给分。 |
|
5楼#
发布于:2002-07-22 15:26
汗。。。
没有用过memory map的,说错了。 :D 但是用write_register_xxx是对的。 你用WRITE_REGISTER_ULONG写的寄存器?!不是write_port_xxx? |
|
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,失败! 也许我只有考虑是否硬件问题了(硬件不是我做的,真惨!) |
|
7楼#
发布于:2002-07-23 08:44
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2002-07-23 19:04
我是要对卡上的FPGA上的共32个双字的RAM读写,RAM映射到系统Memory中,在设备发START_Device消息时把Memory资源得到,然后对其用MmMapIoSpace映射,最后用WRITE(READ)_REGISTER_XXX读写,但根本不能读回我写的东西,请高手指点一下,我上面的步骤对不对。 |
|
9楼#
发布于:2002-07-23 19:08
我问做硬件的了,局部总线是32位。
|
|
10楼#
发布于:2002-07-23 19:29
仅仅32个双子,用io空间就可以了。不过用memory是一个道理。
你的方法看着没有问题,用WRITE(READ)_REGISTER_XXX调用以后看看总线能不能收到你的写信号,如果能收到呢就可能是硬件解码错误。 |
|
|
11楼#
发布于:2002-07-23 19:45
谢谢Snare,但我怎么看总线能不能收到写信号呢,你是说的系统PCI总线还是局部总线?用示波器看吗?
|
|
12楼#
发布于:2002-07-24 13:03
今天又有新鲜事,我把MmMapIoSpace映射后的指针直接使用,不通过任何函数,既:
*(dx->BuffMemBase)=1979626; 直接赋值,结果居然有反应,你猜读回来啥: 居然是: 26969701!倒序了。 |
|
13楼#
发布于:2002-07-24 16:25
可能硬件的问题。
|
|
14楼#
发布于:2002-07-24 19:08
我们的硬件工程师出去暑休了,我昨晚自己上阵,结果把一台示波器烧坏了,郁闷啊!
|
|
15楼#
发布于:2002-07-24 22:43
RtlCopyMemory用的也是内存指针来进行复制,如果*(dx->BuffMemBase)有反映,那么这个函数至少在复制一个32bit时也有相同的结果.pci基址空间寄存器的内存映射和板上ram的映射不太一样,MmMapIoSpace这个函数作的事情是把相应的物理地址保留给硬件而不在其中放入程序代码,但至于你用mov #addr的时候总线上的地址到底有没有被硬件解码,则是硬件的问题,与你无关.
|
|
16楼#
发布于:2002-07-25 00:12
请问斑竹:
\"MmMapIoSpace这个函数作的事情是把相应的物理地址保留给硬件而不在其中放入程序代码\" 能不能再解释得清楚一点?我实在有点菜。 |
|