阅读:1522回复:7
【求助】PCI驱动运行时系统重启(不管回答对我有无帮助,都给分)
我的PCI芯片是PCI2040,用DriverWorks编驱动,现在想读取PCI配置空间中的内容(即BAR0基址寄存器等寄存器中的内容),我的程序步骤是这样的:先在设备类PCI2040Device中定义一个KPciConfiguration的对象(KPciConfiguration m_Config;),然后在构造函数中初始化m_Config。测试程序发出ioctl:PCI2040_IOCTL_ReadConfigSpace(方式是METHOD_IN_DIRECT)。驱动中为:
VOID PCI2040Device::Serial_PCI2040_IOCTL_ReadConfigSpace_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; t << \"Entering PCI2040Device::Serial_PCI2040_IOCTL_ReadConfigSpace_Handler, \" << I << EOL; KMemory Mem(I.Mdl()); PULONG pOutBuffer = (PULONG) Mem.MapToSystemSpace(); //输出缓冲区指针,传出读取的数据 ULONG baseadd=(m_Config.ReadBaseAddress(0)); *pOutBuffer=baseadd; I.Information() = sizeof(ULONG); //字节数 I.Status() = status; m_DriverManagedQueue.PnpNextIrp(I); } |
|
沙发#
发布于:2005-05-10 23:30
还是再写清楚一点。
我的测试程序中相关语句是这样的: void Test_PCI2040_IOCTL_ReadConfigSpace(void) { ULONG bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device ULONG nOutput; // Count written to bufOutput printf(\"Issuing Ioctl to device -\\n \"); if (!DeviceIoControl(hDevice, PCI2040_IOCTL_ReadConfigSpace, NULL, 0, bufOutput, IOCTL_OUTBUF_SIZE, &nOutput, NULL) ) { printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError()); Exit(1); } else { printf(\"\\nThe BaseAddress0 Register is %x\",bufOutput[0]); } } 程序一运行,系统就重启,请问这是怎么回事?我在DriverWorks的help文档中看到:If the WDM library is used, the caller must be running at PASSIVE_LEVEL.会不会是这个原因?我是个新手,刚接触驱动没多久,若是这个原因,请懂得的dx帮忙解释一下吧。 最后,请问一下在DriverWorks中除了用KPciConfiguration类之外,还有没有其他的方法来读取PCI的配置空间呢? 小弟诚心求教,诚心给分。 |
|
板凳#
发布于:2005-05-10 23:49
既然你已经处理了该request,为什么不完成呢?
还有你在*pOutBuffer=baseadd; 中pOutBuffer是否为空呢? |
|
|
地板#
发布于:2005-05-11 13:57
AllenZh能否说得详细一点啊,我是个新手,对有些概念还有点模棱两可。
我已经对那个Irp赋值了information和status,这样还不够吗?你说的完成该request我应该用什么函数呢? 至于pOutBuffer是刚开辟的一个输出缓冲区指针,应该不会是空的吧。 |
|
地下室#
发布于:2005-05-11 19:02
问题已经解决了,原来只要把ReadBaseAddress()放在构造函数里执行就可以了,也许这就是所谓的那什么level吧,不过到底具体是怎么回事还是不知道:(
|
|
5楼#
发布于:2005-05-11 20:56
问题已经解决了,原来只要把ReadBaseAddress()放在构造函数里执行就可以了,也许这就是所谓的那什么level吧,不过到底具体是怎么回事还是不知道:( Serial_PCI2040_IOCTL_ReadConfigSpace_Handler应该在DISPATCH level 你可以在AddDevice中或者Start Device中处理 |
|
|
6楼#
发布于:2005-05-12 06:00
多谢AllenZh大虾的回答,我想给分的,可是不知道为什么总显示我没有登陆,也找不到“给分”这个按钮了,我重登陆了几次都没用,我另外还有一个帖子也是这样,不知道怎么回事。
我已经在建议投诉区问了,如果你知道怎么做的话,麻烦告诉一下。如果能够操作,我一定第一时间给分!! |
|
7楼#
发布于:2005-05-24 14:47
caorr你好,我现在也在做PCI2040+C6211的板子,正准备写驱动,能不能认识一下,有什么问题好一块交流。本人QQ:25151347
|
|