阅读:1954回复:10
Pci卡进入PowerDeviceD3电源状态后端口不再可用,麻烦
pci驱动我实现了电源管理模块,可是进入PowerDeviceD3后pci卡的端口就不再可用,值全变成0xff,这时如果有中断产生,在isr里就无法清除中断状态端口,结果导致中断不断产生。
我想在isr里降低IRQL再调用PoSetPowerState,也失败了。现在的问题: 1、pci卡进入PowerDeviceD3状态后所有端口一定会不能再访问吗?不是的话,有什么解决的方法? 2、请教在isr里改变电源状态的方法(想在dpc里调用也失败了,因为无法清除中断端口,cpu根本没有时间执行dpc) |
|
最新喜欢:okincn
|
沙发#
发布于:2002-12-31 15:57
我也遇到了同样的问题,一旦电源进入D3状态,设备就不可访问!!
我试着在处理IO请求之前判断电源状态,监测到D3时,再次让设备进入D0状态,可是还是不能访问设备!! 如果你能解决此问题的话,不妨也告诉我一声,谢谢! |
|
板凳#
发布于:2002-12-31 17:35
我想可能是硬件的问题,现在只有去掉节省电源函数了,没办法
|
|
|
地板#
发布于:2003-01-01 15:34
你会不会出现死机的情况。我每次启动机器之后,都要重新安装一下驱动,否则就会大约在十分钟左右死机!
|
|
地下室#
发布于:2003-01-02 08:30
可能是节能函数的问题,十分钟是你设置的进入睡眠状态的时限,进入睡眠就死机,干脆去掉它。
我猜的,你试一试,我没有死机的情况 |
|
|
5楼#
发布于:2003-01-02 19:45
我今天仔细看了你的问题。
1,设备进入了d3状态,设备是不能被访问的! 2,你的设备进入到d3状态时,是什么原因造成的。如果是你认为 设定的话,那你可以把它设回d0,如果是系统进入休眠状态导致设备 进入d3的话,那要看设备是否支持唤醒功能,如果支持的话应该能通过某种方式唤醒系统! 我是我的一点理解不知道是否对你有点启发!! 我遇到的问题今天解决了!我禁止设备的空闲检测,就不会出现这样的问题了! |
|
6楼#
发布于:2003-01-08 13:41
老哥,看看DDK关于电源的说明文章,D3是设备被关闭,当然不能被访问。ISR是不可重入的,如果你不退出来,他不会被再次调用。用PocallDriver可以发送电源IRP,白你的设备置成D0在清除。
|
|
7楼#
发布于:2003-01-08 14:15
设备在d3下当然不能直接访问,但是我想不会所有的寄存器都不能访问,硬件不是我设计的,不太清楚。
pocalldriver早就调用过了,可是在isr里调用好像没用。 |
|
|
8楼#
发布于:2003-01-08 21:35
你要确保你对,pocalldriver的调用是正确的,比如说你用的是FDO而不是PDO.我告诉你个好方法,先把DDK里的pocalldriver的说明看一个小时在用,如果还不行,就是硬件的问题。虽然你能根据PCI协议更改硬件的电源状态,但是,系统的记录就会出错,所以不要这么做。
|
|
9楼#
发布于:2003-01-08 21:43
pocalldriver调用肯定没问题,因为在deviceiocontrol里有调用电源管理的函数,工作正常。现在只是在isr里调用相同的函数却不正确。
在isr里已经临时降低irql到PASSIVE_LEVEL再调用,结果无效 |
|
|
10楼#
发布于:2003-01-08 21:49
如果你有两种情况的对比,可以跟踪一下pocalldriver的执行,就知道问题出在什么地方了,DDK也有不正确的,比如IoGetDeviceObjectPointer,它没有更详细的说明,其实它是得到设备的最上层指针,但是,在说明里体会不出来。可能pocalldriver有属于这种情况。
|
|