shirullan
驱动牛犊
驱动牛犊
  • 注册日期2008-06-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望352点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4684回复:4

PCI设备驱动程序之BAR空间读写问题,求救!!!

楼主#
更多 发布于:2009-08-25 09:55
这段时间在着手PCI9054的WDM驱动程序开发,在设计驱动程序后,可以找到设备,能够对配置空间进行访问,但是对BAR2映射的设备内存的读访问都不能进行(会死机)。因为是实验室自己设计的硬件平台,同时用商业软件WinDriver对BAR2空间进行读访问,同样死机,之前在QQ上联系到一位驱动开发技术人员,他说如果用WinDriver都不能访问,那么自己作为一个驱动开发人员也无能为力,让硬件工程师将板子调通了再说,所以我怀疑是硬件问题。

和导师商量,导师让我先通过PC机上的标准PCI设备,来试试自己的驱动程序设计思路,验证其正确性。在设备管理器里面找了一通,发现网卡不错,BAR0、BAR1、BAR2三个资源空间,START_DEVICE的时候,这三个空间都正确捕获,因为用WinDriver可以大致看到这三个资源的地址范围和长度信息,所以在驱动程序里面定义一个IOCTL来访问DEVICE_EXTENSION中保存的这些资源的初始化信息,发现和WinDriver访问到的一样,所以资源初始化基本成功。

无论是Memory空间还是IO空间,最重要的就是要能够访问。所以,尝试对这些空间进行READ或者WRITE操作,发现READ操作能够正确进行,但是WRITE操作就会出现问题,附段代码如下:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ULONG Buffer;
PULONG SystemBase = (PULONG)(pIrp->AssociatedIrp.SystemBuffer);
RtlCopyMemory(&Buffer,SystemBase,4);                                        //将SystemBuffer中的数据存入Buffer变量
KdPrint(("Buffer is 0x%08x.\n",Buffer));
WRITE_REGISTER_ULONG(pdx->BAR0SystemBase,Buffer);  //将Buffer中存储的数据写入BAR空间
KdPrint(("Write Register is 0x%08x.\n",READ_REGISTER_ULONG(pdx->BAR0SystemBase)));  //观察写入的结果
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在应用程序端,修改写入值,Buffer随着变化,也就是DeviceIoControl中的输入缓冲区的数据正确传入SystemBuffer,但是调用WRITE_REGISTER_ULONG,写入的数据就和Buffer不一样,不得其解,望高手解答,谢谢了。。。
Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2009-08-25 14:41
帮你顶一下!

顺便请再帮我看看我的问题:http://bbs.driverdevelop.com/htm_data/45/0908/118008.html
tqijin
驱动小牛
驱动小牛
  • 注册日期2006-07-04
  • 最后登录2013-11-21
  • 粉丝3
  • 关注0
  • 积分31分
  • 威望1060点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-08-28 17:10
把写操作改成如下方式:
WRITE_REGISTER_ULONG((PULONG)&pdx->BAR0SystemBase,Buffer);  //将Buffer中存储的数据写入BAR空间

应该就OK 了,可以试试看
shirullan
驱动牛犊
驱动牛犊
  • 注册日期2008-06-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望352点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-08-28 21:59
回 2楼(tqijin) 的帖子
谢谢楼上的回答,不过我的pdx->BAR0SystemBase已经是PULONG型的数据了。今天晚上在QQ上联系到一个人,他说可能是内存某些位的数据不能写的缘故,后来发现确实是这个样子。
green_pine
驱动太牛
驱动太牛
  • 注册日期2002-10-22
  • 最后登录2019-06-10
  • 粉丝3
  • 关注0
  • 积分48分
  • 威望599点
  • 贡献值1点
  • 好评度144点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2009-09-02 09:15
windriver里是有9054的例子的,可以参考一下
游客

返回顶部