阅读:1007回复:1
usb中断通道驱动!
下面是我写的点驱动,由StartPolling开始循检中断端点,间隔1s。但执行一断时间(200多次,间隔时间小的话很快就停了)之后就停了,没有执行完成例程。
DriverMonitor显示Polling Again, usb设备端因为ep1的数据没被取走,不会更新fifo里的数据。 请有经验的大侠指点一下。 void MyDevice::StartPolling(void) { m_Endpoint1IN.BuildInterruptTransfer( pIntBuff, IntBuffLen, TRUE, NULL, m_pIntUrb ); 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 ); 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 ); m_KIrp.Reuse(); m_kTimer->Set(-1000000,LinkTo(TimedCallback),this); //1s = -10000000 } return STATUS_MORE_PROCESSING_REQUIRED; } [编辑 - 9/15/04 by ysoni] [编辑 - 9/15/04 by ysoni] |
|
沙发#
发布于:2004-09-16 08:24
难道没人愿意帮忙指点一下?
|
|