阅读:973回复:0
请教Usb中断管道驱动的问题!
下面是我用DriverWorks写的驱动,由StartPolling开始循检中断端点,间隔1s。但执行一
断时间(200多次,间隔时间小的话很快就停了)之后就停了,没有执行完成例程。 DriverMonitor显示Polling Again, usb设备端因为ep1的数据没被取走,不会更新fifo里的数据。 请有经验的大侠指点一下。 void MyDevice::StartPolling(void) { m_Endpoint1IN.BuildInterruptTransfer( pIntBuff, IntBuffLen, TRUE, NULL, m_pIntUrb ); 初始化URB m_kTimer->Set(-1000000,LinkTo(TimedCallback),this); //启动定时器,1s } void MyDevice::StopPolling(void) { m_kTimer->Cancel(); InterlockedExchange(&m_lStopRequested, 1); //设置标志,停止查询中断端点 if( INTERLOCKED_COMPARE_EXCHANGE(&m_lPolling, 1, 1) ) IoCancelIrp(m_KIrp); } VOID MyDevice::TimedCallback(PVOID arg1, PVOID arg2) { if(1 != INTERLOCKED_COMPARE_EXCHANGE(&m_lStopRequested, 1, 1)&& 1 != INTERLOCKED_COMPARE_EXCHANGE(&m_lPolling, 1, 1)) { t << "Polling Againn"; m_Endpoint1IN.SubmitUrb( m_KIrp, m_pIntUrb, LinkTo(IntTransferComplete), this ); //发送Urb,记取数据 InterlockedExchange(&m_lPolling, 1); //设置标志,表示正在查询 } } NTSTATUS MyDevice::IntTransferComplete(KIrp I) //完成例程 { m_kTimer->Cancel(); InterlockedExchange(&m_lPolling, 0); if(1 != INTERLOCKED_COMPARE_EXCHANGE(&m_lStopRequested, 1, 1)) { m_Endpoint1IN.BuildInterruptTransfer( pIntBuff, IntBuffLen, TRUE, NULL, m_pIntUrb ); //重新初始化Urb m_KIrp.Reuse(); //重用Irp m_kTimer->Set(-1000000,LinkTo(TimedCallback),this); //1s = -10000000 } return STATUS_MORE_PROCESSING_REQUIRED; } |
|