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

如何跟硬件打交道

楼主#
更多 发布于:2002-07-20 18:38
我做了一个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我也用过了,也不行)。谢谢先。

最新喜欢:

okincnokincn
coss
驱动小牛
驱动小牛
  • 注册日期2002-02-04
  • 最后登录2002-11-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-22 08:25
sorry, i would like to write it down in English,and
any more question, please email to:sandacoss@sina.com .

On a pci card, the FPGA can not be only a ram. you should also build in a ram controller.



[编辑 -  7/22/02 by  coss]
No meal is free of charge in the world.
myron
驱动牛犊
驱动牛犊
  • 注册日期2002-08-04
  • 最后登录2002-10-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-09 13:26
太难了,能否给小弟介绍两本书
sharc2002
驱动牛犊
驱动牛犊
  • 注册日期2002-04-07
  • 最后登录2013-05-07
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望32点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-09 23:00
我想问题时这样的,你得到是pci 空间的基地址,但用fpga 实现的
RAM 不一定就是在这个空间里。这应该是硬件设计导致的问题。
zilinx
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2006-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-14 22:49
我想问题时这样的,你得到是pci 空间的基地址,但用fpga 实现的
RAM 不一定就是在这个空间里。这应该是硬件设计导致的问题。

硬件设计时,应该对你在FPGA中RAM进行地址译码。
驱动设计时,应该配置PCI的BAR空间。
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-21 23:04
我做了一个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我也用过了,也不行)。谢谢先。
 


1、windows虽然是32位寻址,不过你用该用字节进行偏移,所以你的MmMapIoSpace函数前应该用PUCHAR进行强制转换,否则你的地址加1,实际上加了4个byte(1UONG = 4BYTE),故有可能ram中有数据,你却读错了位置。

2、你说用了WRITE_PORT_ULONG,不过看你的ram是映射的,所以试试WRITE_REGISTER_ULONG,不知道你试了这个函数没有

3、也有可能是硬件问题,这可以用softice看。用“dd 基地址+偏移量”命令,如果可以看到数据就是驱动问题,反之就是你的硬件译码问题了

问题虽然提得比较远(呵呵,现在2003年了),不过以上的回答都是自己在开发驱动时遇到过的,希望对后人有所帮助,呵呵
早起早睡 精神百倍
游客

返回顶部