阅读:1404回复:2
关于威盛南桥VT8237A芯片组在USB方面存在的问题,有高手遇到过吗?
最近发现有一个问题,我们公司的USB 产品在威盛南桥芯片组VT8237A的主板机器上,Windows XP平台下,发了Bulk request后,再发Veder Request后,就没有response了,一直都是Pending,不清楚USB bus上发生了什么事情,或者USB host出了什么错???这个时候用BusHound,发Control的Reset Pipe后,就可以Work了。
但是,在同样VT8273A主板的Vista系统下,可以正常工作(可能是因为Vista下微软的USB host 驱动作了改进)。 另外,我们的产品在Intel芯片组的主板,Windows xp, Vista下,也是可以正常工作的。 我用别的公司的同类型产品,用BusHound发现,它在Buik传送起来前,做了SET INTERFACE, SELECT INTERFACE, RESET PIPE,RESET PIPE动作。但我在我的drivre里面,没有做类似的动作。 所以现在有2个问题,请教各位。 1.在Windows XP平台下,发了Bulk request后,再发Veder Request后,就没有response了,一直都是Pending,不清楚USB bus上发生了什么事情,或者USB host出了什么错??? 2. USB的client端驱动看不到端点0,拿不到Control pipe的handle,所以有什么办法做Reset control pipe?曾经有高人说用Control transfer 发 CLEAR FEATURE,我试过,貌似不行。 |
|
|
沙发#
发布于:2007-08-20 17:00
一下是我的Build Bulk request 代码
PURB UsbPipe_BuildBulkRequest( PVOID pBuffer, ULONG nBufferLength, BOOLEAN bIn, BOOLEAN bShortOk, PURB pUrb ) { PURB Urb=NULL; USHORT UrbSize; ULONG Flags; UrbSize= sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER); if (pUrb == NULL) { Urb=(PURB) new (NON_PAGED_POOL) _URB_BULK_OR_INTERRUPT_TRANSFER; } else { Urb = pUrb; } if(Urb==NULL) return Urb; if (bIn) { Flags = USBD_TRANSFER_DIRECTION_IN; if (bShortOk) Flags |= USBD_SHORT_TRANSFER_OK; } else { Flags = 0; }//build our urb for USBD UsbBuildInterruptOrBulkTransferRequest(Urb, UrbSize, m_pUsbInterface->Pipes[0].PipeHandle,//pipeHandle->PipeHandle, pBuffer, NULL, nBufferLength, Flags, NULL); Urb->UrbHeader.Status = 0; // return Urb; } NTSTATUS USBD_SubmitIrpWithRoutine( PIRP Irp, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID pContext ) { IoSetCompletionRoutine(Irp, CompletionRoutine, pContext, TRUE, TRUE, TRUE); // Pass the IRP/URB to USBD return(IoCallDriver(m_pTopDeviceObject,Irp)); } NTSTATUS UsbPipe_DispatchBulkInIrp( PVOID pBuffer, ULONG nBufferLength, PIO_COMPLETION_ROUTINE CompletionRoutine, PUSB_STREAM_OBJECT pStreamObject ) { NTSTATUS ntStatus=STATUS_SUCCESS; if(m_bIsDeviceRemoved) { // return STATUS_DEVICE_NOT_CONNECTED; } PIRP_PENDING_CONTEXT pContext=new (NON_PAGED_POOL) IRP_PENDING_CONTEXT; if(!pContext) { DbgMsg(("@@@Warning:failed to alloc mem for pending Irp!\n")); return STATUS_INSUFFICIENT_RESOURCES; } RtlZeroMemory(pContext,sizeof(IRP_PENDING_CONTEXT)); //allocate Urb PURB pUrb=UsbPipe_BuildBulkRequest( pBuffer, nBufferLength, TRUE, TRUE, NULL ); if(!pUrb) { DbgMsg(("@@@Warning:failed to alloc mem for Urb!\n")); delete pContext; return STATUS_INSUFFICIENT_RESOURCES; } // PIRP pIrp= IoAllocateIrp(m_pTopDeviceObject->StackSize, FALSE); if(pIrp == NULL) { DbgMsg(("@@@Warning:failed to alloc mem for irp!\n")); delete pContext; delete pUrb; return STATUS_INSUFFICIENT_RESOURCES; } pContext->pIrp=pIrp; pContext->pUrb=pUrb; pContext->pStreamObject=pStreamObject; pContext->pBuffer=(PUCHAR)pBuffer; pContext->dwActualCount=0; pContext->dwBufSize=nBufferLength; pContext->pStreamObject->pPendingIrpArray[pStreamObject->dwPendingIrps]=pIrp; pContext->nIrpIndex=pStreamObject->dwPendingIrps; pContext->bIsPending=TRUE; // InterlockedIncrement(&pStreamObject->dwPendingIrps); // PIO_STACK_LOCATION pNextStack; pNextStack = IoGetNextIrpStackLocation(pIrp); // // pass the URB to the USB driver stack // // Setup Irp pNextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; pNextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; pNextStack->Parameters.Others.Argument1 = pUrb; ntStatus=USBD_SubmitIrpWithRoutine(pIrp,CompletionRoutine,pContext); return ntStatus; } |
|
|
板凳#
发布于:2007-08-22 09:50
好贴,这个是DriverStudio做的吧.
|
|