|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
[i=s] 本帖最后由 xiaxia0053 于 2010-3-25 14:36 编辑 [/i]
驱动就是用ds的向导生成的,主要改了下面两个例程,其他地方基本上没有动,驱动能够正常工作,接收isa的中断和数据,但是不知道为什么在重启5-6次之中,总会发生一次接受不到中断的情况。故障时,用windriver可以收到数据,所以我觉得应该是我这个驱动的问题,请教大家,还要从哪方面找找原因.
NTSTATUS IsaDevice::DeviceControl(KIrp I)
{
NTSTATUS status;
t << "Entering IsaDevice::Device Control, " << I << EOL;
switch (I.IoctlCode())
{
case Event_Isa:
{
HANDLE hEvent = *(HANDLE*)I.IoctlBuffer();
if (m_pEvent)
delete m_pEvent;
m_pEvent = new (NonPagedPool) KEvent(hEvent, OBJECT_TYPE_ALL_ACCESS);
return I.Complete(STATUS_SUCCESS);
}
case GetData_Isa:
{
m_ResetIntr = (UCHAR)0; //清中断
if (SynchronizeInterrupt(&m_Irq, LinkTo(ReadData), PIRP(I)) )
return I.Complete(STATUS_SUCCESS);
else
return I.Complete(STATUS_UNSUCCESSFUL);
return STATUS_UNSUCCESSFUL;
}
case EZ_ISA_IOCTL_802:
break;
case EZ_ISA_IOCTL_803:
break;
case EZ_ISA_IOCTL_804:
break;
case EZ_ISA_IOCTL_805:
break;
case EZ_ISA_IOCTL_806:
break;
default:
// Unrecognized IOCTL request
status = STATUS_INVALID_PARAMETER;
break;
}
BOOLEAN Ez_isaDevice::Isr_Irq(void)
{
//Get Data
m_IoPortRange.outw(0x00, 0x0020);
m_IoPortRange.inb(0x02, &m_Buf[1], m_DataSize);
m_ResetIntr = (UCHAR)0; //清中断
if(m_pEvent)
{
m_pEvent->Set();
}
return TRUE;
} |
|