阅读:898回复:0
请教UsbInterruptIn传输的问题
我仿照EZUsb驱动程序自己写了一个ISP1581板的InterruptIn传输的驱动程序。想实现驱动程序对USB的InterruptIn的循环读取。程序部分如下:
在头文件中声明: MEMBER_COMPLETEIRPWITHCONTEXT( INT_COMPLETION_INFO, InterruptTransferComplete ) #ifdef _COMMENT_ONLY // The following member functions are actually defined by the // a DEVMEMBER_xxx or MEMBER_xxx macro (such as DEVMEMBER_DISPATCHERS). // The macro __COMMENT_ONLY never gets defined. These comment-only // definitions simply allow easy navigation to the functions within // the Developer Studio using the class browser. NTSTATUS __stdcall InterruptTransferComplete(KIrp I, PINT_COMPLETION_INFO pContext); // COMMENT_ONLY #endif 在.cpp文件中有代码: NTSTATUS KUsbInterruptTransfer::StartPolling( PVOID Buffer, ULONG Length, USB_INTERRUPT_CALLBACK pfnOnInterrupt, PVOID pClientContext ) { ASSERT( m_InterruptPipe->IsOpen() ); if( ! m_InterruptPipe->IsOpen() ) { return STATUS_INVALID_DEVICE_STATE; } // allocate a new context structure PINT_COMPLETION_INFO pCompInfo = new (NonPagedPool) INT_COMPLETION_INFO; // make sure it succeeded if( NULL == pCompInfo ) { return STATUS_INSUFFICIENT_RESOURCES; } // initialize the context structure pCompInfo->m_pClass = this; pCompInfo->m_pfnOnInterrupt = pfnOnInterrupt; pCompInfo->m_pClientContext = pClientContext; m_InterruptPipe->BuildInterruptTransfer( Buffer, Length, m_bShortOk, NULL, m_pIntUrb ); pCompInfo->m_pUrb = m_pIntUrb; NTSTATUS status; status = m_InterruptPipe->SubmitUrb( m_KIrp, m_pIntUrb, LinkTo(InterruptTransferComplete), pCompInfo, 300 ); return status; } 也写了InterruptTransferComplete()函数(与EZUSB基本相同,是完成循环的循环体。只是在开始的地方加了个Pending判断) 问题是:用SoftICE跟踪,程序执行进入StartPolling,执行SubmitUrb后(结果为0x103,我记得好像是Pending)它直接就返回了,而不是进入到InterruptTransferComplete函数。不知什么原因。 另外,当拔下USB连接线时,会进入到InterruptTransferComplete()函数,好像是在开始的时候InterruptIn请求并未结束,所以未能进入到InterruptTransferComplete()。但我已设了超时了呀(EZUSB原来的程序中是没有的)? 希望哪位大侠能告诉我。谢谢。 [编辑 - 8/1/04 by metalwing] |
|
|