阅读:4684回复:4
PCI设备驱动程序之BAR空间读写问题,求救!!!
这段时间在着手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不一样,不得其解,望高手解答,谢谢了。。。 |
|
沙发#
发布于:2009-08-25 14:41
|
|
板凳#
发布于:2009-08-28 17:10
把写操作改成如下方式:
WRITE_REGISTER_ULONG((PULONG)&pdx->BAR0SystemBase,Buffer); //将Buffer中存储的数据写入BAR空间 应该就OK 了,可以试试看 |
|
地板#
发布于:2009-08-28 21:59
回 2楼(tqijin) 的帖子
谢谢楼上的回答,不过我的pdx->BAR0SystemBase已经是PULONG型的数据了。今天晚上在QQ上联系到一个人,他说可能是内存某些位的数据不能写的缘故,后来发现确实是这个样子。 |
|
地下室#
发布于:2009-09-02 09:15
windriver里是有9054的例子的,可以参考一下
|
|