阅读:1473回复:7
DS3.1开发驱程,BULK读无法完成。20分请教
我用DS3.1开发驱程,试验板是周立功的“SMART EVALUATION BOARD",端点2BULK写的部分成功,但读的部分却不行。BULK读程序如下,请高手们指导一下。
NTSTATUS NewDevice::Read(KIrp I) { if (I.IoctlBuffer() == 0) { I.Information() = 0; return I.PnpComplete(this, STATUS_SUCCESS); } PUCHAR pBuffer = (PUCHAR)I.IoctlBuffer(); ULONG dwTotalSize = I.IoctlOutputBufferSize(); ULONG dwMaxSize = m_Endpoint2IN.MaximumTransferSize(); KMemory Mem(pBuffer, dwTotalSize); Mem.SetPageArray(); if (dwTotalSize > dwMaxSize) { ASSERT(dwMaxSize); dwTotalSize = dwMaxSize; } USB_COMPLETION_INFO* pCompInfo = new (NonPagedPool) USB_COMPLETION_INFO; if (pCompInfo == NULL) { I.Information() = 0; return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES); } PURB pUrb = m_Endpoint2IN.BuildBulkTransfer( Mem, // Where is data coming from? dwTotalSize, // How much data to read? TRUE, // direction (TRUE = IN) NULL, // Link to next URB TRUE // Allow a short transfer ); if (pUrb == NULL) { delete pCompInfo; I.Information() = 0; return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES); } t << "pUrb is ok, " << I << EOL; // Initialize context structure pCompInfo->m_pClass = this; pCompInfo->m_pUrb = pUrb; // Submit the URB to our USB device NTSTATUS status; status = m_Endpoint2IN.SubmitUrb(I, pUrb, LinkTo(ReadComplete), pCompInfo, 0); t << "pUrb is SubmitUrb, " << I << EOL; return status; } 用DRIVERMONITOR看出,此段代码执行完毕,但却没执行ReadComplete()部分,亦即例程没返回。 |
|
沙发#
发布于:2004-11-21 22:55
周立功的固件在读BULK前必须先发一个控制命令,控制命令详见固件程序。
|
|
板凳#
发布于:2004-11-22 10:55
周立功的固件在读BULK前必须先发一个控制命令,控制命令详见固件程序。 非常感谢。不过能不能直接给个控制命令啊。 |
|
地板#
发布于:2004-11-24 20:37
用Windows应用接口DeviceIoControl给控制端点发送控制命令,其参数详见其主机应用程序 。
|
|
地下室#
发布于:2004-11-24 21:59
写出
ULONG dwTotalSize = I.IoctlOutputBufferSize(); 读入 ULONG dwTotalSize = I.IoctlInputBufferSize(); :D |
|
5楼#
发布于:2004-11-26 13:47
用Windows应用接口DeviceIoControl给控制端点发送控制命令,其参数详见其主机应用程序 。 我也知道使用DeviceIoControl来发送控制命令啊,但我的问题时出在驱程上啊。周立功的程序不是用DS做的,看都看不懂。高手能不能把驱程部分的BULK读代码给贴一下啊。 |
|
6楼#
发布于:2004-11-26 14:16
没有调用Complete,说明request没有完成
你的硬件部分是不是没有给它放数据,然后允许驱动读取 |
|
|
7楼#
发布于:2004-11-26 17:01
我的处理过程是这样的:
1,驱动程序通过输出端点固件发送一串特定的数据(自定义命令); 2,固件设备接收到命令后,根据要求将驱动程序要的数据写到相应端点上; 3,驱动程序通过输入端点得到数据。 |
|