| 
 | 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 
×
 
[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; 
     
} |   
 
 
 
 |